Merge libradsec-new-client.
[libradsec.git] / lib / tests / test-udp.c
1 #include <stdlib.h>
2 #include <cgreen/cgreen.h>
3 #include "radsec/radsec.h"
4 #include "radsec/request.h"
5 #include "udp.h"
6
7 #define true 1                  /* FIXME: Bug report cgreen.  */
8 #define false 0
9
10 static void
11 authenticate (struct rs_connection *conn, const char *user, const char *pw)
12 {
13   struct rs_request *req;
14   struct rs_packet *msg, *resp;
15
16   assert_true (rs_request_create (conn, &req) == 0);
17   assert_true (rs_packet_create_authn_request (conn, &msg, user, pw) == 0);
18   rs_request_add_reqpkt (req, msg);
19   assert_true (rs_request_send (req, &resp) == 0);
20   //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
21   assert_true (rs_packet_code(resp) == PW_ACCESS_ACCEPT);
22
23   rs_request_destroy (req);
24 }
25
26 static void
27 send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
28 {
29   struct rs_packet *msg0, *msg1;
30
31   assert_true (rs_packet_create_authn_request (conn, &msg0, NULL, NULL) == 0);
32   assert_true (rs_packet_create_authn_request (conn, &msg1, NULL, NULL) == 0);
33   assert_true (rs_packet_send (msg0, NULL) == 0);
34   assert_true (rs_packet_send (msg1, NULL) == 0);
35 }
36
37 #if 0
38 static void
39 send_large_packet (struct rs_connection *conn)
40 {
41   struct rs_packet *msg0;
42   struct radius_packet *frpkt = NULL;
43   char *buf;
44   int f;
45
46   buf = malloc (RS_MAX_PACKET_LEN);
47   assert_true (buf != NULL);
48   memset (buf, 0, RS_MAX_PACKET_LEN);
49
50   assert_true (rs_packet_create (conn, &msg0) == 0);
51   /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
52   for (f = 0; f < 15; f++)
53     {
54       memset (buf, 'a' + f, 252);
55       //vp = pairmake ("EAP-Message", buf, T_OP_EQ);
56       assert_true (rs_packet_append_avp (msg0, fixme...) == RSE_OK);
57     }
58   assert_true (rs_packet_send (msg0, NULL) == 0);
59 }
60 #endif  /* 0 */
61
62 /* ************************************************************ */
63 static struct setup {
64   char *config_file;
65   char *config_name;
66   char *username;
67   char *pw;
68 } setup;
69
70 static void
71 test_auth ()
72 {
73   struct rs_context *ctx;
74   struct rs_connection *conn;
75
76   setup.config_file = "test.conf";
77   setup.config_name = "test-udp-auth";
78   setup.username = "molgan@PROJECT-MOONSHOT.ORG";
79   setup.pw = "password";
80
81   assert_true (rs_context_create (&ctx) == 0);
82   assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
83   assert_true (rs_context_init_freeradius_dict (ctx, NULL) == 0);
84   assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
85
86   authenticate (conn, setup.username, setup.pw);
87
88   rs_conn_destroy (conn);
89   rs_context_destroy (ctx);
90 }
91
92 static ssize_t
93 test_buffering_cb (const uint8_t *buf, ssize_t len)
94 {
95   /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
96      [RFC 2865]*/
97 #if 0
98   hd (buf, len);
99 #endif
100   assert_true (len >= 20);
101   assert_true (len <= RS_MAX_PACKET_LEN);
102   assert_true ((buf[2] << 8) +  buf[3] == len);
103   return len;
104 }
105
106 static void
107 test_buffering ()
108 {
109   struct rs_context *ctx;
110   struct rs_connection *conn;
111   struct timeval timeout;
112   struct polldata *polldata;
113
114   assert_true (rs_context_create (&ctx) == 0);
115   assert_true (rs_context_read_config (ctx, "test.conf") == 0);
116   assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
117
118   timeout.tv_sec = 0;
119   timeout.tv_usec = 150000;
120   polldata = udp_server ("11820", &timeout, test_buffering_cb);
121   assert_true (polldata != NULL);
122
123   send_more_than_one_msg_in_one_packet (conn);
124   assert_true (udp_poll (polldata) > 0);
125   assert_true (udp_poll (polldata) > 0);
126
127 #if 0
128 "
129 send_large_packet() disabled, it's hanging after
130
131 Sending Access-Request of id 1 to (null) port 0
132         Message-Authenticator = 0x00000000000000000000000000000000
133 packet_do_send: about to send this to localhost:11820:
134         Code: 1, Identifier: 1, Lenght: 38
135 rs_packet_send: entering event loop
136 _evcb: fd=5 what = WRITE
137 rs_packet_send: event loop done
138 "
139   send_large_packet (conn);
140   assert_true (udp_poll (polldata) > 0);
141 #endif  /* 0 */
142
143   udp_free_polldata (polldata);
144   rs_conn_destroy (conn);
145   rs_context_destroy (ctx);
146 }
147
148 /* ************************************************************ */
149 static void
150 setup_auth (TestSuite *ts)
151 {
152   add_test (ts, test_auth);
153 }
154
155 static void
156 setup_buffering (TestSuite *ts)
157 {
158   add_test (ts, test_buffering);
159 }
160
161 int
162 main (int argc, char *argv[])
163 {
164   TestSuite *ts = create_test_suite ();
165
166   setup_auth (ts);
167   setup_buffering (ts);
168
169   if (argc > 1)
170     return run_single_test (ts, argv[1], create_text_reporter ());
171   else
172     return run_test_suite (ts, create_text_reporter ());
173 }