7c2e73c305898cd608663bfac5efebd2d571dd61
[libradsec.git] / lib / tests / test-udp.c
1 /* Copyright 2011,2013, NORDUnet A/S. All rights reserved. */
2 /* See LICENSE for licensing information. */
3
4 #include <stdlib.h>
5 #include <assert.h>
6 #include <CUnit/Basic.h>
7 #include "radius/client.h"
8 #include "radsec/radsec.h"
9 #include "radsec/request.h"
10 #include "udp.h"
11
12 static void
13 authenticate (struct rs_connection *conn, const char *user, const char *pw)
14 {
15   struct rs_request *req;
16   struct rs_packet *msg, *resp;
17
18   CU_ASSERT (rs_request_create (conn, &req) == 0);
19   CU_ASSERT (!rs_packet_create_authn_request (conn, &msg, user, pw, "sikrit"));
20   rs_request_add_reqpkt (req, msg);
21   CU_ASSERT (rs_request_send (req, &resp) == 0);
22   //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
23   CU_ASSERT (rs_packet_code(resp) == PW_ACCESS_ACCEPT);
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   CU_ASSERT (rs_packet_create_authn_request (conn, &msg0, NULL, NULL, "sikrit")
34              == 0);
35   CU_ASSERT (rs_packet_create_authn_request (conn, &msg1, NULL, NULL, "sikrit")
36              == 0);
37   CU_ASSERT (rs_packet_send (msg0, NULL) == 0);
38   CU_ASSERT (rs_packet_send (msg1, NULL) == 0);
39 }
40
41 #if 0
42 static void
43 send_large_packet (struct rs_connection *conn)
44 {
45   struct rs_packet *msg0;
46   struct radius_packet *frpkt = NULL;
47   char *buf;
48   int f;
49
50   buf = malloc (RS_MAX_PACKET_LEN);
51   CU_ASSERT (buf != NULL);
52   memset (buf, 0, RS_MAX_PACKET_LEN);
53
54   CU_ASSERT (rs_packet_create (conn, &msg0) == 0);
55   /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
56   for (f = 0; f < 15; f++)
57     {
58       memset (buf, 'a' + f, 252);
59       //vp = pairmake ("EAP-Message", buf, T_OP_EQ);
60       CU_ASSERT (rs_packet_append_avp (msg0, fixme...) == RSE_OK);
61     }
62   CU_ASSERT (rs_packet_send (msg0, NULL) == 0);
63 }
64 #endif  /* 0 */
65
66 /* ************************************************************ */
67 static struct setup {
68   char *config_file;
69   char *config_name;
70   char *username;
71   char *pw;
72 } setup;
73
74 static void
75 test_auth ()
76 {
77   struct rs_context *ctx;
78   struct rs_connection *conn;
79
80   setup.config_file = "test.conf";
81   setup.config_name = "test-udp-auth";
82   setup.username = "molgan@PROJECT-MOONSHOT.ORG";
83   setup.pw = "password";
84
85   CU_ASSERT (rs_context_create (&ctx) == 0);
86   CU_ASSERT (rs_context_read_config (ctx, setup.config_file) == 0);
87   CU_ASSERT (rs_conn_create (ctx, &conn, setup.config_name) == 0);
88
89   authenticate (conn, setup.username, setup.pw);
90
91   rs_conn_destroy (conn);
92   rs_context_destroy (ctx);
93 }
94
95 static ssize_t
96 test_buffering_cb (const uint8_t *buf, ssize_t len)
97 {
98   /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
99      [RFC 2865]*/
100 #if 0
101   hd (buf, len);
102 #endif
103   CU_ASSERT (len >= 20);
104   CU_ASSERT (len <= RS_MAX_PACKET_LEN);
105   CU_ASSERT ((buf[2] << 8) +  buf[3] == len);
106   return len;
107 }
108
109 static void
110 test_buffering ()
111 {
112   struct rs_context *ctx;
113   struct rs_connection *conn;
114   struct timeval timeout;
115   struct polldata *polldata;
116
117   CU_ASSERT (rs_context_create (&ctx) == 0);
118   CU_ASSERT (rs_context_read_config (ctx, "test.conf") == 0);
119   CU_ASSERT (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
120
121   timeout.tv_sec = 0;
122   timeout.tv_usec = 150000;
123   polldata = udp_server ("11820", &timeout, test_buffering_cb);
124   CU_ASSERT (polldata != NULL);
125
126   send_more_than_one_msg_in_one_packet (conn);
127   CU_ASSERT (udp_poll (polldata) > 0);
128   CU_ASSERT (udp_poll (polldata) > 0);
129
130
131   udp_free_polldata (polldata);
132   rs_conn_destroy (conn);
133   rs_context_destroy (ctx);
134 }
135
136 /* ************************************************************ */
137 int
138 main (int argc, char *argv[])
139 {
140   CU_pSuite s = NULL;
141   CU_pTest t = NULL;
142
143   assert (CU_initialize_registry () == CUE_SUCCESS);
144   s =  CU_add_suite ("auth", NULL, NULL); assert (s);
145   t = CU_ADD_TEST (s, test_auth); assert (t);
146   s =  CU_add_suite ("buffering", NULL, NULL); assert (s);
147   t = CU_ADD_TEST (s, test_buffering); assert (t);
148
149   return !(CU_basic_run_tests () == CUE_SUCCESS);
150
151   CU_cleanup_registry ();
152   return 0;
153 }