Module Name:    src
Committed By:   christos
Date:           Sat Sep 24 18:34:19 UTC 2011

Modified Files:
        src/tests/net/sys: Makefile
Added Files:
        src/tests/net/sys: t_rfc6056.c

Log Message:
Add an rfc6056 test.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/net/sys/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/net/sys/t_rfc6056.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/sys/Makefile
diff -u src/tests/net/sys/Makefile:1.2 src/tests/net/sys/Makefile:1.3
--- src/tests/net/sys/Makefile:1.2	Thu May  1 11:38:17 2008
+++ src/tests/net/sys/Makefile	Sat Sep 24 14:34:18 2011
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2008/05/01 15:38:17 jmmv Exp $
+# $NetBSD: Makefile,v 1.3 2011/09/24 18:34:18 christos Exp $
 
 .include <bsd.own.mk>
 
@@ -6,5 +6,6 @@ TESTSDIR=	${TESTSBASE}/net/sys
 
 TESTS_C=	t_connect
 TESTS_C+=	t_listen
+TESTS_C+=	t_rfc6056
 
 .include <bsd.test.mk>

Added files:

Index: src/tests/net/sys/t_rfc6056.c
diff -u /dev/null src/tests/net/sys/t_rfc6056.c:1.1
--- /dev/null	Sat Sep 24 14:34:19 2011
+++ src/tests/net/sys/t_rfc6056.c	Sat Sep 24 14:34:18 2011
@@ -0,0 +1,110 @@
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_rfc6056.c,v 1.1 2011/09/24 18:34:18 christos Exp $");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/udp.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <strings.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <netdb.h>
+#include <err.h>
+
+#include <atf-c.h>
+
+static void
+test(const char *hostname, const char *service, int family, int al)
+{
+	static const char hello[] = "hello\n";
+	int s, error;
+	struct sockaddr_storage ss;
+	struct addrinfo hints, *res;
+	
+	memset(&hints, 0, sizeof(hints));
+	hints.ai_family = family;
+	hints.ai_socktype = SOCK_DGRAM;
+
+	error = getaddrinfo(hostname, service, &hints, &res);
+	if (error)
+		errx(EXIT_FAILURE, "Cannot get address for %s (%s)",
+		    hostname, gai_strerror(error));
+	
+	s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+	if (s == -1)
+		err(EXIT_FAILURE, "socket");
+	
+	if (setsockopt(s, IPPROTO_UDP, UDP_RFC6056ALGO, &al, sizeof(al)) == -1)
+		err(EXIT_FAILURE, "setsockopt");
+
+	memset(&ss, 0, sizeof(ss));
+	ss.ss_len = res->ai_addrlen;
+	ss.ss_family = res->ai_family;
+
+	if (bind(s, (struct sockaddr *)&ss, ss.ss_len) == -1)
+		err(EXIT_FAILURE, "bind");
+		
+	if (sendto(s, hello, sizeof(hello) - 1, 0,
+	    res->ai_addr, res->ai_addrlen) == -1)
+		err(EXIT_FAILURE, "sendto");
+
+	if (close(s) == -1)
+		err(EXIT_FAILURE, "close");
+
+	s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+	if (s == -1)
+		err(EXIT_FAILURE, "socket");
+
+	if (setsockopt(s, IPPROTO_UDP, UDP_RFC6056ALGO, &al, sizeof(al)) == -1)
+		err(EXIT_FAILURE, "setsockopt");
+
+	if (connect(s, res->ai_addr, res->ai_addrlen) == -1)
+		err(EXIT_FAILURE, "connect");
+
+	if (send(s, hello, sizeof(hello) - 1, 0) == -1)
+		err(EXIT_FAILURE, "send");
+
+	if (close(s) == -1)
+		err(EXIT_FAILURE, "close");
+
+	freeaddrinfo(res);
+}
+
+ATF_TC(inet4);
+ATF_TC_HEAD(inet4, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Checks random port allocation "
+	    "for ipv4");
+}
+
+ATF_TC_BODY(inet4, tc)
+{
+	for (int i = 0; i < 6; i++)
+		test("localhost", "http", AF_INET, i);
+}
+
+ATF_TC(inet6);
+ATF_TC_HEAD(inet6, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Checks random port allocation "
+	    "for ipv6");
+}
+
+ATF_TC_BODY(inet6, tc)
+{
+	for (int i = 0; i < 6; i++)
+		test("localhost", "http", AF_INET6, i);
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+        ATF_TP_ADD_TC(tp, inet4);
+        ATF_TP_ADD_TC(tp, inet6);
+
+	return atf_no_error();
+}

Reply via email to