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. */
12 authenticate (struct rs_connection *conn, const char *user, const char *pw)
14 struct rs_request *req;
15 struct rs_packet *msg, *resp;
17 assert_true (rs_request_create (conn, &req) == 0);
18 assert_true (rs_packet_create_authn_request (conn, &msg, user, pw) == 0);
19 rs_request_add_reqpkt (req, msg);
20 assert_true (rs_request_send (req, &resp) == 0);
21 //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
22 assert_true (rs_packet_frpkt (resp)->code == PW_AUTHENTICATION_ACK);
24 rs_request_destroy (req);
28 send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
30 struct rs_packet *msg0, *msg1;
32 assert_true (rs_packet_create_authn_request (conn, &msg0, NULL, NULL) == 0);
33 assert_true (rs_packet_create_authn_request (conn, &msg1, NULL, NULL) == 0);
34 assert_true (rs_packet_send (msg0, NULL) == 0);
35 assert_true (rs_packet_send (msg1, NULL) == 0);
39 send_large_packet (struct rs_connection *conn)
41 struct rs_packet *msg0;
42 struct radius_packet *frpkt = NULL;
47 assert_true (buf != NULL);
48 memset (buf, 0, 4096);
50 assert_true (rs_packet_create (conn, &msg0) == 0);
51 frpkt = rs_packet_frpkt (msg0);
52 assert_true (frpkt != NULL);
53 /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
54 for (f = 0; f < 15; f++)
56 VALUE_PAIR *vp = NULL;
57 memset (buf, 'a' + f, 252);
58 vp = pairmake ("EAP-Message", buf, T_OP_EQ);
59 assert_true (vp != NULL);
60 pairadd (&frpkt->vps, vp);
62 assert_true (rs_packet_send (msg0, NULL) == 0);
65 /* ************************************************************ */
76 struct rs_context *ctx;
77 struct rs_connection *conn;
79 setup.config_file = "test.conf";
80 setup.config_name = "test-udp-auth";
81 setup.username = "molgan@PROJECT-MOONSHOT.ORG";
82 setup.pw = "password";
84 assert_true (rs_context_create (&ctx) == 0);
85 assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
86 assert_true (rs_context_init_freeradius_dict (ctx, NULL) == 0);
87 assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
89 authenticate (conn, setup.username, setup.pw);
91 rs_conn_destroy (conn);
92 rs_context_destroy (ctx);
96 test_buffering_cb (const uint8_t *buf, ssize_t len)
98 /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
103 assert_true (len >= 20);
104 assert_true (len <= 4096);
105 assert_true ((buf[2] << 8) + buf[3] == len);
112 struct rs_context *ctx;
113 struct rs_connection *conn;
114 struct timeval timeout;
115 struct polldata *polldata;
117 assert_true (rs_context_create (&ctx) == 0);
118 assert_true (rs_context_read_config (ctx, "test.conf") == 0);
119 assert_true (rs_context_init_freeradius_dict (ctx, NULL) == 0);
120 assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
123 timeout.tv_usec = 150000;
124 polldata = udp_server ("11820", &timeout, test_buffering_cb);
125 assert_true (polldata != NULL);
127 send_more_than_one_msg_in_one_packet (conn);
128 assert_true (udp_poll (polldata) > 0);
129 assert_true (udp_poll (polldata) > 0);
133 send_large_packet() disabled, it's hanging after
135 Sending Access-Request of id 1 to (null) port 0
136 Message-Authenticator = 0x00000000000000000000000000000000
137 packet_do_send: about to send this to localhost:11820:
138 Code: 1, Identifier: 1, Lenght: 38
139 rs_packet_send: entering event loop
140 _evcb: fd=5 what = WRITE
141 rs_packet_send: event loop done
143 send_large_packet (conn);
144 assert_true (udp_poll (polldata) > 0);
147 udp_free_polldata (polldata);
148 rs_conn_destroy (conn);
149 rs_context_destroy (ctx);
152 /* ************************************************************ */
154 setup_auth (TestSuite *ts)
156 add_test (ts, test_auth);
160 setup_buffering (TestSuite *ts)
162 add_test (ts, test_buffering);
166 main (int argc, char *argv[])
168 TestSuite *ts = create_test_suite ();
171 setup_buffering (ts);
174 return run_single_test (ts, argv[1], create_text_reporter ());
176 return run_test_suite (ts, create_text_reporter ());