diff options
author | linus <linus@nordu.net> | 2011-01-21 16:32:28 +0100 |
---|---|---|
committer | linus <linus@nordu.net> | 2011-01-21 16:32:28 +0100 |
commit | f58ce3d98a13e9c8d0930b54c5f593cbfa196d65 (patch) | |
tree | f20db3c05fa49c3b9ddad748b8a0b9dc6c79404f /lib/tests/test-udp.c | |
parent | 7b928a0509a668b99679a1bbedd189575fe71559 (diff) |
Some more UDP tests.
Diffstat (limited to 'lib/tests/test-udp.c')
-rw-r--r-- | lib/tests/test-udp.c | 115 |
1 files changed, 95 insertions, 20 deletions
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 ()); } |