Disable some debug printout in tests.
[libradsec.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 #define FREERADIUS_DICT "/usr/share/freeradius/dictionary"
12
13 static void
14 authenticate (struct rs_connection *conn, const char *user, const char *pw)
15 {
16   struct rs_request *req;
17   struct rs_packet *msg, *resp;
18
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);
24
25   rs_request_destroy(req);
26 }
27
28 static void
29 send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
30 {
31   struct rs_packet *msg0, *msg1;
32
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);
37 }
38
39 static void
40 send_large_packet (struct rs_connection *conn)
41 {
42   struct rs_packet *msg0;
43   struct rs_attr *attr_x;
44   char *buf;
45   int f;
46
47   buf = malloc (4096);
48   assert_true (buf != NULL);
49   memset (buf, 0, 4096);
50
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++)
54     {
55       memset (buf, 'a' + f, 252);
56       rs_attr_create (conn, &attr_x, "EAP-Message", buf);
57       rs_packet_add_attr (msg0, attr_x);
58     }
59   assert_true (rs_packet_send (msg0, NULL) == 0);
60 }
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";
79   setup.pw = "password";
80
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);
84
85   authenticate (conn, setup.username, setup.pw);
86
87   rs_conn_destroy (conn);
88   rs_context_destroy (ctx);
89 }
90
91 static ssize_t
92 test_buffering_cb (const uint8_t *buf, ssize_t len)
93 {
94   /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
95      [RFC 2865]*/
96 #if 0
97   hd (buf, len);
98 #endif
99   assert_true (len >= 20);
100   assert_true (len <= 4096);
101   assert_true ((buf[2] << 8) +  buf[3] == len);
102   return len;
103 }
104
105 static void
106 test_buffering ()
107 {
108   struct rs_context *ctx;
109   struct rs_connection *conn;
110   struct timeval timeout;
111   struct polldata *polldata;
112
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);
116
117   timeout.tv_sec = 0;
118   timeout.tv_usec = 150000;
119   polldata = udp_server ("11820", &timeout, test_buffering_cb);
120   assert_true (polldata != NULL);
121
122   send_more_than_one_msg_in_one_packet (conn);
123   assert_true (udp_poll (polldata) > 0);
124   assert_true (udp_poll (polldata) > 0);
125
126   send_large_packet (conn);
127   assert_true (udp_poll (polldata) > 0);
128
129   udp_free_polldata (polldata);
130   rs_conn_destroy (conn);
131   rs_context_destroy (ctx);
132 }
133
134 /* ************************************************************ */
135 static void
136 setup_auth (TestSuite *ts)
137 {
138   add_test (ts, test_auth);
139 }
140
141 static void
142 setup_buffering (TestSuite *ts)
143 {
144   add_test (ts, test_buffering);
145 }
146
147 int
148 main (int argc, char *argv[])
149 {
150   TestSuite *ts = create_test_suite ();
151
152   setup_auth (ts);
153   setup_buffering (ts);
154
155   if (argc > 1)
156     return run_single_test (ts, argv[1], create_text_reporter ());
157   else
158     return run_test_suite (ts, create_text_reporter ());
159 }