diff options
-rw-r--r-- | lib/tests/Makefile.am | 10 | ||||
-rw-r--r-- | lib/tests/test-udp.c | 84 | ||||
-rw-r--r-- | lib/tests/test.conf | 8 | ||||
-rw-r--r-- | lib/tests/udp-server.c | 47 | ||||
-rw-r--r-- | lib/tests/udp.c | 108 | ||||
-rw-r--r-- | lib/tests/udp.h | 14 |
6 files changed, 271 insertions, 0 deletions
diff --git a/lib/tests/Makefile.am b/lib/tests/Makefile.am new file mode 100644 index 0000000..243719f --- /dev/null +++ b/lib/tests/Makefile.am @@ -0,0 +1,10 @@ +AUTOMAKE_OPTIONS = foreign +INCLUDES = -I$(top_srcdir)/include +AM_CFLAGS = -Wall -g + +bin_PROGRAMS = test-udp udp-server + +test_udp_SOURCES = test-udp.c +test_udp_LDADD = ../libradsec.la -lcgreen -lm + +udp_server_SOURCES = udp-server.c udp.c diff --git a/lib/tests/test-udp.c b/lib/tests/test-udp.c new file mode 100644 index 0000000..3ebbc96 --- /dev/null +++ b/lib/tests/test-udp.c @@ -0,0 +1,84 @@ +#include <stdlib.h> +#include <cgreen/cgreen.h> +#include <freeradius/libradius.h> +#include "radsec/radsec.h" +#include "radsec/request.h" + +#define true 1 /* FIXME: Bug report cgreen. */ +#define false 0 + +#define FREERADIUS_DICT "/usr/share/freeradius/dictionary" + +void +authenticate (struct rs_connection *conn, const char *user, const char *pw) +{ + struct rs_request *req; + struct rs_packet *msg, *resp; + + assert_true (rs_request_create (conn, &req) == 0); + assert_true (rs_packet_create_auth_request (conn, &msg, user, pw) == 0); + assert_true (rs_request_send (req, msg, &resp) == 0); + assert_true (rs_packet_frpkt (resp)->code == PW_AUTHENTICATION_ACK); + + rs_request_destroy(req); +} + +#if 0 +int +send_more_than_one_msg_in_one_packet (const char *server) +{ + struct rs_request *req; + struct rs_packet *msg, *resp; + + + +} +#endif + +/* ************************************************************ */ +static struct setup { + char *config_file; + char *config_name; + char *username; + char *pw; +} setup; + +void +test_auth () +{ + struct rs_context *ctx; + struct rs_connection *conn; + + assert_true (rs_context_create (&ctx, FREERADIUS_DICT) == 0); + assert_true (rs_context_read_config (ctx, setup.config_file) == 0); + assert_true (rs_conn_create (ctx, &conn, setup.config_name) == 0); + + authenticate (conn, setup.username, setup.pw); + + rs_conn_destroy (conn); + rs_context_destroy (ctx); +} + +int +test_udp (int argc, char *argv[], TestSuite *ts) +{ + add_test (ts, test_auth); + + if (argc > 1) + return run_single_test (ts, argv[1], create_text_reporter ()); + + return run_test_suite (ts, create_text_reporter ()); +} + +int +main (int argc, char *argv[]) +{ + TestSuite *ts = create_test_suite (); + + setup.config_file = "test.conf"; + setup.config_name = "test-udp"; + setup.username = "molgan"; + setup.pw = "password"; + + return test_udp (argc, argv, ts); +} diff --git a/lib/tests/test.conf b/lib/tests/test.conf new file mode 100644 index 0000000..2f65a80 --- /dev/null +++ b/lib/tests/test.conf @@ -0,0 +1,8 @@ +config test-udp { + type = "UDP" + server { + hostname = "localhost" + service = "1820" + secret = "sikrit" + } +} diff --git a/lib/tests/udp-server.c b/lib/tests/udp-server.c new file mode 100644 index 0000000..9275e10 --- /dev/null +++ b/lib/tests/udp-server.c @@ -0,0 +1,47 @@ +#include <stdlib.h> +#include <stdio.h> +#include "udp.h" + +ssize_t +handle_data (const uint8_t *buf, ssize_t len) +{ + int i; + + printf ("# len: %ld\n", len); + for (i = 0; i < len; i++) + { + printf ("%02x%s", buf[i], (i+1) % 8 ? " " : " "); + if ((i + 1) % 16 == 0) + printf ("\n"); + } + printf ("\n"); + return len; +} + +int +main (int argc, char *argv[]) +{ + int n, i; + struct timeval tv; + struct polldata *data; + +#define TIMEOUT 1 /* Seconds. */ + + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + data = server (argv[1], &tv, handle_data); + + for (i = 0, n = poll (data); n == 0 && i < 3; n = poll (data), i++) + { + fprintf (stderr, "waiting another %ld second%s\n", + tv.tv_sec, tv.tv_sec > 1 ? "s" : ""); + } + + if (data) + { + if (data->timeout) + free (data->timeout); + free (data); + } + return (n <= 0); +} diff --git a/lib/tests/udp.c b/lib/tests/udp.c new file mode 100644 index 0000000..6c43a2f --- /dev/null +++ b/lib/tests/udp.c @@ -0,0 +1,108 @@ +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <assert.h> +#include <stdio.h> +#include <event2/event.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <sys/types.h> +#include <netdb.h> +#include <sys/select.h> +#include <sys/time.h> +#include "udp.h" + +static struct addrinfo * +_resolve (const char *str) +{ + static int first = 1; + static struct addrinfo hints, *result = NULL; + struct addrinfo *rp = NULL; + int r; + + if (first) + { + first = 0; + memset (&hints, 0, sizeof (hints)); + hints.ai_family = AF_INET; /* AF_UNSPEC */ + hints.ai_socktype = SOCK_DGRAM; + r = getaddrinfo (NULL, str, &hints, &result); + if (r) + fprintf (stderr, "getaddrinfo: %s\n", gai_strerror (r)); + } + + if (result) + { + rp = result; + result = result->ai_next; + } + + return rp; +} + +ssize_t +poll (struct polldata *data) +{ + int r; + long timeout; + fd_set rfds; + ssize_t len; + uint8_t buf[4096]; + + FD_ZERO (&rfds); + FD_SET (data->s, &rfds); + if (data->timeout) + timeout = data->timeout->tv_sec; /* Save from destruction (Linux). */ + //fprintf (stderr, "calling select with timeout %ld\n", timeout); + r = select (data->s + 1, &rfds, NULL, NULL, data->timeout); + if (data->timeout) + data->timeout->tv_sec = timeout; /* Restore. */ + //fprintf (stderr, "select returning %d\n", r); + if (r > 0) + { + len = recv (data->s, buf, sizeof (buf), 0); + if (len > 0) + return data->cb (buf, len); + } + return r; +} + +struct polldata * +server (const char *bindto, struct timeval *timeout, data_cb cb) +{ + struct addrinfo *res; + int s = -1; + + for (res = _resolve (bindto); res; res = _resolve (bindto)) + { + s = socket (res->ai_family, res->ai_socktype, res->ai_protocol); + if (s >= 0) + { + if (bind (s, res->ai_addr, res->ai_addrlen) == 0) + break; /* Done. */ + else + { + close (s); + s = -1; + } + } + } + + if (s >= 0) + { + struct polldata *data = malloc (sizeof (struct polldata)); + assert (data); + memset (data, 0, sizeof (struct polldata)); + data->s = s; + data->cb = cb; + if (timeout) + { + data->timeout = malloc (sizeof (struct timeval)); + assert (data->timeout); + memcpy (data->timeout, timeout, sizeof (struct timeval)); + } + return data; + } + + return NULL; +} diff --git a/lib/tests/udp.h b/lib/tests/udp.h new file mode 100644 index 0000000..402295f --- /dev/null +++ b/lib/tests/udp.h @@ -0,0 +1,14 @@ +#include <stdint.h> +#include <unistd.h> +#include <sys/time.h> +//#include <sys/types.h> + +typedef ssize_t (*data_cb) (const uint8_t *buf, ssize_t len); +struct polldata { + int s; + data_cb cb; + struct timeval *timeout; +}; + +struct polldata *server (const char *bindto, struct timeval *timeout, data_cb cb); +ssize_t poll (struct polldata *data); |