Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/fs/puffs Add test cases for file servers which present...



details:   https://anonhg.NetBSD.org/src/rev/0e3591d5a963
branches:  trunk
changeset: 756151:0e3591d5a963
user:      pooka <pooka%NetBSD.org@localhost>
date:      Wed Jul 07 10:49:51 2010 +0000

description:
Add test cases for file servers which present the root node not as
a directory but as a regular file, symbolic link (although that
can't be unmounted without killing the server!), fifo or character
device.

diffstat:

 tests/fs/puffs/Makefile  |    7 +-
 tests/fs/puffs/t_basic.c |  246 +++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 214 insertions(+), 39 deletions(-)

diffs (truncated from 336 to 300 lines):

diff -r 19300ecb22ac -r 0e3591d5a963 tests/fs/puffs/Makefile
--- a/tests/fs/puffs/Makefile   Wed Jul 07 10:47:39 2010 +0000
+++ b/tests/fs/puffs/Makefile   Wed Jul 07 10:49:51 2010 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: Makefile,v 1.4 2010/07/06 14:44:30 pooka Exp $
+#      $NetBSD: Makefile,v 1.5 2010/07/07 10:49:51 pooka Exp $
 #
 
 .include <bsd.own.mk>
@@ -10,7 +10,10 @@
 TESTS_C=       t_basic
 
 LDADD+=                -lrumpdev_putter -lrumpdev
-LDADD+=                -lrumpfs_syspuffs -lrumpvfs -lrump -lrumpuser -lpthread
+LDADD+=                -lrumpfs_syspuffs -lrumpvfs_fifofs
+LDADD+=                -lrumpnet_local -lrumpnet_net -lrumpnet
+LDADD+=                -lrumpvfs
+LDADD+=                -lrump -lrumpuser -lpthread
 
 .include <bsd.test.mk>
 .include <bsd.subdir.mk>
diff -r 19300ecb22ac -r 0e3591d5a963 tests/fs/puffs/t_basic.c
--- a/tests/fs/puffs/t_basic.c  Wed Jul 07 10:47:39 2010 +0000
+++ b/tests/fs/puffs/t_basic.c  Wed Jul 07 10:49:51 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: t_basic.c,v 1.2 2010/07/06 15:42:24 pooka Exp $        */
+/*     $NetBSD: t_basic.c,v 1.3 2010/07/07 10:49:51 pooka Exp $        */
 
 #include <sys/types.h>
 #include <sys/mount.h>
@@ -9,6 +9,7 @@
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <pthread.h>
 #include <puffs.h>
 #include <stdio.h>
 #include <unistd.h>
@@ -158,9 +159,6 @@
        ssize_t n;
        int rv;
 
-       if (argc < 2)
-               errx(1, "invalid usage");
-
        /* Create sucketpair for communication with the real file server */
        if (socketpair(PF_LOCAL, SOCK_STREAM, 0, sv) == -1)
                err(1, "socketpair");
@@ -170,14 +168,13 @@
                close(sv[1]);
                snprintf(comfd, sizeof(sv[0]), "%d", sv[0]);
                if (setenv("PUFFS_COMFD", comfd, 1) == -1)
-                       err(1, "setenv");
+                       atf_tc_fail_errno("setenv");
 
-               argv++;
                if (execvp(argv[0], argv) == -1)
-                       err(1, "execvp here");
+                       atf_tc_fail_errno("execvp");
                /*NOTREACHED*/
        case -1:
-               err(1, "fork");
+               atf_tc_fail_errno("fork");
                /*NOTREACHED*/
        default:
                close(sv[0]);
@@ -215,37 +212,36 @@
        return 0;
 }
 
-ATF_TC(mount);
-ATF_TC_HEAD(mount, tc)
-{
-
-       atf_tc_set_md_var(tc, "descr", "puffs+dtfs un/mount test");
-}
-
-char *dtfsargv[] = {
-       "dtfs",
-       "BUILT_AT_RUNTIME",
-       "dtfs",
-       "/mp",
-       NULL
-};
-
-ATF_TC_BODY(mount, tc)
+#define dtfsmountv(a, b)                                               \
+    struct puffs_args pa;                                              \
+    dtfsmount1(a, __arraycount(b), b, atf_tc_get_config_var(tc, "srcdir"), &pa)
+static void
+dtfsmount1(const char *mp, int optcount, char *opts[], const char *srcdir,
+       struct puffs_args *pa)
 {
        char canon_dev[MAXPATHLEN], canon_dir[MAXPATHLEN];
-       char dtfs_path[MAXPATHLEN];
-       struct puffs_args pargs;
+       char dtfs_path[MAXPATHLEN], mountpath[MAXPATHLEN];
+       char **dtfsargv;
        int mntflag;
-       int rv;
+       int rv, i;
        int fd;
 
+       dtfsargv = malloc(sizeof(char *) * (optcount+3));
+
        /* build dtfs exec path for atf */
-       sprintf(dtfs_path, "%s/h_dtfs/h_dtfs",
-           atf_tc_get_config_var(tc, "srcdir"));
-       dtfsargv[1] = dtfs_path;
+       sprintf(dtfs_path, "%s/h_dtfs/h_dtfs", srcdir);
+       dtfsargv[0] = dtfs_path;
+
+       for (i = 0; i < optcount; i++) {
+               dtfsargv[i+1] = opts[i];
+       }
 
-       rv = parseargs(__arraycount(dtfsargv), dtfsargv,
-           &pargs, &mntflag, canon_dev, canon_dir);
+       strlcpy(mountpath, mp, sizeof(mountpath));
+       dtfsargv[optcount+1] = mountpath;
+       dtfsargv[optcount+2] = NULL;
+
+       rv = parseargs(optcount+3, dtfsargv,
+           pa, &mntflag, canon_dev, canon_dir);
        if (rv)
                atf_tc_fail("comfd parseargs");
 
@@ -254,27 +250,203 @@
        if (fd == -1)
                atf_tc_fail_errno("open puffs fd");
 #if 0
-       pargs->pa_fd = fd;
+       pa->pa_fd = fd;
 #else
        assert(fd == 0); /* XXX: FIXME */
 #endif
 
-       if (rump_sys_mkdir("/mp", 0777) == -1)
+       if (rump_sys_mkdir(mp, 0777) == -1)
                atf_tc_fail_errno("mkdir mountpoint");
 
-       if (rump_sys_mount(MOUNT_PUFFS, "/mp", 0,
-           pargs.us_pargs, pargs.us_pargslen) == -1)
+       if (rump_sys_mount(MOUNT_PUFFS, mp, 0,
+           pa->us_pargs, pa->us_pargslen) == -1)
                atf_tc_fail_errno("mount");
 
-       rumpshovels(fd, pargs.us_servfd);
+       rumpshovels(fd, pa->us_servfd);
+}
+
+ATF_TC(mount);
+ATF_TC_HEAD(mount, tc)
+{
+
+       atf_tc_set_md_var(tc, "descr", "puffs+dtfs un/mount test");
+}
+
+ATF_TC_BODY(mount, tc)
+{
+       char *myopts[] = {
+               "dtfs",
+       };
+
+       dtfsmountv("/mp", myopts);
+       if (rump_sys_unmount("/mp", 0) == -1)
+               atf_tc_fail_errno("unmount");
+}
+
+ATF_TC(root_reg);
+ATF_TC_HEAD(root_reg, tc)
+{
+       atf_tc_set_md_var(tc, "descr", "root is a regular file");
+}
+
+ATF_TC_BODY(root_reg, tc)
+{
+       char *myopts[] = {
+               "-r","reg",
+               "dtfs",
+       };
+       int fd, rv;
+
+       dtfsmountv("/mp", myopts);
+
+       fd = rump_sys_open("/mp", O_RDWR);
+       if (fd == -1)
+               atf_tc_fail_errno("open root");
+       if (rump_sys_write(fd, &fd, sizeof(fd)) != sizeof(fd))
+               atf_tc_fail_errno("write to root");
+       rv = rump_sys_mkdir("/mp/test", 0777);
+       ATF_REQUIRE(errno == ENOTDIR);
+       ATF_REQUIRE(rv == -1);
+       rump_sys_close(fd);
+
+       if (rump_sys_unmount("/mp", 0) == -1)
+               atf_tc_fail_errno("unmount");
+}
+
+ATF_TC(root_lnk);
+ATF_TC_HEAD(root_lnk, tc)
+{
+
+       atf_tc_set_md_var(tc, "descr", "root is a symbolic link");
+}
+
+#define LINKSTR "/path/to/nowhere"
+ATF_TC_BODY(root_lnk, tc)
+{
+       char *myopts[] = {
+               "-r", "lnk " LINKSTR,
+               "-s",
+               "dtfs",
+       };
+       char buf[PATH_MAX];
+       ssize_t len;
+       int rv;
+
+       dtfsmountv("/mp", myopts);
+
+       if ((len = rump_sys_readlink("/mp", buf, sizeof(buf)-1)) == -1)
+               atf_tc_fail_errno("readlink");
+       buf[len] = '\0';
+
+       ATF_REQUIRE_STREQ(buf, LINKSTR);
+
+#if 0 /* XXX: unmount uses FOLLOW */
+       if (rump_sys_unmount("/mp", 0) == -1)
+               atf_tc_fail_errno("unmount");
+#endif
 
+       /*
+        * XXX2: due to atf issue #53, we must make sure the child dies
+        * before we exit.
+        */
+       if (kill(pa.us_childpid, SIGTERM) == -1)
+               err(1, "kill");
+}
+
+ATF_TC(root_fifo);
+ATF_TC_HEAD(root_fifo, tc)
+{
+
+       atf_tc_set_md_var(tc, "descr", "root is a symbolic link");
+}
+
+#define MAGICSTR "nakit ja muusiperunat maustevoilla"
+static void *
+dofifow(void *arg)
+{
+       int fd = (int)(uintptr_t)arg;
+       char buf[512];
+
+       printf("writing\n");
+       strcpy(buf, MAGICSTR);
+       if (rump_sys_write(fd, buf, strlen(buf)+1) != strlen(buf)+1)
+               atf_tc_fail_errno("write to fifo");
+
+       return NULL;
+}
+
+ATF_TC_BODY(root_fifo, tc)
+{
+       char *myopts[] = {
+               "-r", "fifo",
+               "dtfs",
+       };
+       pthread_t pt;
+       char buf[512];
+       ssize_t len;
+       int fd;
+
+       dtfsmountv("/mp", myopts);
+       fd = rump_sys_open("/mp", O_RDWR);
+       if (fd == -1)
+               atf_tc_fail_errno("open fifo");
+
+       pthread_create(&pt, NULL, dofifow, (void *)(uintptr_t)fd);
+
+       printf("reading\n");
+       memset(buf, 0, sizeof(buf));
+       if (rump_sys_read(fd, buf, sizeof(buf)) == -1)
+               atf_tc_fail_errno("read fifo");
+
+       ATF_REQUIRE_STREQ(buf, MAGICSTR);
+
+       rump_sys_close(fd);
+       if (rump_sys_unmount("/mp", 0) == -1)
+               atf_tc_fail_errno("unmount");
+}
+
+ATF_TC(root_chrdev);
+ATF_TC_HEAD(root_chrdev, tc)
+{
+
+       atf_tc_set_md_var(tc, "descr", "root is /dev/null");
+}
+
+ATF_TC_BODY(root_chrdev, tc)
+{



Home | Main Index | Thread Index | Old Index