Module Name:    src
Committed By:   pooka
Date:           Tue Nov 30 22:09:15 UTC 2010

Modified Files:
        src/tests/rump/rumpkern: Makefile
Added Files:
        src/tests/rump/rumpkern: t_sp.sh
        src/tests/rump/rumpkern/h_client: Makefile h_reboot.c h_simplecli.c
            h_stresscli.c
        src/tests/rump/rumpkern/h_server: Makefile h_simpleserver.c

Log Message:
Add a simple and stress test cases for the rump remote syscall code.
Fun fact: since the server daemonizes into its own process group,
it's not in atf's pgrp.  Use rump_sys_reboot() in atf cleanup to
kill the server after the test.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/tests/rump/rumpkern/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/rump/rumpkern/t_sp.sh
cvs rdiff -u -r0 -r1.1 src/tests/rump/rumpkern/h_client/Makefile \
    src/tests/rump/rumpkern/h_client/h_reboot.c \
    src/tests/rump/rumpkern/h_client/h_simplecli.c \
    src/tests/rump/rumpkern/h_client/h_stresscli.c
cvs rdiff -u -r0 -r1.1 src/tests/rump/rumpkern/h_server/Makefile \
    src/tests/rump/rumpkern/h_server/h_simpleserver.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/rump/rumpkern/Makefile
diff -u src/tests/rump/rumpkern/Makefile:1.9 src/tests/rump/rumpkern/Makefile:1.10
--- src/tests/rump/rumpkern/Makefile:1.9	Tue Nov  9 15:25:19 2010
+++ src/tests/rump/rumpkern/Makefile	Tue Nov 30 22:09:15 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.9 2010/11/09 15:25:19 pooka Exp $
+# $NetBSD: Makefile,v 1.10 2010/11/30 22:09:15 pooka Exp $
 
 .include <bsd.own.mk>
 
@@ -12,6 +12,10 @@
 TESTS_C+=	t_tsleep
 TESTS_C+=	t_vm
 
+TESTS_SH=	t_sp
+
+SUBDIR+=	h_server h_client
+
 ADD_TO_LD=	-lrumpvfs -lrump -lrumpuser -lpthread
 LDADD.t_modlinkset+=	-lukfs -lrumpdev_disk -lrumpdev -lrumpfs_msdos 
 LDADD.t_modlinkset+=	-lrumpfs_cd9660 ${ADD_TO_LD}

Added files:

Index: src/tests/rump/rumpkern/t_sp.sh
diff -u /dev/null src/tests/rump/rumpkern/t_sp.sh:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/t_sp.sh	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,87 @@
+#	$NetBSD: t_sp.sh,v 1.1 2010/11/30 22:09:15 pooka Exp $
+#
+# Copyright (c) 2010 The NetBSD Foundation, Inc.
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+#
+
+atf_test_case basic cleanup
+basic_head()
+{
+
+	atf_set "descr" "Check that basic remote server communication works"
+}
+
+basic_body()
+{
+
+	export RUMP_SERVER=unix://commsock
+
+	atf_check -s exit:0 \
+	    $(atf_get_srcdir)/h_server/h_simpleserver ${RUMP_SERVER}
+
+	atf_check -s exit:0 $(atf_get_srcdir)/h_client/h_simplecli
+}
+
+basic_cleanup()
+{
+
+	docleanup
+}
+
+stresst=10
+atf_test_case stress cleanup
+stress_head()
+{
+
+	atf_set "descr" "Stress/robustness test (~${stresst}s)"
+}
+
+stress_body()
+{
+
+	export RUMP_SERVER=unix://commsock
+
+	atf_check -s exit:0 \
+	    $(atf_get_srcdir)/h_server/h_simpleserver ${RUMP_SERVER}
+
+	atf_check -s exit:0 $(atf_get_srcdir)/h_client/h_stresscli ${stresst}
+}
+
+stress_cleanup()
+{
+
+	docleanup
+}
+
+docleanup()
+{
+	RUMP_SERVER=unix://commsock $(atf_get_srcdir)/h_client/h_reboot
+}
+
+atf_init_test_cases()
+{
+
+	atf_add_test_case basic
+	atf_add_test_case stress
+}

Index: src/tests/rump/rumpkern/h_client/Makefile
diff -u /dev/null src/tests/rump/rumpkern/h_client/Makefile:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/h_client/Makefile	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,20 @@
+#	$NetBSD: Makefile,v 1.1 2010/11/30 22:09:15 pooka Exp $
+#
+
+.include <bsd.own.mk>
+
+TESTSDIR=	${TESTSBASE}/rump/rumpkern/h_client
+
+TESTS_C+=	h_reboot
+TESTS_C+=	h_simplecli
+TESTS_C+=	h_stresscli
+
+ATFFILE=	no
+
+LDADD+=			-lrumpclient
+LDADD.h_stresscli=	-lpthread
+
+WARNS=	4
+NOMAN=
+
+.include <bsd.test.mk>
Index: src/tests/rump/rumpkern/h_client/h_reboot.c
diff -u /dev/null src/tests/rump/rumpkern/h_client/h_reboot.c:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/h_client/h_reboot.c	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,22 @@
+/*	$NetBSD: h_reboot.c,v 1.1 2010/11/30 22:09:15 pooka Exp $	*/
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <rump/rump_syscalls.h>
+#include <rump/rumpclient.h>
+
+int
+main(void)
+{
+
+	if (rumpclient_init() == -1)
+		err(1, "rumpclient init");
+
+	/* returns ENOENT, since server dies */
+	rump_sys_reboot(0, NULL);
+}
Index: src/tests/rump/rumpkern/h_client/h_simplecli.c
diff -u /dev/null src/tests/rump/rumpkern/h_client/h_simplecli.c:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/h_client/h_simplecli.c	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,23 @@
+/*	$NetBSD: h_simplecli.c,v 1.1 2010/11/30 22:09:15 pooka Exp $	*/
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <rump/rump_syscalls.h>
+#include <rump/rumpclient.h>
+
+int
+main(void)
+{
+
+	if (rumpclient_init() == -1)
+		err(1, "rumpclient init");
+
+	if (rump_sys_getpid() > 0)
+		exit(0);
+	err(1, "getpid");
+}
Index: src/tests/rump/rumpkern/h_client/h_stresscli.c
diff -u /dev/null src/tests/rump/rumpkern/h_client/h_stresscli.c:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/h_client/h_stresscli.c	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,126 @@
+/*	$NetBSD: h_stresscli.c,v 1.1 2010/11/30 22:09:15 pooka Exp $	*/
+
+#include <sys/types.h>
+#include <sys/atomic.h>
+#include <sys/sysctl.h>
+#include <sys/wait.h>
+
+#include <err.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <rump/rump_syscalls.h>
+#include <rump/rumpclient.h>
+
+static unsigned int syscalls;
+static pid_t mypid;
+
+static void
+signaali(int sig)
+{
+
+	membar_consumer();
+	printf("process did %d syscalls\n", syscalls);
+	_exit(0);
+}
+
+static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
+static char hostnamebuf[128];
+#define HOSTNAMEBASE "rumpclient"
+
+static void *
+client(void *arg)
+{
+	char buf[256];
+	size_t blen;
+
+	for (;;) {
+		pid_t pidi;
+		blen = sizeof(buf);
+		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
+		    buf, &blen, NULL, 0) == -1)
+			err(1, "sysctl");
+		if (strncmp(buf, hostnamebuf, sizeof(HOSTNAMEBASE)-1) != 0)
+			errx(1, "hostname (%s/%s) mismatch", buf, hostnamebuf);
+		atomic_inc_uint(&syscalls);
+
+		pidi = rump_sys_getpid();
+		if (pidi == -1)
+			err(1, "getpid");
+		if (pidi != mypid)
+			errx(1, "mypid mismatch");
+		atomic_inc_uint(&syscalls);
+	}
+
+	return NULL;
+}
+
+/* Stress with max 32 clients, 8 threads each (256 concurrent threads) */
+#define NCLI 32
+#define NTHR 8
+
+int
+main(int argc, char *argv[])
+{
+	pthread_t pt;
+	pid_t clis[NCLI];
+	pid_t apid;
+	int ncli = 0;
+	int i = 0, j;
+	int status;
+	int rounds;
+
+	if (argc != 2)
+		errx(1, "need roundcount");
+
+	memset(clis, 0, sizeof(clis));
+	for (rounds = 1; rounds < atoi(argv[1])*10; rounds++) {
+		while (ncli < NCLI) {
+			switch ((apid = fork())) {
+			case -1:
+				err(1, "fork failed");
+			case 0:
+				if (rumpclient_init() == -1)
+					err(1, "rumpclient init");
+
+				mypid = rump_sys_getpid();
+				sprintf(hostnamebuf, HOSTNAMEBASE "%d", mypid);
+				if (rump_sys___sysctl(hostnamemib,
+				    __arraycount(hostnamemib), NULL, NULL,
+				    hostnamebuf, strlen(hostnamebuf)+1) == -1)
+					err(1, "sethostname");
+
+				signal(SIGUSR1, signaali);
+
+				for (j = 0; j < NTHR-1; j++)
+					if (pthread_create(&pt, NULL,
+					    client, NULL) != 0)
+						err(1, "pthread create");
+				client(NULL);
+				/* NOTREACHED */
+			default:
+				ncli++;
+				clis[i] = apid;
+				break;
+			}
+			
+			i = (i + 1) % NCLI;
+		}
+
+		usleep(100000);
+		kill(clis[i], SIGUSR1);
+
+		apid = wait(&status);
+		if (apid != clis[i])
+			errx(1, "wanted pid %d, got %d\n", clis[i], apid);
+		clis[i] = 0;
+		ncli--;
+	}
+
+	for (i = 0; i < NCLI; i++)
+		if (clis[i])
+			kill(clis[i], SIGKILL);
+}

Index: src/tests/rump/rumpkern/h_server/Makefile
diff -u /dev/null src/tests/rump/rumpkern/h_server/Makefile:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/h_server/Makefile	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,17 @@
+#	$NetBSD: Makefile,v 1.1 2010/11/30 22:09:15 pooka Exp $
+#
+
+.include <bsd.own.mk>
+
+TESTSDIR=	${TESTSBASE}/rump/rumpkern/h_server
+
+TESTS_C=	h_simpleserver
+
+ATFFILE=	no
+
+LDADD+=	-lrump -lrumpuser -lpthread
+
+WARNS=	4
+NOMAN=
+
+.include <bsd.test.mk>
Index: src/tests/rump/rumpkern/h_server/h_simpleserver.c
diff -u /dev/null src/tests/rump/rumpkern/h_server/h_simpleserver.c:1.1
--- /dev/null	Tue Nov 30 22:09:15 2010
+++ src/tests/rump/rumpkern/h_server/h_simpleserver.c	Tue Nov 30 22:09:15 2010
@@ -0,0 +1,27 @@
+/*	$NetBSD: h_simpleserver.c,v 1.1 2010/11/30 22:09:15 pooka Exp $	*/
+
+#include <sys/types.h>
+
+#include <rump/rump.h>
+
+#include <err.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#define NOFAIL(e) do { int rv = e; if (rv) err(1, #e); } while (/*CONSTCOND*/0)
+
+int
+main(int argc, char *argv[])
+{
+
+	if (argc != 2)
+		exit(1);
+
+	NOFAIL(rump_daemonize_begin());
+	NOFAIL(rump_init());
+	NOFAIL(rump_init_server(argv[1]));
+	NOFAIL(rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS));
+
+	for (;;)
+		pause();
+}

Reply via email to