From f02c3d40cb25d5d7b0c184a6822a21e1ddebf4d5 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Tue, 31 May 2011 09:30:41 +0100 Subject: [PATCH] tests: Add tests for the vlserver Add some very simple vlserver tests Change-Id: I862d3a86857dc70f0421f4887d1fc4d047c57909 Reviewed-on: http://gerrit.openafs.org/5029 Tested-by: Simon Wilkinson Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- Makefile.in | 1 + configure.ac | 3 +- tests/Makefile.in | 2 +- tests/common/Makefile.in | 2 +- tests/common/common.h | 6 ++ tests/common/servers.c | 65 ++++++++++++++++++ tests/volser/.gitignore | 1 + tests/volser/Makefile.in | 32 +++++++++ tests/volser/vos-t.c | 141 +++++++++++++++++++++++++++++++++++++++ 9 files changed, 250 insertions(+), 3 deletions(-) create mode 100644 tests/common/servers.c create mode 100644 tests/volser/.gitignore create mode 100644 tests/volser/Makefile.in create mode 100644 tests/volser/vos-t.c diff --git a/Makefile.in b/Makefile.in index 295ad55bbf..557b2fba29 100644 --- a/Makefile.in +++ b/Makefile.in @@ -937,6 +937,7 @@ distclean: clean tests/cmd/Makefile \ tests/common/Makefile \ tests/util/Makefile \ + tests/volser/Makefile \ src/helper-splint.sh if test -d doc/man-pages ; then \ rm -f doc/man-pages/Makefile doc/man-pages/install-man ; \ diff --git a/configure.ac b/configure.ac index 0675a99b69..97ef4173dd 100644 --- a/configure.ac +++ b/configure.ac @@ -250,7 +250,8 @@ tests/cmd/Makefile \ tests/common/Makefile \ tests/rpctestlib/Makefile \ tests/tap/Makefile \ -tests/util/Makefile, +tests/util/Makefile \ +tests/volser/Makefile, [chmod a+x src/config/shlib-build chmod a+x src/config/shlib-install]) diff --git a/tests/Makefile.in b/tests/Makefile.in index 550312cae4..6029e69871 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -9,7 +9,7 @@ include @TOP_OBJDIR@/src/config/Makefile.pthread MODULE_CFLAGS = -DSOURCE='"$(abs_top_srcdir)/tests"' \ -DBUILD='"$(abs_top_builddir)/tests"' -SUBDIRS = tap common auth util cmd +SUBDIRS = tap common auth util cmd volser all: runtests @for A in $(SUBDIRS); do cd $$A && $(MAKE) $@ && cd .. || exit 1; done diff --git a/tests/common/Makefile.in b/tests/common/Makefile.in index 225d06a29b..29b33e357f 100644 --- a/tests/common/Makefile.in +++ b/tests/common/Makefile.in @@ -6,7 +6,7 @@ include @TOP_OBJDIR@/src/config/Makefile.pthread MODULE_CFLAGS=-I$(srcdir)/.. -all check test tests: config.o +all check test tests: config.o servers.o clean: rm -f *.o diff --git a/tests/common/common.h b/tests/common/common.h index 2bd2a27ed3..6109b191fd 100644 --- a/tests/common/common.h +++ b/tests/common/common.h @@ -22,8 +22,14 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* config.c */ extern char *afstest_BuildTestConfig(void); extern void afstest_UnlinkTestConfig(char *); struct afsconf_dir; extern int afstest_AddDESKeyFile(struct afsconf_dir *dir); + +/* servers.c */ + +extern int afstest_StartVLServer(char *dirname, pid_t *serverPid); +extern int afstest_StopVLServer(pid_t serverPid); diff --git a/tests/common/servers.c b/tests/common/servers.c new file mode 100644 index 0000000000..18b94028f8 --- /dev/null +++ b/tests/common/servers.c @@ -0,0 +1,65 @@ +#include +#include + +#include + +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +#include "common.h" + +/* Start up the VLserver, using the configuration in dirname, and putting our + * logs there too. + */ + +int +afstest_StartVLServer(char *dirname, pid_t *serverPid) +{ + pid_t pid; + + pid = fork(); + if (pid == -1) { + exit(1); + /* Argggggghhhhh */ + } else if (pid == 0) { + char *binPath, *logPath, *dbPath, *build; + + /* Child */ + build = getenv("BUILD"); + + if (build == NULL) + build = ".."; + + asprintf(&binPath, "%s/../src/tvlserver/vlserver", build); + asprintf(&logPath, "%s/VLLog", dirname); + asprintf(&dbPath, "%s/vldb", dirname); + execl(binPath, "vlserver", + "-logfile", logPath, "-database", dbPath, "-config", dirname, NULL); + fprintf(stderr, "Running %s failed\n", binPath); + exit(1); + } + *serverPid = pid; + + return 0; +} + +int +afstest_StopVLServer(pid_t serverPid) +{ + int status; + + kill(serverPid, SIGTERM); + + waitpid(serverPid, &status, 0); + + if (WIFSIGNALED(status) && WTERMSIG(status) != SIGTERM) { + fprintf(stderr, "Server died exited on signal %d\n", WTERMSIG(status)); + return -1; + } + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { + fprintf(stderr, "Server exited with code %d\n", WEXITSTATUS(status)); + return -1; + } + return 0; +} diff --git a/tests/volser/.gitignore b/tests/volser/.gitignore new file mode 100644 index 0000000000..095539b906 --- /dev/null +++ b/tests/volser/.gitignore @@ -0,0 +1 @@ +/vos-t diff --git a/tests/volser/Makefile.in b/tests/volser/Makefile.in new file mode 100644 index 0000000000..29b14b1cdb --- /dev/null +++ b/tests/volser/Makefile.in @@ -0,0 +1,32 @@ + +srcdir=@srcdir@ +abs_top_builddir=@abs_top_builddir@ +include @TOP_OBJDIR@/src/config/Makefile.config +include @TOP_OBJDIR@/src/config/Makefile.pthread + +TESTS = vos-t + +MODULE_CFLAGS=-I$(srcdir)/.. -I$(srcdir)/../common/ + +all check test tests: $(TESTS) + +# The direct reference of tviced libraries here is a colossal hack, but +# we're just not building pthreaded versions of the vldb interface at the moment. +# Soon, I hope ... + +MODULE_LIBS = ../tap/libtap.a \ + $(abs_top_builddir)/src/tviced/vldbint.cs.o \ + $(abs_top_builddir)/src/tviced/vldbint.xdr.o \ + $(abs_top_builddir)/lib/libafsauthent.a \ + $(abs_top_builddir)/lib/libafsrpc.a \ + $(abs_top_builddir)/lib/librxgk.a \ + $(abs_top_builddir)/lib/libafshcrypto.a \ + $(LIB_rfc3961) $(LIB_roken) -lafsutil\ + $(XLIBS) + +vos-t: vos-t.o ../common/config.o ../common/servers.o + $(AFS_LDRULE) vos-t.o ../common/config.o ../common/servers.o \ + $(MODULE_LIBS) + +clean: + rm -f *.o $(TESTS) diff --git a/tests/volser/vos-t.c b/tests/volser/vos-t.c new file mode 100644 index 0000000000..e1ffec6a3a --- /dev/null +++ b/tests/volser/vos-t.c @@ -0,0 +1,141 @@ +#include +#include + +#include + +#include +#include + +#include +#include +#include + +#include + +#include "common.h" + +/* This checks for a bug in vos where it would fail to allocate additional + * space for the results of multi homed VL_GetAddrsU, and so would segfault + * if a host with a small number of addresses was immediately followed by + * a host with a large number of addresses. + */ +void +TestListAddrs(struct ubik_client *client, char *dirname) +{ + int code; + bulkaddrs addrs; + pid_t pid; + int outpipe[2]; + int status; + char *buffer; + size_t len; + + afs_uint32 addrsA[] = {0x0a000000}; + afs_uint32 addrsB[] = {0x0a000001, 0x0a000002, 0x0a000003, 0x0a000004, + 0x0a000005, 0x0a000006, 0x0a000007, 0x0a000008, + 0x0a000009, 0x0a00000a, 0x0a00000b, 0x0a00000c, + 0x0a00000d, 0x0a00000e, 0x0a00000f}; + char uuidA[] = {0x4F, 0x44, 0x94, 0x47, 0x76, 0xBA, 0x47, 0x2C, 0x97, 0x1A, + 0x86, 0x6B, 0xC0, 0x10, 0x1A, 0x4B}; + char uuidB[] = {0x5D, 0x2A, 0x39, 0x36, 0x94, 0xB2, 0x48, 0x90, 0xA8, 0xD2, + 0x7F, 0xBC, 0x1B, 0x29, 0xDA, 0x9B}; + char expecting[] = "10.0.0.0\n10.0.0.1\n10.0.0.2\n10.0.0.3\n10.0.0.4\n" + "10.0.0.5\n10.0.0.6\n10.0.0.7\n10.0.0.8\n10.0.0.9\n" + "10.0.0.10\n10.0.0.11\n10.0.0.12\n10.0.0.13\n" + "10.0.0.14\n10.0.0.15\n"; + + addrs.bulkaddrs_len = 1; + addrs.bulkaddrs_val = addrsA; + code = ubik_VL_RegisterAddrs(client, 0, (afsUUID *)uuidA, 0, &addrs); + is_int(0, code, "First address registration succeeds"); + + addrs.bulkaddrs_len = 15; + addrs.bulkaddrs_val = addrsB; + code = ubik_VL_RegisterAddrs(client, 0, (afsUUID *)uuidB, 0, &addrs); + is_int(0, code, "Second address registration succeeds"); + + /* Now we need to run vos ListAddrs and see what happens ... */ + pipe(outpipe); + pid = fork(); + if (pid == 0) { + dup2(outpipe[1], STDOUT_FILENO); /* Redirect stdout into pipe */ + close(outpipe[0]); + close(outpipe[1]); + + execl("../../src/volser/vos", "vos", + "listaddrs", "-config", dirname, "-noauth", NULL); + } + close(outpipe[1]); + buffer = malloc(4096); + len = read(outpipe[0], buffer, 4096); + waitpid(pid, &status, 0); + buffer[len]='\0'; + is_string(expecting, buffer, "vos output matches"); + free(buffer); +} + +int +main(int argc, char **argv) +{ + char *dirname; + struct afsconf_dir *dir; + struct afsconf_cell info; + int code; + int i; + pid_t serverPid; + struct rx_securityClass *secClass; + struct rx_connection *serverconns[MAXSERVERS]; + struct ubik_client *ubikClient = NULL; + int secIndex; + + plan(5); + + code = rx_Init(0); + + dirname = afstest_BuildTestConfig(); + + dir = afsconf_Open(dirname); + + code = afstest_AddDESKeyFile(dir); + if (code) { + afs_com_err("vos-t", code, "while adding test DES keyfile"); + exit(1); + } + + code = afstest_StartVLServer(dirname, &serverPid); + if (code) { + afs_com_err("vos-t", code, "while starting the vlserver"); + exit(1); + } + + /* Let it figure itself out ... */ + sleep(5); + + code = afsconf_ClientAuthSecure(dir, &secClass, &secIndex); + if (code) { + afs_com_err("vos-t", code, "while getting a fake token"); + exit(1); + } + + code = afsconf_GetCellInfo(dir, NULL, AFSCONF_VLDBSERVICE, &info); + if (code) { + afs_com_err("vos-t", code, " while getting addresses from cellservdb"); + exit(1); + } + ok(info.numServers < MAXSERVERS, "Number of servers is within range"); + + for (i = 0; i < info.numServers; i++) + serverconns[i] = rx_NewConnection(info.hostAddr[i].sin_addr.s_addr, + info.hostAddr[i].sin_port, + USER_SERVICE_ID, + secClass, secIndex); + + code = ubik_ClientInit(serverconns, &ubikClient); + + TestListAddrs(ubikClient, dirname); + + code = afstest_StopVLServer(serverPid); + is_int(0, code, "Server exited cleanly"); + + return 0; +}