summaryrefslogtreecommitdiffstats
path: root/bin/tests/t_api.pl
diff options
context:
space:
mode:
Diffstat (limited to 'bin/tests/t_api.pl')
-rw-r--r--bin/tests/t_api.pl223
1 files changed, 223 insertions, 0 deletions
diff --git a/bin/tests/t_api.pl b/bin/tests/t_api.pl
new file mode 100644
index 0000000..daf0161
--- /dev/null
+++ b/bin/tests/t_api.pl
@@ -0,0 +1,223 @@
+#!/usr/local/bin/perl
+#
+# Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
+# Copyright (C) 1999-2001 Internet Software Consortium.
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+
+# $Id: t_api.pl,v 1.10 2007/06/19 23:46:59 tbox Exp $
+
+require "getopts.pl";
+
+#
+# a minimalistic test api in perl compatable with the C api
+# used for the bind 9 regression tests
+#
+
+sub t_info {
+ package t_api;
+ local($format, @rest) = @_;
+ printf("I:${format}%s", @rest);
+}
+
+sub t_result {
+ package t_api;
+ local($result) = @_;
+ $T_inresult = 1;
+ printf("R:$result\n");
+}
+
+sub t_assert {
+ package t_api;
+ local($component, $anum, $class, $what, @rest) = @_;
+ printf("A:%s:%d:%s:$what\n", $component, $anum, $class, @rest);
+}
+
+sub t_getenv {
+ package t_api;
+ local($name) = @_;
+ return($T_env{$name}) if (defined($T_env{$name}));
+}
+
+package t_api;
+
+$| = 1;
+
+sub t_on_abort {
+ $T_aborted = 1;
+ &t_info("got abort\n");
+ die;
+}
+
+sub t_on_alarm {
+ $T_timedout = 1;
+ &t_info("got alarm\n");
+ die;
+}
+
+sub t_on_int {
+ $T_terminated = 1;
+ &t_info("got int\n");
+ die;
+}
+
+# initialize the test environment
+sub t_initconf {
+ local($cfile) = @_;
+ local($name, $value);
+
+ if ((-f $cfile) && (-s _)) {
+ open(XXX, "< $cfile");
+ while (<XXX>) {
+ next if (/^\#/);
+ next unless (/=/);
+ chop;
+ ($name, $value) = split(/=/, $_, 2);
+ $T_env{$name} = $value;
+ }
+ close(XXX);
+ }
+}
+
+# dump the configuration to the journal
+sub t_dumpconf {
+ local($name, $value);
+
+ foreach $name (sort keys %T_env) {
+ &main't_info("%s\t%s\n", $name, $T_env{$name});
+ }
+}
+
+# run a test
+sub doTestN {
+ package main;
+ local($testnumber) = @_;
+ local($status);
+
+ if (defined($T_testlist[$testnumber])) {
+
+ $t_api'T_inresult = 0;
+ $t_api'T_aborted = 0;
+ $t_api'T_timedout = 0;
+ $t_api'T_terminated = 0;
+ $t_api'T_unresolved = 0;
+
+ alarm($t_api'T_timeout);
+ $status = eval($T_testlist[$testnumber]);
+ alarm(0);
+
+ if (! defined($status)) {
+ &t_info("The test case timed out\n") if ($t_api'T_timedout);
+ &t_info("The test case was terminated\n") if ($t_api'T_terminated);
+ &t_info("The test case was aborted\n") if ($t_api'T_aborted);
+ &t_result("UNRESOLVED");
+ }
+ elsif (! $t_api'T_inresult) {
+ &t_result("NORESULT");
+ }
+ }
+ else {
+ &t_info("Test %d is not defined\n", $testnumber);
+ &t_result("UNTESTED");
+ }
+}
+
+$T_usage = "Usage:
+ a : run all tests
+ b <dir> : cd to dir before running tests
+ c <configfile> : use configfile instead of t_config
+ d <level> : set debug level to level
+ h : print test info (not implemented)
+ u : print usage info
+ n <testnumber> : run test number testnumber
+ t <name> : run test named testname (not implemented)
+ q <seconds> : use seconds as the timeout value
+ x : don't execute tests in a subproc (n/a)
+";
+
+# get command line args
+&main'Getopts('ab:c:d:hun:t:q:x');
+
+# if -u, print usage and exit
+if (defined($main'opt_u)) {
+ print $T_usage;
+ exit(0);
+}
+
+# implement -h and -t after we add test descriptions to T_testlist ZZZ
+if (defined($main'opt_h)) {
+ print "the -h option is not implemented\n";
+ exit(0);
+}
+
+if (defined($main'opt_t)) {
+ print "the -t option is not implemented\n";
+ exit(0);
+}
+
+#
+# silently ignore the -x option
+# this exists in the C version of the api
+# to facilitate exception debugging with gdb
+# and is not meaningful here
+#
+
+$T_configfile = "t_config";
+$T_debug = 0;
+$T_timeout = 10;
+$T_testnum = -1;
+
+$T_dir = $main'opt_b if (defined($main'opt_b));
+$T_debug = $main'opt_d if (defined($main'opt_d));
+$T_configfile = $main'opt_c if (defined($main'opt_c));
+$T_testnum = $main'opt_n if (defined($main'opt_n));
+$T_timeout = $main'opt_q if (defined($main'opt_q));
+
+$SIG{'ABRT'} = 't_api\'t_on_abort';
+$SIG{'ALRM'} = 't_api\'t_on_alarm';
+$SIG{'INT'} = 't_api\'t_on_int';
+$SIG{'QUIT'} = 't_api\'t_on_int';
+
+# print the start line
+$date = `date`;
+chop $date;
+($cmd = $0) =~ s/\.\///g;
+printf("S:$cmd:$date\n");
+
+# initialize the test environment
+&t_initconf($T_configfile);
+&t_dumpconf() if ($T_debug);
+
+# establish working directory if requested
+chdir("$T_dir") if (defined($T_dir) && (-d "$T_dir"));
+
+# run the tests
+if ($T_testnum == -1) {
+ # run all tests
+ $T_ntests = $#main'T_testlist + 1;
+ for ($T_cnt = 0; $T_cnt < $T_ntests; ++$T_cnt) {
+ &doTestN($T_cnt);
+ }
+}
+else {
+ # otherwise run the specified test
+ &doTest($T_testnum);
+}
+
+# print the end line
+$date = `date`;
+chop $date;
+printf("E:$cmd:$date\n");
+
+1;
+