summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorlinus <linus@nordu.net>2011-01-21 16:32:28 +0100
committerlinus <linus@nordu.net>2011-01-21 16:32:28 +0100
commitf58ce3d98a13e9c8d0930b54c5f593cbfa196d65 (patch)
treef20db3c05fa49c3b9ddad748b8a0b9dc6c79404f /lib
parent7b928a0509a668b99679a1bbedd189575fe71559 (diff)
Some more UDP tests.
Diffstat (limited to 'lib')
-rw-r--r--lib/tests/Makefile.am2
-rw-r--r--lib/tests/test-blocking.c64
-rw-r--r--lib/tests/test-udp.c115
-rw-r--r--lib/tests/test.conf24
-rw-r--r--lib/tests/udp-server.c19
-rw-r--r--lib/tests/udp.c29
-rw-r--r--lib/tests/udp.h4
7 files changed, 154 insertions, 103 deletions
diff --git a/lib/tests/Makefile.am b/lib/tests/Makefile.am
index 243719f..526dcdc 100644
--- a/lib/tests/Makefile.am
+++ b/lib/tests/Makefile.am
@@ -4,7 +4,7 @@ AM_CFLAGS = -Wall -g
bin_PROGRAMS = test-udp udp-server
-test_udp_SOURCES = test-udp.c
+test_udp_SOURCES = test-udp.c udp.c
test_udp_LDADD = ../libradsec.la -lcgreen -lm
udp_server_SOURCES = udp-server.c udp.c
diff --git a/lib/tests/test-blocking.c b/lib/tests/test-blocking.c
deleted file mode 100644
index e1f657b..0000000
--- a/lib/tests/test-blocking.c
+++ /dev/null
@@ -1,64 +0,0 @@
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "blocking.h"
-
-int
-f (const struct sockaddr *addr,
- socklen_t addrlen,
- int out_fd)
-{
- int fd = -1;
- //struct rs_alloc_scheme as = { calloc, malloc, free, realloc };
- struct rs_handle ctx = { RS_CONN_TYPE_TCP,
- { RS_CRED_NONE, NULL, NULL },
- { NULL, NULL, NULL, NULL } };
- struct rs_packet *p = NULL;
-
- fd = rs_connect (&ctx, addr, addrlen);
- if (fd < 0)
- {
- perror ("rs_connect");
- return -1;
- }
-
- p = next_packet (&ctx, fd);
- if (p == NULL)
- {
- perror ("next_packet");
- rs_disconnect (&ctx, fd);
- return -1;
- }
- rs_disconnect (&ctx, fd);
-
- if (send_packet (&ctx, out_fd, p))
- {
- rs_packet_free (&ctx, &p);
- perror ("send_packet");
- return -1;
- }
-
- return 0;
-}
-
-int
-main (int argc, char *argv[])
-{
- struct addrinfo *ai;
- int rc;
-
- rc = getaddrinfo (argv[1], argv[2], NULL, &ai);
- if (rc)
- {
- if (rc == EAI_SYSTEM)
- perror ("getaddrinfo");
- else
- fprintf (stderr, "getaddrinfo: %s\n", gai_strerror (rc));
- return -1;
- }
-
- return f (ai->ai_addr, ai->ai_addrlen, 1);
-}
diff --git a/lib/tests/test-udp.c b/lib/tests/test-udp.c
index 3ebbc96..7a6d996 100644
--- a/lib/tests/test-udp.c
+++ b/lib/tests/test-udp.c
@@ -3,13 +3,14 @@
#include <freeradius/libradius.h>
#include "radsec/radsec.h"
#include "radsec/request.h"
+#include "udp.h"
#define true 1 /* FIXME: Bug report cgreen. */
#define false 0
#define FREERADIUS_DICT "/usr/share/freeradius/dictionary"
-void
+static void
authenticate (struct rs_connection *conn, const char *user, const char *pw)
{
struct rs_request *req;
@@ -18,22 +19,45 @@ authenticate (struct rs_connection *conn, const char *user, const char *pw)
assert_true (rs_request_create (conn, &req) == 0);
assert_true (rs_packet_create_auth_request (conn, &msg, user, pw) == 0);
assert_true (rs_request_send (req, msg, &resp) == 0);
+ //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
assert_true (rs_packet_frpkt (resp)->code == PW_AUTHENTICATION_ACK);
rs_request_destroy(req);
}
-#if 0
-int
-send_more_than_one_msg_in_one_packet (const char *server)
+static void
+send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
{
- struct rs_request *req;
- struct rs_packet *msg, *resp;
-
+ struct rs_packet *msg0, *msg1;
+ assert_true (rs_packet_create_auth_request (conn, &msg0, NULL, NULL) == 0);
+ assert_true (rs_packet_create_auth_request (conn, &msg1, NULL, NULL) == 0);
+ assert_true (rs_packet_send (msg0, NULL) == 0);
+ assert_true (rs_packet_send (msg1, NULL) == 0);
+}
+static void
+send_large_packet (struct rs_connection *conn)
+{
+ struct rs_packet *msg0;
+ struct rs_attr *attr_x;
+ char *buf;
+ int f;
+
+ buf = malloc (4096);
+ assert_true (buf != NULL);
+ memset (buf, 0, 4096);
+
+ assert_true (rs_packet_create (conn, &msg0) == 0);
+ /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
+ for (f = 0; f < 15; f++)
+ {
+ memset (buf, 'a' + f, 252);
+ rs_attr_create (conn, &attr_x, "EAP-Message", buf);
+ rs_packet_add_attr (msg0, attr_x);
+ }
+ assert_true (rs_packet_send (msg0, NULL) == 0);
}
-#endif
/* ************************************************************ */
static struct setup {
@@ -43,12 +67,17 @@ static struct setup {
char *pw;
} setup;
-void
+static void
test_auth ()
{
struct rs_context *ctx;
struct rs_connection *conn;
+ setup.config_file = "test.conf";
+ setup.config_name = "test-udp-auth";
+ setup.username = "molgan";
+ setup.pw = "password";
+
assert_true (rs_context_create (&ctx, FREERADIUS_DICT) == 0);
assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
@@ -59,15 +88,60 @@ test_auth ()
rs_context_destroy (ctx);
}
-int
-test_udp (int argc, char *argv[], TestSuite *ts)
+static ssize_t
+test_buffering_cb (const uint8_t *buf, ssize_t len)
{
- add_test (ts, test_auth);
+ /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
+ [RFC 2865]*/
+#if 1
+ hd (buf, len);
+#endif
+ assert_true (len >= 20);
+ assert_true (len <= 4096);
+ assert_true ((buf[2] << 8) + buf[3] == len);
+ return len;
+}
- if (argc > 1)
- return run_single_test (ts, argv[1], create_text_reporter ());
+static void
+test_buffering ()
+{
+ struct rs_context *ctx;
+ struct rs_connection *conn;
+ struct timeval timeout;
+ struct polldata *polldata;
- return run_test_suite (ts, create_text_reporter ());
+ assert_true (rs_context_create (&ctx, FREERADIUS_DICT) == 0);
+ assert_true (rs_context_read_config (ctx, "test.conf") == 0);
+ assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 150000;
+ polldata = udp_server ("11820", &timeout, test_buffering_cb);
+ assert_true (polldata != NULL);
+
+ send_more_than_one_msg_in_one_packet (conn);
+ assert_true (udp_poll (polldata) > 0);
+ assert_true (udp_poll (polldata) > 0);
+
+ send_large_packet (conn);
+ assert_true (udp_poll (polldata) > 0);
+
+ udp_free_polldata (polldata);
+ rs_conn_destroy (conn);
+ rs_context_destroy (ctx);
+}
+
+/* ************************************************************ */
+static void
+setup_auth (TestSuite *ts)
+{
+ add_test (ts, test_auth);
+}
+
+static void
+setup_buffering (TestSuite *ts)
+{
+ add_test (ts, test_buffering);
}
int
@@ -75,10 +149,11 @@ main (int argc, char *argv[])
{
TestSuite *ts = create_test_suite ();
- setup.config_file = "test.conf";
- setup.config_name = "test-udp";
- setup.username = "molgan";
- setup.pw = "password";
+ setup_auth (ts);
+ setup_buffering (ts);
- return test_udp (argc, argv, ts);
+ if (argc > 1)
+ return run_single_test (ts, argv[1], create_text_reporter ());
+ else
+ return run_test_suite (ts, create_text_reporter ());
}
diff --git a/lib/tests/test.conf b/lib/tests/test.conf
index 2f65a80..9be968d 100644
--- a/lib/tests/test.conf
+++ b/lib/tests/test.conf
@@ -1,4 +1,4 @@
-config test-udp {
+config test-udp-auth {
type = "UDP"
server {
hostname = "localhost"
@@ -6,3 +6,25 @@ config test-udp {
secret = "sikrit"
}
}
+
+config test-udp-buffering {
+ type = "UDP"
+ server {
+ hostname = "localhost"
+ service = "11820"
+ secret = "sikrit"
+ }
+}
+
+config test-tls-test {
+ type = "TLS"
+ cacertfile = "/home/linus/nordberg-ca.crt"
+ certfile = "/home/linus/p/radsecproxy/src/maatuska.nordberg.se.crt"
+ certkeyfile = "/home/linus/p/radsecproxy/src/maatuska.nordberg.se.key"
+
+ server {
+ hostname = "localhost"
+ service = "1820"
+ secret = "sikrit"
+ }
+}
diff --git a/lib/tests/udp-server.c b/lib/tests/udp-server.c
index 768fba0..ce0136a 100644
--- a/lib/tests/udp-server.c
+++ b/lib/tests/udp-server.c
@@ -5,17 +5,7 @@
ssize_t
handle_data (const uint8_t *buf, ssize_t len)
{
- int i;
-
- printf ("# len: %ld\n", len);
- for (i = 0; i < len; i++)
- {
- printf ("%02x%s", buf[i], (i+1) % 8 ? " " : " ");
- if ((i + 1) % 16 == 0)
- printf ("\n");
- }
- printf ("\n");
- return len;
+ return hd (buf, len);
}
int
@@ -37,11 +27,6 @@ main (int argc, char *argv[])
tv.tv_sec, tv.tv_sec > 1 ? "s" : "");
}
- if (data)
- {
- if (data->timeout)
- free (data->timeout);
- free (data);
- }
+ udp_free_polldata (data);
return (n <= 0);
}
diff --git a/lib/tests/udp.c b/lib/tests/udp.c
index 184325e..a29880a 100644
--- a/lib/tests/udp.c
+++ b/lib/tests/udp.c
@@ -40,6 +40,19 @@ _resolve (const char *str)
return rp;
}
+void
+udp_free_polldata (struct polldata *data)
+{
+ if (data)
+ {
+ if (data->timeout)
+ free (data->timeout);
+ free (data);
+ }
+}
+
+/* @return if select() returns error or timeout, return select()
+ else return value from invoked callback function */
ssize_t
udp_poll (struct polldata *data)
{
@@ -106,3 +119,19 @@ udp_server (const char *bindto, struct timeval *timeout, data_cb cb)
return NULL;
}
+
+ssize_t
+hd (const uint8_t *buf, ssize_t len)
+{
+ int i;
+
+ printf ("# len: %ld\n", len);
+ for (i = 0; i < len; i++)
+ {
+ printf ("%02x%s", buf[i], (i+1) % 8 ? " " : " ");
+ if ((i + 1) % 16 == 0)
+ printf ("\n");
+ }
+ printf ("\n");
+ return len;
+}
diff --git a/lib/tests/udp.h b/lib/tests/udp.h
index 02e1b50..004b7ca 100644
--- a/lib/tests/udp.h
+++ b/lib/tests/udp.h
@@ -3,6 +3,7 @@
#include <sys/time.h>
typedef ssize_t (*data_cb) (const uint8_t *buf, ssize_t len);
+
struct polldata {
int s;
data_cb cb;
@@ -11,3 +12,6 @@ struct polldata {
struct polldata *udp_server (const char *bindto, struct timeval *timeout, data_cb cb);
ssize_t udp_poll (struct polldata *data);
+void udp_free_polldata (struct polldata *data);
+
+ssize_t hd (const uint8_t *buf, ssize_t len);