Update copyright to JANET(UK)
[radsecproxy.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 static void
38 send_large_packet (struct rs_connection *conn)
39 {
40   struct rs_packet *msg0;
41   struct rs_attr *attr_x;
42   char *buf;
43   int f;
44
45   buf = malloc (RS_MAX_PACKET_LEN);
46   assert_true (buf != NULL);
47   memset (buf, 0, RS_MAX_PACKET_LEN);
48
49   assert_true (rs_packet_create (conn, &msg0) == 0);
50   /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
51   for (f = 0; f < 15; f++)
52     {
53       memset (buf, 'a' + f, 252);
54       rs_attr_create (conn, &attr_x, "EAP-Message", buf);
55       rs_packet_add_attr (msg0, attr_x);
56     }
57   assert_true (rs_packet_send (msg0, NULL) == 0);
58 }
59
60 /* ************************************************************ */
61 static struct setup {
62   char *config_file;
63   char *config_name;
64   char *username;
65   char *pw;
66 } setup;
67
68 static void
69 test_auth ()
70 {
71   struct rs_context *ctx;
72   struct rs_connection *conn;
73
74   setup.config_file = "test.conf";
75   setup.config_name = "test-udp-auth";
76   setup.username = "molgan";
77   setup.pw = "password";
78
79   assert_true (rs_context_create (&ctx, NULL) == 0);
80   assert_true (rs_context_read_config (ctx, setup.config_file) == 0);
81   assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0);
82
83   authenticate (conn, setup.username, setup.pw);
84
85   rs_conn_destroy (conn);
86   rs_context_destroy (ctx);
87 }
88
89 static ssize_t
90 test_buffering_cb (const uint8_t *buf, ssize_t len)
91 {
92   /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
93      [RFC 2865]*/
94 #if 0
95   hd (buf, len);
96 #endif
97   assert_true (len >= 20);
98   assert_true (len <= RS_MAX_PACKET_LEN);
99   assert_true ((buf[2] << 8) +  buf[3] == len);
100   return len;
101 }
102
103 static void
104 test_buffering ()
105 {
106   struct rs_context *ctx;
107   struct rs_connection *conn;
108   struct timeval timeout;
109   struct polldata *polldata;
110
111   assert_true (rs_context_create (&ctx, NULL) == 0);
112   assert_true (rs_context_read_config (ctx, "test.conf") == 0);
113   assert_true (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
114
115   timeout.tv_sec = 0;
116   timeout.tv_usec = 150000;
117   polldata = udp_server ("11820", &timeout, test_buffering_cb);
118   assert_true (polldata != NULL);
119
120   send_more_than_one_msg_in_one_packet (conn);
121   assert_true (udp_poll (polldata) > 0);
122   assert_true (udp_poll (polldata) > 0);
123
124   send_large_packet (conn);
125   assert_true (udp_poll (polldata) > 0);
126
127   udp_free_polldata (polldata);
128   rs_conn_destroy (conn);
129   rs_context_destroy (ctx);
130 }
131
132 /* ************************************************************ */
133 static void
134 setup_auth (TestSuite *ts)
135 {
136   add_test (ts, test_auth);
137 }
138
139 static void
140 setup_buffering (TestSuite *ts)
141 {
142   add_test (ts, test_buffering);
143 }
144
145 int
146 main (int argc, char *argv[])
147 {
148   TestSuite *ts = create_test_suite ();
149
150   setup_auth (ts);
151   setup_buffering (ts);
152
153   if (argc > 1)
154     return run_single_test (ts, argv[1], create_text_reporter ());
155   else
156     return run_test_suite (ts, create_text_reporter ());
157 }