Source-Changes-HG archive

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

[src/trunk]: src/tests/lib/libc Atf-ify the db tests.



details:   https://anonhg.NetBSD.org/src/rev/65aec7c6649a
branches:  trunk
changeset: 760558:65aec7c6649a
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Fri Jan 07 15:05:57 2011 +0000

description:
Atf-ify the db tests.

XXX Note that the original regress version of this test did not run the
XXX btree_delete test; that test is broken, and is disabled for now.

diffstat:

 tests/lib/libc/Makefile    |    4 +-
 tests/lib/libc/db/Makefile |   18 +
 tests/lib/libc/db/README   |   66 +++
 tests/lib/libc/db/h_db.c   |  731 ++++++++++++++++++++++++++++++++++++
 tests/lib/libc/db/t_db.sh  |  903 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 1720 insertions(+), 2 deletions(-)

diffs (truncated from 1749 to 300 lines):

diff -r 94ca27efdca4 -r 65aec7c6649a tests/lib/libc/Makefile
--- a/tests/lib/libc/Makefile   Fri Jan 07 14:50:27 2011 +0000
+++ b/tests/lib/libc/Makefile   Fri Jan 07 15:05:57 2011 +0000
@@ -1,9 +1,9 @@
-# $NetBSD: Makefile,v 1.23 2011/01/07 02:47:40 pgoyette Exp $
+# $NetBSD: Makefile,v 1.24 2011/01/07 15:05:57 pgoyette Exp $
 
 .include <bsd.own.mk>
 .include <bsd.sys.mk>
 
-TESTS_SUBDIRS+=        gen hash ieeefp setjmp stdlib stdio string ttyio
+TESTS_SUBDIRS+=        db gen hash ieeefp setjmp stdlib stdio string ttyio
 
 .if ${HAS_SSP} == "yes"
 TESTS_SUBDIRS+=        ssp
diff -r 94ca27efdca4 -r 65aec7c6649a tests/lib/libc/db/Makefile
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lib/libc/db/Makefile        Fri Jan 07 15:05:57 2011 +0000
@@ -0,0 +1,18 @@
+# $NetBSD: Makefile,v 1.1 2011/01/07 15:05:58 pgoyette Exp $
+
+.include <bsd.own.mk>
+
+TESTSDIR=      ${TESTSBASE}/lib/libc/db
+
+TESTS_SH+=     t_db
+
+BINDIR=                ${TESTSDIR}
+MKMAN=         no
+
+PROGS+=                h_db
+
+FILESDIR=      ${TESTSDIR}
+
+FILES+=                README
+
+.include <bsd.test.mk>
diff -r 94ca27efdca4 -r 65aec7c6649a tests/lib/libc/db/README
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lib/libc/db/README  Fri Jan 07 15:05:57 2011 +0000
@@ -0,0 +1,66 @@
+#      $NetBSD: README,v 1.1 2011/01/07 15:05:58 pgoyette Exp $
+#      @(#)README      8.8 (Berkeley) 7/31/94
+
+Fairly large files (the command files) are built in this directory during
+the test runs, and even larger files (the database files) are created in
+"/var/tmp".  If the latter directory doesn't exist, set the environmental
+variable TMPDIR to a directory where the files can be built.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+The script file consists of lines with an initial character which is
+the command for that line, or an initial character indicating a key
+or data entry for a previous command.
+
+Legal command characters are as follows:
+
+c: compare a record
+       + must be followed by [kK][dD]; the data value in the database
+         associated with the specified key is compared to the specified
+         data value.
+e: echo a string
+       + writes out the rest of the line into the output file; if the
+         last character is not a carriage-return, a newline is appended.
+f: set the flags for the next command
+       + no value zero's the flags
+g: do a get command
+       + must be followed by [kK]
+       + writes out the retrieved data DBT.
+o [r]: dump [reverse]
+       + dump the database out, if 'r' is set, in reverse order.
+p: do a put command
+       + must be followed by [kK][dD]
+r: do a del command
+       + must be followed by [kK] unless R_CURSOR flag set.
+S: sync the database
+s: do a seq command
+       + must be followed by [kK] if R_CURSOR flag set.
+       + writes out the retrieved data DBT.
+
+Legal key/data characters are as follows:
+
+D [file]: data file
+       + set the current data value to the contents of the file
+d [data]:
+       + set the current key value to the contents of the line.
+K [file]: key file
+       + set the current key value to the contents of the file
+k [data]:
+       + set the current key value to the contents of the line.
+
+Blank lines, lines with leading white space, and lines with leading
+hash marks (#) are ignored.
+
+Options to dbtest are as follows:
+
+       -d: Set the DB_LOCK flag.
+       -f: Use the file argument as the database file.
+       -i: Use the rest of the argument to set elements in the info
+           structure.  If the type is btree, then "-i cachesize=10240"
+           will set BTREEINFO.cachesize to 10240.
+       -o: The rest of the argument is the output file instead of
+           using stdout.
+       -s: Don't delete the database file before opening it, i.e.
+           use the database file from a previous run.
+
+Dbtest requires two arguments, the type of access "hash", "recno"
+or "btree", and the script name or "-" to indicate stdin.
diff -r 94ca27efdca4 -r 65aec7c6649a tests/lib/libc/db/h_db.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/lib/libc/db/h_db.c  Fri Jan 07 15:05:57 2011 +0000
@@ -0,0 +1,731 @@
+/*     $NetBSD: h_db.c,v 1.1 2011/01/07 15:05:58 pgoyette Exp $        */
+
+/*-
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  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 University 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 REGENTS 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 REGENTS 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 <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1992, 1993, 1994\
+       The Regents of the University of California.  All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)dbtest.c   8.17 (Berkeley) 9/1/94";
+#else
+__RCSID("$NetBSD: h_db.c,v 1.1 2011/01/07 15:05:58 pgoyette Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <err.h>
+#include <db.h>
+
+enum S { COMMAND, COMPARE, GET, PUT, REMOVE, SEQ, SEQFLAG, KEY, DATA };
+
+static void     compare(DBT *, DBT *);
+static DBTYPE   dbtype(const char *);
+static void     dump(DB *, int);
+static void     get(DB *, DBT *);
+static void     getdata(DB *, DBT *, DBT *);
+static void     put(DB *, DBT *, DBT *);
+static void     rem(DB *, DBT *);
+static const char *sflags(int);
+static void     synk(DB *);
+static void    *rfile(char *, size_t *);
+static void     seq(DB *, DBT *);
+static u_int    setflags(char *);
+static void    *setinfo(DBTYPE, char *);
+static void     usage(void) __attribute__((__noreturn__));
+static void    *xcopy(void *, size_t);
+static void     chkcmd(enum S);
+static void     chkdata(enum S);
+static void     chkkey(enum S);
+
+#ifdef STATISTICS
+extern void __bt_stat(DB *);
+#endif
+
+static DBTYPE type;                    /* Database type. */
+static void *infop;                    /* Iflags. */
+static size_t lineno;                  /* Current line in test script. */
+static u_int flags;                            /* Current DB flags. */
+static int ofd = STDOUT_FILENO;                /* Standard output fd. */
+
+static DB *XXdbp;                      /* Global for gdb. */
+static size_t XXlineno;                        /* Fast breakpoint for gdb. */
+
+int
+main(int argc, char *argv[])
+{
+       extern int optind;
+       extern char *optarg;
+       enum S command = COMMAND, state;
+       DB *dbp;
+       DBT data, key, keydata;
+       size_t len;
+       int ch, oflags, sflag;
+       char *fname, *infoarg, *p, *t, buf[8 * 1024];
+       bool unlink_dbfile;
+
+       infoarg = NULL;
+       fname = NULL;
+       unlink_dbfile = false;
+       oflags = O_CREAT | O_RDWR;
+       sflag = 0;
+       while ((ch = getopt(argc, argv, "f:i:lo:s")) != -1)
+               switch (ch) {
+               case 'f':
+                       fname = optarg;
+                       break;
+               case 'i':
+                       infoarg = optarg;
+                       break;
+               case 'l':
+                       oflags |= DB_LOCK;
+                       break;
+               case 'o':
+                       if ((ofd = open(optarg,
+                           O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
+                               err(1, "Cannot create `%s'", optarg);
+                       break;
+               case 's':
+                       sflag = 1;
+                       break;
+               case '?':
+               default:
+                       usage();
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc != 2)
+               usage();
+
+       /* Set the type. */
+       type = dbtype(*argv++);
+
+       /* Open the descriptor file. */
+        if (strcmp(*argv, "-") && freopen(*argv, "r", stdin) == NULL)
+           err(1, "Cannot reopen `%s'", *argv);
+
+       /* Set up the db structure as necessary. */
+       if (infoarg == NULL)
+               infop = NULL;
+       else
+               for (p = strtok(infoarg, ",\t "); p != NULL;
+                   p = strtok(0, ",\t "))
+                       if (*p != '\0')
+                               infop = setinfo(type, p);
+
+       /*
+        * Open the DB.  Delete any preexisting copy, you almost never
+        * want it around, and it often screws up tests.
+        */
+       if (fname == NULL) {
+               const char *q = getenv("TMPDIR");
+               if (q == NULL)
+                       q = "/var/tmp";
+               (void)snprintf(buf, sizeof(buf), "%s/__dbtest", q);
+               fname = buf;
+               (void)unlink(buf);
+               unlink_dbfile = true;
+       } else  if (!sflag)
+               (void)unlink(fname);
+
+       if ((dbp = dbopen(fname,
+           oflags, S_IRUSR | S_IWUSR, type, infop)) == NULL)
+               err(1, "Cannot dbopen `%s'", fname);
+       XXdbp = dbp;
+       if (unlink_dbfile)
+               (void)unlink(fname);
+
+       state = COMMAND;
+       for (lineno = 1;
+           (p = fgets(buf, sizeof(buf), stdin)) != NULL; ++lineno) {
+               /* Delete the newline, displaying the key/data is easier. */
+               if (ofd == STDOUT_FILENO && (t = strchr(p, '\n')) != NULL)
+                       *t = '\0';
+               if ((len = strlen(buf)) == 0 || isspace((unsigned char)*p) ||
+                   *p == '#')
+                       continue;
+



Home | Main Index | Thread Index | Old Index