2 #include <cgreen/cgreen.h>
3 #include <freeradius/libradius.h>
4 #include "radsec/radsec.h"
5 #include "radsec/request.h"
8 #define true 1 /* FIXME: Bug report cgreen. */
11 #define FREERADIUS_DICT "/usr/share/freeradius/dictionary"
14 authenticate (struct rs_connection *conn, const char *user, const char *pw)
16 struct rs_request *req;
17 struct rs_packet *msg, *resp;
19 assert_true (rs_request_create (conn, &req) == 0);
20 assert_true (rs_packet_create_auth_request (conn, &msg, user, pw) == 0);
21 assert_true (rs_request_send (req, msg, &resp) == 0);
22 //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
23 assert_true (rs_packet_frpkt (resp)->code == PW_AUTHENTICATION_ACK);
25 rs_request_destroy(req);
29 send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
31 struct rs_packet *msg0, *msg1;
33 assert_true (rs_packet_create_auth_request (conn, &msg0, NULL, NULL) == 0);
34 assert_true (rs_packet_create_auth_request (conn, &msg1, NULL, NULL) == 0);
35 assert_true (rs_packet_send (msg0, NULL) == 0);
36 assert_true (rs_packet_send (msg1, NULL) == 0);
40 send_large_packet (struct rs_connection *conn)
42 struct rs_packet *msg0;
43 struct rs_attr *attr_x;
48 assert_true (buf != NULL);
49 memset (buf, 0, 4096);
51 assert_true (rs_packet_create (conn, &msg0) == 0);
52 /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
53 for (f = 0; f < 15; f++)
55 memset (buf, 'a' + f, 252);
56 rs_attr_create (conn, &attr_x, "EAP-Message", buf);
57 rs_packet_add_attr (msg0, attr_x);
59 assert_true (rs_packet_send (msg0, NULL) == 0);
62 /* ************************************************************ */
73 struct rs_context *ctx;
74 struct rs_connection *conn;
76 setup.config_file = "test.conf";
77 setup.config_name = "test-udp-auth";
78 setup.username = "molgan";
79 setup.pw = "password";
81 assert_true (rs_context_create (&ctx, FREERADIUS_DICT) == 0);
82 assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
83 assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
85 authenticate (conn, setup.username, setup.pw);
87 rs_conn_destroy (conn);
88 rs_context_destroy (ctx);
92 test_buffering_cb (const uint8_t *buf, ssize_t len)
94 /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
99 assert_true (len >= 20);
100 assert_true (len <= 4096);
101 assert_true ((buf[2] << 8) + buf[3] == len);
108 struct rs_context *ctx;
109 struct rs_connection *conn;
110 struct timeval timeout;
111 struct polldata *polldata;
113 assert_true (rs_context_create (&ctx, FREERADIUS_DICT) == 0);
114 assert_true (rs_context_read_config (ctx, "test.conf") == 0);
115 assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
118 timeout.tv_usec = 150000;
119 polldata = udp_server ("11820", &timeout, test_buffering_cb);
120 assert_true (polldata != NULL);
122 send_more_than_one_msg_in_one_packet (conn);
123 assert_true (udp_poll (polldata) > 0);
124 assert_true (udp_poll (polldata) > 0);
126 send_large_packet (conn);
127 assert_true (udp_poll (polldata) > 0);
129 udp_free_polldata (polldata);
130 rs_conn_destroy (conn);
131 rs_context_destroy (ctx);
134 /* ************************************************************ */
136 setup_auth (TestSuite *ts)
138 add_test (ts, test_auth);
142 setup_buffering (TestSuite *ts)
144 add_test (ts, test_buffering);
148 main (int argc, char *argv[])
150 TestSuite *ts = create_test_suite ();
153 setup_buffering (ts);
156 return run_single_test (ts, argv[1], create_text_reporter ());
158 return run_test_suite (ts, create_text_reporter ());