port to new RADIUS client library
[radsecproxy.git] / lib / tests / test-udp.c
1 #include <stdlib.h>
2 #include <cgreen/cgreen.h>
3 #include <freeradius/libradius.h>
4 #include "radsec/radsec.h"
5 #include "radsec/request.h"
6 #include "udp.h"
7
8 #define true 1                  /* FIXME: Bug report cgreen.  */
9 #define false 0
10
11 static void
12 authenticate (struct rs_connection *conn, const char *user, const char *pw)
13 {
14   struct rs_request *req;
15   struct rs_packet *msg, *resp;
16
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_ACCESS_ACCEPT);
23
24   rs_request_destroy (req);
25 }
26
27 static void
28 send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
29 {
30   struct rs_packet *msg0, *msg1;
31
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);
36 }
37
38 static void
39 send_large_packet (struct rs_connection *conn)
40 {
41   struct rs_packet *msg0;
42   struct rs_attr *attr_x;
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       rs_attr_create (conn, &attr_x, "EAP-Message", buf);
56       rs_packet_add_attr (msg0, attr_x);
57     }
58   assert_true (rs_packet_send (msg0, NULL) == 0);
59 }
60
61 /* ************************************************************ */
62 static struct setup {
63   char *config_file;
64   char *config_name;
65   char *username;
66   char *pw;
67 } setup;
68
69 static void
70 test_auth ()
71 {
72   struct rs_context *ctx;
73   struct rs_connection *conn;
74
75   setup.config_file = "test.conf";
76   setup.config_name = "test-udp-auth";
77   setup.username = "molgan";
78   setup.pw = "password";
79
80   assert_true (rs_context_create (&ctx, NULL) == 0);
81   assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
82   assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
83
84   authenticate (conn, setup.username, setup.pw);
85
86   rs_conn_destroy (conn);
87   rs_context_destroy (ctx);
88 }
89
90 static ssize_t
91 test_buffering_cb (const uint8_t *buf, ssize_t len)
92 {
93   /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
94      [RFC 2865]*/
95 #if 0
96   hd (buf, len);
97 #endif
98   assert_true (len >= 20);
99   assert_true (len <= RS_MAX_PACKET_LEN);
100   assert_true ((buf[2] << 8) +  buf[3] == len);
101   return len;
102 }
103
104 static void
105 test_buffering ()
106 {
107   struct rs_context *ctx;
108   struct rs_connection *conn;
109   struct timeval timeout;
110   struct polldata *polldata;
111
112   assert_true (rs_context_create (&ctx, NULL) == 0);
113   assert_true (rs_context_read_config (ctx, "test.conf") == 0);
114   assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
115
116   timeout.tv_sec = 0;
117   timeout.tv_usec = 150000;
118   polldata = udp_server ("11820", &timeout, test_buffering_cb);
119   assert_true (polldata != NULL);
120
121   send_more_than_one_msg_in_one_packet (conn);
122   assert_true (udp_poll (polldata) > 0);
123   assert_true (udp_poll (polldata) > 0);
124
125   send_large_packet (conn);
126   assert_true (udp_poll (polldata) > 0);
127
128   udp_free_polldata (polldata);
129   rs_conn_destroy (conn);
130   rs_context_destroy (ctx);
131 }
132
133 /* ************************************************************ */
134 static void
135 setup_auth (TestSuite *ts)
136 {
137   add_test (ts, test_auth);
138 }
139
140 static void
141 setup_buffering (TestSuite *ts)
142 {
143   add_test (ts, test_buffering);
144 }
145
146 int
147 main (int argc, char *argv[])
148 {
149   TestSuite *ts = create_test_suite ();
150
151   setup_auth (ts);
152   setup_buffering (ts);
153
154   if (argc > 1)
155     return run_single_test (ts, argv[1], create_text_reporter ());
156   else
157     return run_test_suite (ts, create_text_reporter ());
158 }