[SCM] Socket Wrapper Repository - branch master updated

Andreas Schneider asn at samba.org
Tue Dec 10 07:02:47 MST 2013


The branch, master has been updated
       via  76c7df9 tests: Add test_sendto_recvfrom_ipv6().
       via  fe78b28 torture: Add torture_setup_echo_srv_udp_ipv6().
       via  88aeb65 torture_teardown_echo_srv
       via  0c4a784 tests: Use torture helpers in test_echo_udp_sendto_recvfrom.
       via  c6c0669 tests: Add teardown functions to torture lib.
       via  1e12eb0 tests: Add a torture library with helpers.
       via  78cc4fb tests: Fix the help output of the echo server
      from  2b53d42 tests: Add test_echo_udp_sendto_recvfrom.

http://gitweb.samba.org/?p=socket_wrapper.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 76c7df9fceb992e3d9de2f29d9dfb508f60df0de
Author: Andreas Schneider <asn at cryptomilk.org>
Date:   Tue Dec 10 11:46:03 2013 +0100

    tests: Add test_sendto_recvfrom_ipv6().

commit fe78b28f689201617bc8312378f3c7f59239eb1b
Author: Andreas Schneider <asn at cryptomilk.org>
Date:   Tue Dec 10 11:38:08 2013 +0100

    torture: Add torture_setup_echo_srv_udp_ipv6().

commit 88aeb652d94f7f951ca9cd41322202f7f02e8acb
Author: Andreas Schneider <asn at cryptomilk.org>
Date:   Tue Dec 10 11:37:44 2013 +0100

    torture_teardown_echo_srv

commit 0c4a784047a6a8eda69d31e6db49a5904836e2de
Author: Andreas Schneider <asn at cryptomilk.org>
Date:   Tue Dec 10 11:19:34 2013 +0100

    tests: Use torture helpers in test_echo_udp_sendto_recvfrom.

commit c6c0669a2a9c4141693a7cf1d8f5f35ee9bda7ac
Author: Andreas Schneider <asn at cryptomilk.org>
Date:   Tue Dec 10 11:14:04 2013 +0100

    tests: Add teardown functions to torture lib.

commit 1e12eb0b3e4f974c33a2b628d0857e137fce8cfa
Author: Andreas Schneider <asn at cryptomilk.org>
Date:   Tue Dec 10 11:03:12 2013 +0100

    tests: Add a torture library with helpers.

commit 78cc4fb76d14d4df313e412bf148312eea2c706b
Author: Jakub Hrozek <jhrozek at redhat.com>
Date:   Tue Dec 10 10:57:24 2013 +0100

    tests: Fix the help output of the echo server

-----------------------------------------------------------------------

Summary of changes:
 tests/CMakeLists.txt                  |   12 ++-
 tests/echo_srv.c                      |   11 ++-
 tests/test_echo_udp_sendto_recvfrom.c |  175 +++++++++++----------------------
 tests/torture.c                       |  170 ++++++++++++++++++++++++++++++++
 tests/torture.h                       |   26 +++++-
 5 files changed, 272 insertions(+), 122 deletions(-)
 create mode 100644 tests/torture.c


Changeset truncated at 500 lines:

diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 49cd62a..1154561 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -6,13 +6,21 @@ include_directories(
   ${CMOCKA_INCLUDE_DIR}
 )
 
+set(TORTURE_LIBRARY torture)
+
+# RFC862 echo server
 add_executable(echo_srv echo_srv.c)
 
-add_cmocka_test(testsuite testsuite.c ${CMOCKA_LIBRARY} ${SWRAP_REQUIRED_LIBRARIES})
-add_cmocka_test(test_echo_udp_sendto_recvfrom test_echo_udp_sendto_recvfrom.c ${CMOCKA_LIBRARY} ${SWRAP_REQUIRED_LIBRARIES})
+add_library(${TORTURE_LIBRARY} STATIC torture.c)
+target_link_libraries(${TORTURE_LIBRARY}
+    ${CMOCKA_LIBRARY}
+    ${SWRAP_REQUIRED_LIBRARIES})
 
 set(SWRAP_TESTS testsuite test_echo_udp_sendto_recvfrom)
+
 foreach(_SWRAP_TEST ${SWRAP_TESTS})
+    add_cmocka_test(${_SWRAP_TEST} ${_SWRAP_TEST}.c ${TORTURE_LIBRARY})
+
     if (OSX)
         set_property(
             TEST
diff --git a/tests/echo_srv.c b/tests/echo_srv.c
index 13e2bc3..32a03da 100644
--- a/tests/echo_srv.c
+++ b/tests/echo_srv.c
@@ -296,8 +296,15 @@ int main(int argc, char **argv)
                 opts.daemon = true;
                 break;
             default: /* '?' */
-                fprintf(stderr, "Usage: %s [-p port] [-u] [-t] [--pid pidfile]\n",
-                        argv[0]);
+                fprintf(stderr, "Usage: %s [-p port] [-u] [-t] [-b bind_addr] " \
+                                "[-D] [--pid pidfile]\n"
+                                "-t makes the server listen on TCP\n"
+                                "-u makes the server listen on UDP\n"
+                                "-D tells the server to become a deamon and " \
+                                "write a PIDfile\n"
+                                "The default port is 7, the default PIDfile is " \
+                                "echo_srv.pid in the current directory\n",
+                                argv[0]);
                 ret = 1;
                 goto done;
         }
diff --git a/tests/test_echo_udp_sendto_recvfrom.c b/tests/test_echo_udp_sendto_recvfrom.c
index 9596e5e..7139656 100644
--- a/tests/test_echo_udp_sendto_recvfrom.c
+++ b/tests/test_echo_udp_sendto_recvfrom.c
@@ -11,138 +11,77 @@
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 
-#include <signal.h>
-
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include <unistd.h>
-
-#define ECHO_SRV_IP "127.0.0.10"
-#define ECHO_SRV_PORT 7
-
-#define ECHO_SRV_PIDFILE "echo_srv.pid"
-
-struct test_opts {
-	char *socket_wrapper_dir;
-	char *pidfile;
-};
-
-static void setup(void **state)
+static void setup_echo_srv_udp_ipv4(void **state)
 {
-	char test_tmpdir[256];
-	struct test_opts *o;
-	size_t len;
-	const char *p;
-
-	o = malloc(sizeof(struct test_opts));
-	assert_non_null(o);
-
-	snprintf(test_tmpdir, sizeof(test_tmpdir), "/tmp/test_socket_wrapper_XXXXXX");
-
-	p = mkdtemp(test_tmpdir);
-	assert_non_null(p);
-
-	o->socket_wrapper_dir = strdup(p);
-	assert_non_null(o->socket_wrapper_dir);
-
-	len = strlen(p) + 1 + strlen(ECHO_SRV_PIDFILE) + 1;
-
-	o->pidfile = malloc(len);
-	assert_non_null(o->pidfile);
-
-	snprintf(o->pidfile, len, "%s/%s", p, ECHO_SRV_PIDFILE);
-
-	setenv("SOCKET_WRAPPER_DIR", p, 1);
-	setenv("SOCKET_WRAPPER_DEFAULT_IFACE", "21", 1);
-
-	*state = o;
+	torture_setup_echo_srv_udp_ipv4(state);
 }
 
-static void setup_echo_srv_udp(void **state)
+static void setup_echo_srv_udp_ipv6(void **state)
 {
-	struct test_opts *o;
-	char start_echo_srv[1024] = {0};
-	int rc;
-
-	setup(state);
-	o = *state;
-
-	snprintf(start_echo_srv, sizeof(start_echo_srv),
-		 "%s/tests/echo_srv -b %s -D -u --pid %s",
-		 BINARYDIR, ECHO_SRV_IP, o->pidfile);
-
-	rc = system(start_echo_srv);
-	assert_int_equal(rc, 0);
-
-	sleep(1);
+	torture_setup_echo_srv_udp_ipv6(state);
 }
 
 static void teardown(void **state)
 {
-	struct test_opts *o = *state;
-	char remove_cmd[1024] = {0};
+	torture_teardown_echo_srv(state);
+}
+
+static void test_sendto_recvfrom_ipv4(void **state)
+{
+	struct sockaddr_in sin;
+	socklen_t slen = sizeof(struct sockaddr_in);
+	ssize_t ret;
 	int rc;
+	int i;
+	int s;
 
 	(void) state; /* unused */
 
-	snprintf(remove_cmd, sizeof(remove_cmd), "rm -rf %s", o->socket_wrapper_dir);
-
-	rc = system(remove_cmd);
-	if (rc < 0) {
-		fprintf(stderr, "%s failed: %s", remove_cmd, strerror(errno));
-	}
-
-	free(o->socket_wrapper_dir);
-	free(o->pidfile);
-	free(o);
-}
+	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+	assert_int_not_equal(s, -1);
 
-static void teardown_echo_srv_udp(void **state)
-{
-	struct test_opts *o = *state;
-	char buf[8] = {0};
-	long int tmp;
-	ssize_t rc;
-	pid_t pid;
-	int fd;
-
-	/* read the pidfile */
-	fd = open(o->pidfile, O_RDONLY);
-	if (fd < 0) {
-		goto done;
-	}
+	ZERO_STRUCT(sin);
+	sin.sin_family = AF_INET;
+	sin.sin_port = htons(TORTURE_ECHO_SRV_PORT);
 
-	rc = read(fd, buf, sizeof(buf));
-	close(fd);
-	if (rc <= 0) {
-		goto done;
-	}
+	rc = inet_aton(TORTURE_ECHO_SRV_IPV4, &sin.sin_addr);
+	assert_int_equal(rc, 1);
 
-	buf[sizeof(buf) - 1] = '\0';
+	for (i = 0; i < 10; i++) {
+		char send_buf[64] = {0};
+		char recv_buf[64] = {0};
+		struct sockaddr_in cli_in;
+		socklen_t clen;
 
-	tmp = strtol(buf, NULL, 10);
-	if (tmp == 0 || tmp > 0xFFFF || errno == ERANGE) {
-		goto done;
-	}
+		snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
 
-	pid = (pid_t)(tmp & 0xFFFF);
+		ret = sendto(s,
+			     send_buf,
+			     sizeof(send_buf),
+			     0,
+			     (struct sockaddr *)(void *)&sin,
+			     slen);
+		assert_int_not_equal(ret, -1);
 
-	/* kill daemon */
-	kill(pid, SIGTERM);
+		ret = recvfrom(s,
+			       recv_buf,
+			       sizeof(recv_buf),
+			       0,
+			       (struct sockaddr *)&cli_in,
+			       &clen);
 
-done:
-	teardown(state);
+		assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
+	}
 }
 
-static void test_sendto_recvfrom_ipv4(void **state)
+#ifdef HAVE_IPV6
+static void test_sendto_recvfrom_ipv6(void **state)
 {
-	struct sockaddr_in sin;
-	socklen_t slen = sizeof(struct sockaddr_in);
+	struct sockaddr_in6 sin6;
+	socklen_t slen = sizeof(struct sockaddr_in6);
 	ssize_t ret;
 	int rc;
 	int i;
@@ -150,20 +89,20 @@ static void test_sendto_recvfrom_ipv4(void **state)
 
 	(void) state; /* unused */
 
-	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+	s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
 	assert_int_not_equal(s, -1);
 
-	ZERO_STRUCT(sin);
-	sin.sin_family = AF_INET;
-	sin.sin_port = htons(ECHO_SRV_PORT);
+	ZERO_STRUCT(sin6);
+	sin6.sin6_family = AF_INET6;
+	sin6.sin6_port = htons(TORTURE_ECHO_SRV_PORT);
 
-	rc = inet_aton(ECHO_SRV_IP, &sin.sin_addr);
+	rc = inet_pton(AF_INET6, TORTURE_ECHO_SRV_IPV6, &sin6.sin6_addr);
 	assert_int_equal(rc, 1);
 
 	for (i = 0; i < 10; i++) {
 		char send_buf[64] = {0};
 		char recv_buf[64] = {0};
-		struct sockaddr_in cli_in;
+		struct sockaddr_in6 cli_in6;
 		socklen_t clen;
 
 		snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
@@ -172,7 +111,7 @@ static void test_sendto_recvfrom_ipv4(void **state)
 			     send_buf,
 			     sizeof(send_buf),
 			     0,
-			     (struct sockaddr *)(void *)&sin,
+			     (struct sockaddr *)(void *)&sin6,
 			     slen);
 		assert_int_not_equal(ret, -1);
 
@@ -180,18 +119,22 @@ static void test_sendto_recvfrom_ipv4(void **state)
 			       recv_buf,
 			       sizeof(recv_buf),
 			       0,
-			       (struct sockaddr *)&cli_in,
+			       (struct sockaddr *)&cli_in6,
 			       &clen);
 
 		assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
 	}
 }
+#endif
 
 int main(void) {
 	int rc;
 
 	const UnitTest tests[] = {
-		unit_test_setup_teardown(test_sendto_recvfrom_ipv4, setup_echo_srv_udp, teardown_echo_srv_udp),
+		unit_test_setup_teardown(test_sendto_recvfrom_ipv4, setup_echo_srv_udp_ipv4, teardown),
+#ifdef HAVE_IPV6
+		unit_test_setup_teardown(test_sendto_recvfrom_ipv6, setup_echo_srv_udp_ipv6, teardown),
+#endif
 	};
 
 	rc = run_tests(tests);
diff --git a/tests/torture.c b/tests/torture.c
new file mode 100644
index 0000000..e2bab8c
--- /dev/null
+++ b/tests/torture.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) Andreas Schneider 2013 <asn at samba.org>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the author nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "torture.h"
+
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <fcntl.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define TORTURE_SOCKET_DIR "/tmp/test_socket_wrapper_XXXXXX"
+#define TORTURE_ECHO_SRV_PIDFILE "echo_srv.pid"
+
+void torture_setup_socket_dir(void **state)
+{
+	struct torture_state *s;
+	const char *p;
+	size_t len;
+
+	s = malloc(sizeof(struct torture_state));
+	assert_non_null(s);
+
+	s->socket_dir = strdup(TORTURE_SOCKET_DIR);
+	assert_non_null(s->socket_dir);
+
+	p = mkdtemp(s->socket_dir);
+	assert_non_null(p);
+
+	len = strlen(p) + 1 + strlen(TORTURE_ECHO_SRV_PIDFILE) + 1;
+
+	s->srv_pidfile = malloc(len);
+	assert_non_null(s->srv_pidfile);
+
+	snprintf(s->srv_pidfile, len, "%s/%s", p, TORTURE_ECHO_SRV_PIDFILE);
+
+	setenv("SOCKET_WRAPPER_DIR", p, 1);
+	setenv("SOCKET_WRAPPER_DEFAULT_IFACE", "21", 1);
+
+	*state = s;
+}
+
+static void torture_setup_echo_srv_udp_ip(void **state, const char *ip)
+{
+	struct torture_state *s;
+	char start_echo_srv[1024] = {0};
+	int rc;
+
+	torture_setup_socket_dir(state);
+
+	s = *state;
+
+	snprintf(start_echo_srv, sizeof(start_echo_srv),
+		 "%s/tests/echo_srv -b %s -D -u --pid %s",
+		 BINARYDIR, ip, s->srv_pidfile);
+
+	rc = system(start_echo_srv);
+	assert_int_equal(rc, 0);
+
+	sleep(1);
+}
+
+void torture_setup_echo_srv_udp_ipv4(void **state)
+{
+	torture_setup_echo_srv_udp_ip(state, TORTURE_ECHO_SRV_IPV4);
+}
+
+void torture_setup_echo_srv_udp_ipv6(void **state)
+{
+	torture_setup_echo_srv_udp_ip(state, TORTURE_ECHO_SRV_IPV6);
+}
+
+void torture_teardown_socket_dir(void **state)
+{
+	struct torture_state *s = *state;
+	char remove_cmd[1024] = {0};
+	int rc;
+
+	snprintf(remove_cmd, sizeof(remove_cmd), "rm -rf %s", s->socket_dir);
+
+	rc = system(remove_cmd);
+	if (rc < 0) {
+		fprintf(stderr, "%s failed: %s", remove_cmd, strerror(errno));
+	}
+
+	free(s->socket_dir);
+	free(s->srv_pidfile);
+	free(s);
+}
+
+void torture_teardown_echo_srv(void **state)
+{
+	struct torture_state *s = *state;
+	char buf[8] = {0};
+	long int tmp;
+	ssize_t rc;
+	pid_t pid;
+	int fd;
+
+	/* read the pidfile */
+	fd = open(s->srv_pidfile, O_RDONLY);
+	if (fd < 0) {
+		goto done;
+	}
+
+	rc = read(fd, buf, sizeof(buf));
+	close(fd);
+	if (rc <= 0) {
+		goto done;
+	}
+
+	buf[sizeof(buf) - 1] = '\0';
+
+	tmp = strtol(buf, NULL, 10);
+	if (tmp == 0 || tmp > 0xFFFF || errno == ERANGE) {
+		goto done;
+	}
+
+	pid = (pid_t)(tmp & 0xFFFF);
+
+	/* Make sure the daemon goes away! */
+	kill(pid, SIGTERM);
+
+	kill(pid, 0);
+	if (rc == 0) {
+		fprintf(stderr,
+			"WARNING the echo server is still running!\n");
+	}
+
+done:
+	torture_teardown_socket_dir(state);
+}
diff --git a/tests/torture.h b/tests/torture.h
index 2af5aca..be2556f 100644
--- a/tests/torture.h
+++ b/tests/torture.h
@@ -31,15 +31,37 @@
  * SUCH DAMAGE.
  */
 
-#include "config.h"
-
 #ifndef _TORTURE_H
 #define _TORTURE_H
 
+#include "config.h"
+
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+
 #include <string.h>
 
+#define TORTURE_ECHO_SRV_IPV4 "127.0.0.10"
+/* socket wrapper IPv6 prefix  FD00::5357:5Fxx */


-- 
Socket Wrapper Repository


More information about the samba-cvs mailing list