summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLinus Nordberg <linus@nordberg.se>2014-02-05 11:10:02 +0100
committerLinus Nordberg <linus@nordberg.se>2014-02-05 11:10:02 +0100
commit3d954bfd2f658ac05a0f20a1241738ed3e3fdd28 (patch)
treed95b364fbab298c9b94c9c729afc98904c7c5bb0 /tests
parent67bdfa83f1879312fef0fbac769f6fb45df12d1a (diff)
Move lib to the root.
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am12
-rw-r--r--tests/README39
-rw-r--r--tests/demoCA/index.txt3
-rw-r--r--tests/demoCA/index.txt.attr1
-rw-r--r--tests/demoCA/newcerts/01.pem46
-rw-r--r--tests/demoCA/newcerts/02.pem49
-rw-r--r--tests/demoCA/newcerts/03.pem49
-rw-r--r--tests/demoCA/private/cakey.pem9
-rw-r--r--tests/demoCA/private/cli1.key9
-rw-r--r--tests/demoCA/private/srv1.key9
-rw-r--r--tests/demoCA/serial1
-rw-r--r--tests/test-udp.c153
-rw-r--r--tests/test.conf30
-rw-r--r--tests/udp-server.c35
-rw-r--r--tests/udp.c141
-rw-r--r--tests/udp.h20
16 files changed, 606 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..09f9d28
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,12 @@
+AUTOMAKE_OPTIONS = foreign
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)
+AM_CFLAGS = -Wall -Werror -g
+
+TESTS = test-udp
+
+check_PROGRAMS = test-udp udp-server
+
+test_udp_SOURCES = test-udp.c udp.c udp.h
+test_udp_LDADD = ../libradsec.la -lcunit -lm
+
+udp_server_SOURCES = udp-server.c udp.c udp.h
diff --git a/tests/README b/tests/README
new file mode 100644
index 0000000..33bddc1
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,39 @@
+This is the README file for the test directory of libradsec.
+
+Build
+-----
+
+In order to build and run the tests, you'll need to have CUnit
+installed.
+
+Source code: http://cunit.sourceforge.net/
+Debian package: libcunit1-dev
+FreeBSD port: devel/cunit
+
+
+Run
+---
+
+NOTE: To run the tests you currently need
+- a RADIUS server running at localhost:1820 with the shared RADIUS
+ secret "sikrit" configured (or whatever "test-udp-auth" in test.conf
+ says)
+- a user "molgan@PROJECT-MOONSHOT.ORG" with password "password"
+ present in the RADIUS database
+These requirements will be removed in a future libradsec release.
+
+
+Run the tests by typing
+
+ make check
+
+The output should read something like
+
+ --Run Summary: Type Total Ran Passed Failed
+ suites 2 2 n/a 0
+ tests 2 2 2 0
+ asserts 23 23 23 0
+ PASS: test-udp
+ =============
+ 1 test passed
+ =============
diff --git a/tests/demoCA/index.txt b/tests/demoCA/index.txt
new file mode 100644
index 0000000..51f934f
--- /dev/null
+++ b/tests/demoCA/index.txt
@@ -0,0 +1,3 @@
+V 250806115449Z 01 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=ca
+V 250806115457Z 02 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=srv1
+V 250806115504Z 03 unknown /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=cli1
diff --git a/tests/demoCA/index.txt.attr b/tests/demoCA/index.txt.attr
new file mode 100644
index 0000000..8f7e63a
--- /dev/null
+++ b/tests/demoCA/index.txt.attr
@@ -0,0 +1 @@
+unique_subject = yes
diff --git a/tests/demoCA/newcerts/01.pem b/tests/demoCA/newcerts/01.pem
new file mode 100644
index 0000000..29cb5ee
--- /dev/null
+++ b/tests/demoCA/newcerts/01.pem
@@ -0,0 +1,46 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca
+ Validity
+ Not Before: Sep 12 11:54:49 2012 GMT
+ Not After : Aug 6 11:54:49 2025 GMT
+ Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (512 bit)
+ Modulus:
+ 00:eb:9e:52:bf:1a:7c:32:63:9f:96:80:71:f1:98:
+ 87:90:97:f1:7a:4a:81:6d:66:7e:8e:7c:50:5f:f9:
+ 6e:94:1a:b0:7b:46:87:b5:9e:23:48:04:ad:f3:55:
+ a1:f9:31:50:a1:10:ab:ca:ba:70:ac:58:95:4e:9d:
+ 3a:2b:52:36:df
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05
+ X509v3 Authority Key Identifier:
+ keyid:11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05
+
+ X509v3 Basic Constraints:
+ CA:TRUE
+ Signature Algorithm: sha1WithRSAEncryption
+ 15:12:3b:79:3d:61:d2:c7:d2:a8:0c:df:82:ea:66:76:26:cb:
+ ab:b5:83:a3:52:a0:23:1a:a9:92:8e:93:41:f7:6c:3f:8a:2c:
+ bd:32:3d:70:3f:b6:fd:f2:37:50:0a:66:8c:1c:44:bf:ef:50:
+ 24:33:bd:48:47:04:ee:8c:61:88
+-----BEGIN CERTIFICATE-----
+MIIB5TCCAY+gAwIBAgIBATANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJBVTET
+MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
+dHkgTHRkMQswCQYDVQQDDAJjYTAeFw0xMjA5MTIxMTU0NDlaFw0yNTA4MDYxMTU0
+NDlaMFIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK
+DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxCzAJBgNVBAMMAmNhMFwwDQYJKoZI
+hvcNAQEBBQADSwAwSAJBAOueUr8afDJjn5aAcfGYh5CX8XpKgW1mfo58UF/5bpQa
+sHtGh7WeI0gErfNVofkxUKEQq8q6cKxYlU6dOitSNt8CAwEAAaNQME4wHQYDVR0O
+BBYEFBFXQAvwMy+uwtqkOgC66TSzdSAFMB8GA1UdIwQYMBaAFBFXQAvwMy+uwtqk
+OgC66TSzdSAFMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADQQAVEjt5PWHS
+x9KoDN+C6mZ2JsurtYOjUqAjGqmSjpNB92w/iiy9Mj1wP7b98jdQCmaMHES/71Ak
+M71IRwTujGGI
+-----END CERTIFICATE-----
diff --git a/tests/demoCA/newcerts/02.pem b/tests/demoCA/newcerts/02.pem
new file mode 100644
index 0000000..2e1cccb
--- /dev/null
+++ b/tests/demoCA/newcerts/02.pem
@@ -0,0 +1,49 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 2 (0x2)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca
+ Validity
+ Not Before: Sep 12 11:54:57 2012 GMT
+ Not After : Aug 6 11:54:57 2025 GMT
+ Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=srv1
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (512 bit)
+ Modulus:
+ 00:ac:21:78:6f:cb:1c:10:c2:71:7b:72:03:e3:4b:
+ b2:c7:f6:63:3f:69:d3:d3:48:e0:90:16:0f:5a:44:
+ f5:9c:ed:b9:6b:72:be:11:6e:26:09:32:0c:51:25:
+ 10:35:fe:a0:33:fe:cf:90:9f:2c:8b:3a:c5:98:86:
+ c2:a9:5c:ba:a7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ Netscape Comment:
+ OpenSSL Generated Certificate
+ X509v3 Subject Key Identifier:
+ 08:13:6F:A0:93:47:21:31:9F:02:79:A5:CF:24:4A:D1:0B:A7:10:09
+ X509v3 Authority Key Identifier:
+ keyid:11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05
+
+ Signature Algorithm: sha1WithRSAEncryption
+ 2c:7e:61:65:48:cc:46:50:58:cc:9d:1b:b2:e7:2d:2b:72:e2:
+ a1:2f:2c:14:35:4d:b8:42:87:66:57:77:c4:02:17:fa:3c:db:
+ 83:3f:89:37:ae:f8:e9:00:fe:96:d8:4b:80:63:db:08:7a:c6:
+ e1:c7:59:ec:d9:76:4a:be:1a:19
+-----BEGIN CERTIFICATE-----
+MIICEjCCAbygAwIBAgIBAjANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJBVTET
+MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
+dHkgTHRkMQswCQYDVQQDDAJjYTAeFw0xMjA5MTIxMTU0NTdaFw0yNTA4MDYxMTU0
+NTdaMFQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK
+DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDTALBgNVBAMMBHNydjEwXDANBgkq
+hkiG9w0BAQEFAANLADBIAkEArCF4b8scEMJxe3ID40uyx/ZjP2nT00jgkBYPWkT1
+nO25a3K+EW4mCTIMUSUQNf6gM/7PkJ8sizrFmIbCqVy6pwIDAQABo3sweTAJBgNV
+HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
+Y2F0ZTAdBgNVHQ4EFgQUCBNvoJNHITGfAnmlzyRK0QunEAkwHwYDVR0jBBgwFoAU
+EVdAC/AzL67C2qQ6ALrpNLN1IAUwDQYJKoZIhvcNAQEFBQADQQAsfmFlSMxGUFjM
+nRuy5y0rcuKhLywUNU24QodmV3fEAhf6PNuDP4k3rvjpAP6W2EuAY9sIesbhx1ns
+2XZKvhoZ
+-----END CERTIFICATE-----
diff --git a/tests/demoCA/newcerts/03.pem b/tests/demoCA/newcerts/03.pem
new file mode 100644
index 0000000..d07be19
--- /dev/null
+++ b/tests/demoCA/newcerts/03.pem
@@ -0,0 +1,49 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 3 (0x3)
+ Signature Algorithm: sha1WithRSAEncryption
+ Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=ca
+ Validity
+ Not Before: Sep 12 11:55:04 2012 GMT
+ Not After : Aug 6 11:55:04 2025 GMT
+ Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd, CN=cli1
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (512 bit)
+ Modulus:
+ 00:99:7b:86:e0:46:de:f1:69:10:97:f8:4e:78:c8:
+ ee:c2:c8:65:64:90:72:dd:51:4f:c6:58:78:49:07:
+ 61:b9:ed:0a:77:7b:d2:6a:c3:49:e5:91:6c:bf:78:
+ d0:fc:8a:5c:80:1a:b0:03:28:b2:ea:e8:c8:a0:b6:
+ be:a1:42:30:5d
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ Netscape Comment:
+ OpenSSL Generated Certificate
+ X509v3 Subject Key Identifier:
+ 10:17:90:80:D8:B0:7E:91:91:13:32:27:8C:EF:A6:DE:9F:C1:C4:A7
+ X509v3 Authority Key Identifier:
+ keyid:11:57:40:0B:F0:33:2F:AE:C2:DA:A4:3A:00:BA:E9:34:B3:75:20:05
+
+ Signature Algorithm: sha1WithRSAEncryption
+ b1:08:87:88:7d:90:78:01:da:4a:e7:be:82:22:3f:58:07:f7:
+ 46:a9:9a:42:a4:88:d9:b8:6a:69:bf:cb:d0:39:2d:c9:49:06:
+ fa:31:80:66:17:32:cc:e8:ae:36:9c:c1:d5:ae:6d:3c:eb:72:
+ 77:55:92:fa:ab:f5:a3:bc:19:2d
+-----BEGIN CERTIFICATE-----
+MIICEjCCAbygAwIBAgIBAzANBgkqhkiG9w0BAQUFADBSMQswCQYDVQQGEwJBVTET
+MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
+dHkgTHRkMQswCQYDVQQDDAJjYTAeFw0xMjA5MTIxMTU1MDRaFw0yNTA4MDYxMTU1
+MDRaMFQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK
+DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDTALBgNVBAMMBGNsaTEwXDANBgkq
+hkiG9w0BAQEFAANLADBIAkEAmXuG4Ebe8WkQl/hOeMjuwshlZJBy3VFPxlh4SQdh
+ue0Kd3vSasNJ5ZFsv3jQ/IpcgBqwAyiy6ujIoLa+oUIwXQIDAQABo3sweTAJBgNV
+HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
+Y2F0ZTAdBgNVHQ4EFgQUEBeQgNiwfpGREzInjO+m3p/BxKcwHwYDVR0jBBgwFoAU
+EVdAC/AzL67C2qQ6ALrpNLN1IAUwDQYJKoZIhvcNAQEFBQADQQCxCIeIfZB4AdpK
+576CIj9YB/dGqZpCpIjZuGppv8vQOS3JSQb6MYBmFzLM6K42nMHVrm0863J3VZL6
+q/WjvBkt
+-----END CERTIFICATE-----
diff --git a/tests/demoCA/private/cakey.pem b/tests/demoCA/private/cakey.pem
new file mode 100644
index 0000000..e7df9d0
--- /dev/null
+++ b/tests/demoCA/private/cakey.pem
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAOueUr8afDJjn5aAcfGYh5CX8XpKgW1mfo58UF/5bpQasHtGh7We
+I0gErfNVofkxUKEQq8q6cKxYlU6dOitSNt8CAwEAAQJAR+SmQPN24/Ur88M7gUlW
+TBNgtjzXoyb8BMP/zlkQmZW5Tcv1xCa1UwK33u2wSmhSNP6zA1QrC2d2pv/7XZEp
+wQIhAPpf2QuEooR5BPrvDiAVPlKp31EROrZOiOV5hbV1Kzx/AiEA8OmZZrvgrdQu
+3PKRLfxD11NKf0yhC+7WdVWguYZ1VaECIF99XMcyz9TcXxThRa7gy0M1vJErlAvh
+yf5TKba6OEI7AiBpNctdl11G7OxOZ8zJZWsHRYO6Vm/as0KLWYromvTxIQIhAK0c
+r+G23R+dHDUdNEBSi6G74dbaJqaA8LsVr9w9m5gY
+-----END RSA PRIVATE KEY-----
diff --git a/tests/demoCA/private/cli1.key b/tests/demoCA/private/cli1.key
new file mode 100644
index 0000000..09381f1
--- /dev/null
+++ b/tests/demoCA/private/cli1.key
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOQIBAAJBAJl7huBG3vFpEJf4TnjI7sLIZWSQct1RT8ZYeEkHYbntCnd70mrD
+SeWRbL940PyKXIAasAMosuroyKC2vqFCMF0CAwEAAQJAEozki1zle0YYlFWVnnGi
+sfYokxQGXguC2dU9jI4Q2LjGut6mVx/zLIU59BS4nUq2aYHg0hxwwzOba92c0lT/
+HQIhAMp0+k7FtDdRQzIaDzeEY6MYyLhhhukhI3xpyXYVuyx7AiEAwhLQl6hYlsgh
+78CzTAhAdbheAwIQWyvY7XjKzxdpGwcCIG/hr0YC2bHMNZ8laY1bmxhRpPLH6p9A
+0fR6HXwlTDerAiA1y21SfHGB6huuD2Yjry3e86nrf4j1HKRWvuLIoJ6bxQIgWmyj
+YOSFsaBwj9ptkY0d4H84SDHnt7GRypm0/98OSg8=
+-----END RSA PRIVATE KEY-----
diff --git a/tests/demoCA/private/srv1.key b/tests/demoCA/private/srv1.key
new file mode 100644
index 0000000..284f1e1
--- /dev/null
+++ b/tests/demoCA/private/srv1.key
@@ -0,0 +1,9 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOgIBAAJBAKwheG/LHBDCcXtyA+NLssf2Yz9p09NI4JAWD1pE9ZztuWtyvhFu
+JgkyDFElEDX+oDP+z5CfLIs6xZiGwqlcuqcCAwEAAQJAbviJF7GfH2LsHISt4vyr
+fuTmqTxF1wI13E6MiUrJ+eftT7Hq1Wq6B7gmlI1iJiJLlAH6o93PYhp8559Dfp+q
+wQIhAOMbFp0NJPrVpycx5dQAYpM/edqXoOENQf1lMLOmOHlhAiEAwgfTbAaGNfQS
+uXfzj0sx+IvoKE/MXfLKZ/uE9futCQcCIQC/mMjZMo+yNrHQdV5KHxEK3RB2hFmr
+xD2aA9a0mVUnwQIgbYjHdNNWDr1DmMo7h+g2RI6Ot7scruiyFPNrgwXaEB8CICMa
+8wjF27wlJ2nmhM9ZXUBtvBKgU+jspsA8n+wU+o+f
+-----END RSA PRIVATE KEY-----
diff --git a/tests/demoCA/serial b/tests/demoCA/serial
new file mode 100644
index 0000000..6496923
--- /dev/null
+++ b/tests/demoCA/serial
@@ -0,0 +1 @@
+04
diff --git a/tests/test-udp.c b/tests/test-udp.c
new file mode 100644
index 0000000..ed176c0
--- /dev/null
+++ b/tests/test-udp.c
@@ -0,0 +1,153 @@
+/* Copyright 2011,2013, NORDUnet A/S. All rights reserved. */
+/* See LICENSE for licensing information. */
+
+#include <stdlib.h>
+#include <assert.h>
+#include <CUnit/Basic.h>
+#include "radius/client.h"
+#include "radsec/radsec.h"
+#include "radsec/request.h"
+#include "udp.h"
+
+static void
+authenticate (struct rs_connection *conn, const char *user, const char *pw)
+{
+ struct rs_request *req;
+ struct rs_packet *msg, *resp;
+
+ CU_ASSERT (rs_request_create (conn, &req) == 0);
+ CU_ASSERT (!rs_packet_create_authn_request (conn, &msg, user, pw));
+ rs_request_add_reqpkt (req, msg);
+ CU_ASSERT (rs_request_send (req, &resp) == 0);
+ //printf ("%s\n", rs_err_msg (rs_err_conn_pop (conn), 1));
+ CU_ASSERT (rs_packet_code(resp) == PW_ACCESS_ACCEPT);
+
+ rs_request_destroy (req);
+}
+
+static void
+send_more_than_one_msg_in_one_packet (struct rs_connection *conn)
+{
+ struct rs_packet *msg0, *msg1;
+
+ CU_ASSERT (rs_packet_create_authn_request (conn, &msg0, NULL, NULL) == 0);
+ CU_ASSERT (rs_packet_create_authn_request (conn, &msg1, NULL, NULL) == 0);
+ CU_ASSERT (rs_packet_send (msg0, NULL) == 0);
+ CU_ASSERT (rs_packet_send (msg1, NULL) == 0);
+}
+
+#if 0
+static void
+send_large_packet (struct rs_connection *conn)
+{
+ struct rs_packet *msg0;
+ struct radius_packet *frpkt = NULL;
+ char *buf;
+ int f;
+
+ buf = malloc (RS_MAX_PACKET_LEN);
+ CU_ASSERT (buf != NULL);
+ memset (buf, 0, RS_MAX_PACKET_LEN);
+
+ CU_ASSERT (rs_packet_create (conn, &msg0) == 0);
+ /* 16 chunks --> heap corruption in evbuffer_drain detected by free() */
+ for (f = 0; f < 15; f++)
+ {
+ memset (buf, 'a' + f, 252);
+ //vp = pairmake ("EAP-Message", buf, T_OP_EQ);
+ CU_ASSERT (rs_packet_append_avp (msg0, fixme...) == RSE_OK);
+ }
+ CU_ASSERT (rs_packet_send (msg0, NULL) == 0);
+}
+#endif /* 0 */
+
+/* ************************************************************ */
+static struct setup {
+ char *config_file;
+ char *config_name;
+ char *username;
+ char *pw;
+} setup;
+
+static void
+test_auth ()
+{
+ struct rs_context *ctx;
+ struct rs_connection *conn;
+
+ setup.config_file = "test.conf";
+ setup.config_name = "test-udp-auth";
+ setup.username = "molgan@PROJECT-MOONSHOT.ORG";
+ setup.pw = "password";
+
+ CU_ASSERT (rs_context_create (&ctx) == 0);
+ CU_ASSERT (rs_context_read_config (ctx, setup.config_file) == 0);
+ CU_ASSERT (rs_conn_create (ctx, &conn, setup.config_name) == 0);
+
+ authenticate (conn, setup.username, setup.pw);
+
+ rs_conn_destroy (conn);
+ rs_context_destroy (ctx);
+}
+
+static ssize_t
+test_buffering_cb (const uint8_t *buf, ssize_t len)
+{
+ /* "Exactly one RADIUS packet is encapsulated in the UDP Data field"
+ [RFC 2865]*/
+#if 0
+ hd (buf, len);
+#endif
+ CU_ASSERT (len >= 20);
+ CU_ASSERT (len <= RS_MAX_PACKET_LEN);
+ CU_ASSERT ((buf[2] << 8) + buf[3] == len);
+ return len;
+}
+
+static void
+test_buffering ()
+{
+ struct rs_context *ctx;
+ struct rs_connection *conn;
+ struct timeval timeout;
+ struct polldata *polldata;
+
+ CU_ASSERT (rs_context_create (&ctx) == 0);
+ CU_ASSERT (rs_context_read_config (ctx, "test.conf") == 0);
+ CU_ASSERT (rs_conn_create (ctx, &conn, "test-udp-buffering") == 0);
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 150000;
+ polldata = udp_server ("11820", &timeout, test_buffering_cb);
+ CU_ASSERT (polldata != NULL);
+
+ send_more_than_one_msg_in_one_packet (conn);
+ CU_ASSERT (udp_poll (polldata) > 0);
+ CU_ASSERT (udp_poll (polldata) > 0);
+
+
+ udp_free_polldata (polldata);
+ rs_conn_destroy (conn);
+ rs_context_destroy (ctx);
+}
+
+/* ************************************************************ */
+int
+main (int argc, char *argv[])
+{
+ CU_pSuite s = NULL;
+ CU_pTest t = NULL;
+ unsigned int nfail;
+
+ assert (CU_initialize_registry () == CUE_SUCCESS);
+ s = CU_add_suite ("auth", NULL, NULL); assert (s);
+ t = CU_ADD_TEST (s, test_auth); assert (t);
+ s = CU_add_suite ("buffering", NULL, NULL); assert (s);
+ t = CU_ADD_TEST (s, test_buffering); assert (t);
+
+ assert (CU_basic_run_tests () == CUE_SUCCESS);
+ nfail = CU_get_number_of_failures();
+
+ CU_cleanup_registry ();
+ return nfail;
+}
diff --git a/tests/test.conf b/tests/test.conf
new file mode 100644
index 0000000..98d0330
--- /dev/null
+++ b/tests/test.conf
@@ -0,0 +1,30 @@
+realm test-udp-auth {
+ type = "UDP"
+ server {
+ hostname = "localhost"
+ service = "1820"
+ secret = "sikrit"
+ }
+}
+
+realm test-udp-buffering {
+ type = "UDP"
+ server {
+ hostname = "localhost"
+ service = "11820"
+ secret = "sikrit"
+ }
+}
+
+realm test-tls-test {
+ type = "TLS"
+ cacertfile = "/home/linus/nordberg-ca.crt"
+ certfile = "/home/linus/p/radsecproxy/src/maatuska.nordberg.se.crt"
+ certkeyfile = "/home/linus/p/radsecproxy/src/maatuska.nordberg.se.key"
+
+ server {
+ hostname = "localhost"
+ service = "1820"
+ secret = "sikrit"
+ }
+}
diff --git a/tests/udp-server.c b/tests/udp-server.c
new file mode 100644
index 0000000..77a35df
--- /dev/null
+++ b/tests/udp-server.c
@@ -0,0 +1,35 @@
+/* Copyright 2011, NORDUnet A/S. All rights reserved. */
+/* See LICENSE for licensing information. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "udp.h"
+
+ssize_t
+handle_data (const uint8_t *buf, ssize_t len)
+{
+ return hd (buf, 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 = udp_server (argv[1], &tv, handle_data);
+
+ for (i = 0, n = udp_poll (data); n == 0 && i < 3; n = udp_poll (data), i++)
+ {
+ fprintf (stderr, "waiting another %ld second%s\n",
+ tv.tv_sec, tv.tv_sec > 1 ? "s" : "");
+ }
+
+ udp_free_polldata (data);
+ return (n <= 0);
+}
diff --git a/tests/udp.c b/tests/udp.c
new file mode 100644
index 0000000..2c580da
--- /dev/null
+++ b/tests/udp.c
@@ -0,0 +1,141 @@
+/* Copyright 2011,2013, NORDUnet A/S. All rights reserved. */
+/* See LICENSE for licensing information. */
+
+#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 "radius/client.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;
+}
+
+void
+udp_free_polldata (struct polldata *data)
+{
+ if (data)
+ {
+ if (data->timeout)
+ free (data->timeout);
+ free (data);
+ }
+}
+
+/* @return if select() returns error or timeout, return select()
+ else return value from invoked callback function */
+ssize_t
+udp_poll (struct polldata *data)
+{
+ int r;
+ long timeout = 0;
+ fd_set rfds;
+ ssize_t len;
+ uint8_t buf[RS_MAX_PACKET_LEN];
+
+ 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 *
+udp_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;
+}
+
+ssize_t
+hd (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;
+}
diff --git a/tests/udp.h b/tests/udp.h
new file mode 100644
index 0000000..a8d5f23
--- /dev/null
+++ b/tests/udp.h
@@ -0,0 +1,20 @@
+/* Copyright 2011, NORDUnet A/S. All rights reserved. */
+/* See LICENSE for licensing information. */
+
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/time.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 *udp_server (const char *bindto, struct timeval *timeout, data_cb cb);
+ssize_t udp_poll (struct polldata *data);
+void udp_free_polldata (struct polldata *data);
+
+ssize_t hd (const uint8_t *buf, ssize_t len);