summaryrefslogtreecommitdiffstats
path: root/tools/regression
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2005-09-19 02:59:09 +0000
committermarcel <marcel@FreeBSD.org>2005-09-19 02:59:09 +0000
commit37a0bbb7e543c6b2a2f055d676d5a94f781d7738 (patch)
treeb5a45458715ce67d2f673351863aa2e86c6240eb /tools/regression
parentc4edd4f5db75011203e2cd66344a1a2b600e8141 (diff)
downloadFreeBSD-src-37a0bbb7e543c6b2a2f055d676d5a94f781d7738.zip
FreeBSD-src-37a0bbb7e543c6b2a2f055d676d5a94f781d7738.tar.gz
Add the beginnings of a testsuite for testing GPT control requests.
The testsuite is based on a simple driver program that builds a request from the arguments passed to it and issues the request to Geom. The driver emits FAIL with the error string or PASS depending on whether the request completed with an error or not. A -v option has been added to the driver and causes the request to be dumped. The -v option to prove(1) controls the -v option to the driver. The testsuite itself contains a hash of which the key constitutes the arguments and the value is the expected result.
Diffstat (limited to 'tools/regression')
-rw-r--r--tools/regression/geom_gpt/gctl.t86
-rw-r--r--tools/regression/geom_gpt/test.c137
2 files changed, 223 insertions, 0 deletions
diff --git a/tools/regression/geom_gpt/gctl.t b/tools/regression/geom_gpt/gctl.t
new file mode 100644
index 0000000..15335a0
--- /dev/null
+++ b/tools/regression/geom_gpt/gctl.t
@@ -0,0 +1,86 @@
+#!/usr/bin/env perl -w
+#
+# Copyright (c) 2005 Marcel Moolenaar
+# 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 AUTHOR ``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 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.
+#
+# $FreeBSD$
+
+my $srcdir = `dirname $0`;
+chomp $srcdir;
+
+my $cmd = "/tmp/$$";
+my $out = "$cmd.out";
+
+my %tests = (
+ "" => "FAIL Verb missing",
+ "-s verb=invalid" => "FAIL 22 verb 'invalid'",
+ # create
+ "-s verb=create" => "FAIL 87 provider",
+ "-s verb=create -s provider=invalid" => "FAIL 22 provider 'invalid'",
+);
+
+sub run ($$) {
+ local ($nr, $test) = @_;
+ local $st;
+
+ if (exists $ENV{'TEST_VERBOSE'}) {
+ system("$cmd -v $test > $out 2>&1");
+ system("cat $out");
+ }
+ else {
+ system("$cmd $test > $out 2>&1");
+ }
+ $st = `tail -1 $out`;
+ if ($st =~ "^$tests{$test}") {
+ print "ok $nr\n";
+ } else {
+ print "not ok $nr # $st\n";
+ }
+ unlink $out;
+}
+
+# Compile the driver...
+my $st = system("cc -o $cmd -g $srcdir/test.c -lgeom");
+if ($st != 0) {
+ print "1..0 # SKIP error compiling test.c\n";
+ exit 0;
+}
+
+# Make sure we have permission to use gctl...
+if (`$cmd` =~ "^FAIL Permission denied") {
+ print "1..0 # SKIP not enough permission\n";
+ unlink $cmd;
+ exit 0;
+}
+
+$count = keys (%tests);
+print "1..$count\n";
+
+my $nr=0;
+foreach $test (keys %tests) {
+ run ++$nr, $test;
+}
+
+unlink $cmd;
+exit 0;
diff --git a/tools/regression/geom_gpt/test.c b/tools/regression/geom_gpt/test.c
new file mode 100644
index 0000000..4b092d5
--- /dev/null
+++ b/tools/regression/geom_gpt/test.c
@@ -0,0 +1,137 @@
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * 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 AUTHOR ``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 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>
+__FBSDID("$FreeBSD$");
+
+#include <errno.h>
+#include <libgeom.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int verbose;
+
+static void
+usage()
+{
+ fprintf(stdout, "usage: %s [-v] param ...\n", getprogname());
+ exit(1);
+}
+
+static int
+parse(char *arg, char **param, char **value)
+{
+ char *e;
+
+ *param = arg;
+ e = strchr(arg, '=');
+ if (e != NULL) {
+ *e = '\0';
+ *value = e + 1;
+ } else
+ *value = NULL;
+ return (0);
+}
+
+static int
+add_int32(struct gctl_req *req, char *arg)
+{
+ char *param, *nptr, *endptr;
+ uint32_t value;
+ int error;
+
+ error = parse(arg, &param, &nptr);
+ if (error)
+ return (error);
+ if (nptr == NULL)
+ return (EINVAL);
+ value = strtol(nptr, &endptr, 0);
+ if (*endptr)
+ return (EINVAL);
+ gctl_ro_param(req, param, sizeof(value), &value);
+ return (0);
+}
+
+static int
+add_string(struct gctl_req *req, char *arg)
+{
+ char *param, *value;
+ int error;
+
+ error = parse(arg, &param, &value);
+ if (error)
+ return (error);
+ if (value == NULL)
+ return (EINVAL);
+
+ gctl_ro_param(req, param, -1, value);
+ return (0);
+}
+
+int main(int argc, char *argv[])
+{
+ struct gctl_req *req;
+ const char *s;
+ int c;
+
+ req = gctl_get_handle();
+ gctl_ro_param(req, "class", -1, "GPT");
+
+ while ((c = getopt(argc, argv, "4:s:v")) != -1) {
+ switch (c) {
+ case '4': /* uint32_t */
+ add_int32(req, optarg);
+ break;
+ case 's': /* string */
+ add_string(req, optarg);
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ case '?':
+ default:
+ usage();
+ /* NOTREACHED */
+ break;
+ }
+ }
+ if (argc != optind)
+ usage();
+
+ if (verbose)
+ gctl_dump(req, stdout);
+
+ s = gctl_issue(req);
+ if (s != NULL)
+ printf("FAIL %s\n", s);
+ else
+ printf("PASS\n");
+ gctl_free(req);
+ return (0);
+}
OpenPOWER on IntegriCloud