xref: /minix3/external/bsd/bind/dist/bin/tests/t_api.pl (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek#!/usr/local/bin/perl
2*00b67f09SDavid van Moolenbroek#
3*00b67f09SDavid van Moolenbroek# Copyright (C) 2004, 2007, 2012  Internet Systems Consortium, Inc. ("ISC")
4*00b67f09SDavid van Moolenbroek# Copyright (C) 1999-2001  Internet Software Consortium.
5*00b67f09SDavid van Moolenbroek#
6*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek#
10*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek# AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek
18*00b67f09SDavid van Moolenbroek# Id: t_api.pl,v 1.10 2007/06/19 23:46:59 tbox Exp
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroekrequire "getopts.pl";
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek#
23*00b67f09SDavid van Moolenbroek# a minimalistic test api in perl compatable with the C api
24*00b67f09SDavid van Moolenbroek# used for the bind 9 regression tests
25*00b67f09SDavid van Moolenbroek#
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroeksub t_info {
28*00b67f09SDavid van Moolenbroek	package t_api;
29*00b67f09SDavid van Moolenbroek	local($format, @rest) = @_;
30*00b67f09SDavid van Moolenbroek	printf("I:${format}%s", @rest);
31*00b67f09SDavid van Moolenbroek}
32*00b67f09SDavid van Moolenbroek
33*00b67f09SDavid van Moolenbroeksub t_result {
34*00b67f09SDavid van Moolenbroek	package t_api;
35*00b67f09SDavid van Moolenbroek	local($result) = @_;
36*00b67f09SDavid van Moolenbroek	$T_inresult = 1;
37*00b67f09SDavid van Moolenbroek	printf("R:$result\n");
38*00b67f09SDavid van Moolenbroek}
39*00b67f09SDavid van Moolenbroek
40*00b67f09SDavid van Moolenbroeksub t_assert {
41*00b67f09SDavid van Moolenbroek	package t_api;
42*00b67f09SDavid van Moolenbroek	local($component, $anum, $class, $what, @rest) = @_;
43*00b67f09SDavid van Moolenbroek	printf("A:%s:%d:%s:$what\n", $component, $anum, $class, @rest);
44*00b67f09SDavid van Moolenbroek}
45*00b67f09SDavid van Moolenbroek
46*00b67f09SDavid van Moolenbroeksub t_getenv {
47*00b67f09SDavid van Moolenbroek	package t_api;
48*00b67f09SDavid van Moolenbroek	local($name) = @_;
49*00b67f09SDavid van Moolenbroek	return($T_env{$name}) if (defined($T_env{$name}));
50*00b67f09SDavid van Moolenbroek}
51*00b67f09SDavid van Moolenbroek
52*00b67f09SDavid van Moolenbroekpackage t_api;
53*00b67f09SDavid van Moolenbroek
54*00b67f09SDavid van Moolenbroek$| = 1;
55*00b67f09SDavid van Moolenbroek
56*00b67f09SDavid van Moolenbroeksub t_on_abort {
57*00b67f09SDavid van Moolenbroek	$T_aborted = 1;
58*00b67f09SDavid van Moolenbroek	&t_info("got abort\n");
59*00b67f09SDavid van Moolenbroek	die;
60*00b67f09SDavid van Moolenbroek}
61*00b67f09SDavid van Moolenbroek
62*00b67f09SDavid van Moolenbroeksub t_on_alarm {
63*00b67f09SDavid van Moolenbroek	$T_timedout = 1;
64*00b67f09SDavid van Moolenbroek	&t_info("got alarm\n");
65*00b67f09SDavid van Moolenbroek	die;
66*00b67f09SDavid van Moolenbroek}
67*00b67f09SDavid van Moolenbroek
68*00b67f09SDavid van Moolenbroeksub t_on_int {
69*00b67f09SDavid van Moolenbroek	$T_terminated = 1;
70*00b67f09SDavid van Moolenbroek	&t_info("got int\n");
71*00b67f09SDavid van Moolenbroek	die;
72*00b67f09SDavid van Moolenbroek}
73*00b67f09SDavid van Moolenbroek
74*00b67f09SDavid van Moolenbroek# initialize the test environment
75*00b67f09SDavid van Moolenbroeksub t_initconf {
76*00b67f09SDavid van Moolenbroek	local($cfile) = @_;
77*00b67f09SDavid van Moolenbroek	local($name, $value);
78*00b67f09SDavid van Moolenbroek
79*00b67f09SDavid van Moolenbroek	if ((-f $cfile) && (-s _)) {
80*00b67f09SDavid van Moolenbroek		open(XXX, "< $cfile");
81*00b67f09SDavid van Moolenbroek		while (<XXX>) {
82*00b67f09SDavid van Moolenbroek			next if (/^\#/);
83*00b67f09SDavid van Moolenbroek			next unless (/=/);
84*00b67f09SDavid van Moolenbroek			chop;
85*00b67f09SDavid van Moolenbroek			($name, $value) = split(/=/, $_, 2);
86*00b67f09SDavid van Moolenbroek			$T_env{$name} = $value;
87*00b67f09SDavid van Moolenbroek		}
88*00b67f09SDavid van Moolenbroek		close(XXX);
89*00b67f09SDavid van Moolenbroek	}
90*00b67f09SDavid van Moolenbroek}
91*00b67f09SDavid van Moolenbroek
92*00b67f09SDavid van Moolenbroek# dump the configuration to the journal
93*00b67f09SDavid van Moolenbroeksub t_dumpconf {
94*00b67f09SDavid van Moolenbroek	local($name, $value);
95*00b67f09SDavid van Moolenbroek
96*00b67f09SDavid van Moolenbroek	foreach $name (sort keys %T_env) {
97*00b67f09SDavid van Moolenbroek		&main't_info("%s\t%s\n", $name, $T_env{$name});
98*00b67f09SDavid van Moolenbroek	}
99*00b67f09SDavid van Moolenbroek}
100*00b67f09SDavid van Moolenbroek
101*00b67f09SDavid van Moolenbroek# run a test
102*00b67f09SDavid van Moolenbroeksub doTestN {
103*00b67f09SDavid van Moolenbroek	package main;
104*00b67f09SDavid van Moolenbroek	local($testnumber) = @_;
105*00b67f09SDavid van Moolenbroek	local($status);
106*00b67f09SDavid van Moolenbroek
107*00b67f09SDavid van Moolenbroek	if (defined($T_testlist[$testnumber])) {
108*00b67f09SDavid van Moolenbroek
109*00b67f09SDavid van Moolenbroek		$t_api'T_inresult	= 0;
110*00b67f09SDavid van Moolenbroek		$t_api'T_aborted	= 0;
111*00b67f09SDavid van Moolenbroek		$t_api'T_timedout	= 0;
112*00b67f09SDavid van Moolenbroek		$t_api'T_terminated	= 0;
113*00b67f09SDavid van Moolenbroek		$t_api'T_unresolved	= 0;
114*00b67f09SDavid van Moolenbroek
115*00b67f09SDavid van Moolenbroek		alarm($t_api'T_timeout);
116*00b67f09SDavid van Moolenbroek		$status = eval($T_testlist[$testnumber]);
117*00b67f09SDavid van Moolenbroek		alarm(0);
118*00b67f09SDavid van Moolenbroek
119*00b67f09SDavid van Moolenbroek		if (! defined($status)) {
120*00b67f09SDavid van Moolenbroek			&t_info("The test case timed out\n") if ($t_api'T_timedout);
121*00b67f09SDavid van Moolenbroek			&t_info("The test case was terminated\n") if ($t_api'T_terminated);
122*00b67f09SDavid van Moolenbroek			&t_info("The test case was aborted\n") if ($t_api'T_aborted);
123*00b67f09SDavid van Moolenbroek			&t_result("UNRESOLVED");
124*00b67f09SDavid van Moolenbroek		}
125*00b67f09SDavid van Moolenbroek		elsif (! $t_api'T_inresult) {
126*00b67f09SDavid van Moolenbroek			&t_result("NORESULT");
127*00b67f09SDavid van Moolenbroek		}
128*00b67f09SDavid van Moolenbroek	}
129*00b67f09SDavid van Moolenbroek	else {
130*00b67f09SDavid van Moolenbroek		&t_info("Test %d is not defined\n", $testnumber);
131*00b67f09SDavid van Moolenbroek		&t_result("UNTESTED");
132*00b67f09SDavid van Moolenbroek	}
133*00b67f09SDavid van Moolenbroek}
134*00b67f09SDavid van Moolenbroek
135*00b67f09SDavid van Moolenbroek$T_usage = "Usage:
136*00b67f09SDavid van Moolenbroek	a               : run all tests
137*00b67f09SDavid van Moolenbroek        b <dir>         : cd to dir before running tests
138*00b67f09SDavid van Moolenbroek        c <configfile>  : use configfile instead of t_config
139*00b67f09SDavid van Moolenbroek        d <level>       : set debug level to level
140*00b67f09SDavid van Moolenbroek        h               : print test info                       (not implemented)
141*00b67f09SDavid van Moolenbroek        u               : print usage info
142*00b67f09SDavid van Moolenbroek        n <testnumber>  : run test number testnumber
143*00b67f09SDavid van Moolenbroek        t <name>        : run test named testname		(not implemented)
144*00b67f09SDavid van Moolenbroek        q <seconds>     : use seconds as the timeout value
145*00b67f09SDavid van Moolenbroek        x               : don't execute tests in a subproc      (n/a)
146*00b67f09SDavid van Moolenbroek";
147*00b67f09SDavid van Moolenbroek
148*00b67f09SDavid van Moolenbroek# get command line args
149*00b67f09SDavid van Moolenbroek&main'Getopts('ab:c:d:hun:t:q:x');
150*00b67f09SDavid van Moolenbroek
151*00b67f09SDavid van Moolenbroek# if -u, print usage and exit
152*00b67f09SDavid van Moolenbroekif (defined($main'opt_u)) {
153*00b67f09SDavid van Moolenbroek	print $T_usage;
154*00b67f09SDavid van Moolenbroek	exit(0);
155*00b67f09SDavid van Moolenbroek}
156*00b67f09SDavid van Moolenbroek
157*00b67f09SDavid van Moolenbroek# implement -h and -t after we add test descriptions to T_testlist ZZZ
158*00b67f09SDavid van Moolenbroekif (defined($main'opt_h)) {
159*00b67f09SDavid van Moolenbroek	print "the -h option is not implemented\n";
160*00b67f09SDavid van Moolenbroek	exit(0);
161*00b67f09SDavid van Moolenbroek}
162*00b67f09SDavid van Moolenbroek
163*00b67f09SDavid van Moolenbroekif (defined($main'opt_t)) {
164*00b67f09SDavid van Moolenbroek	print "the -t option is not implemented\n";
165*00b67f09SDavid van Moolenbroek	exit(0);
166*00b67f09SDavid van Moolenbroek}
167*00b67f09SDavid van Moolenbroek
168*00b67f09SDavid van Moolenbroek#
169*00b67f09SDavid van Moolenbroek# silently ignore the -x option
170*00b67f09SDavid van Moolenbroek# this exists in the C version of the api
171*00b67f09SDavid van Moolenbroek# to facilitate exception debugging with gdb
172*00b67f09SDavid van Moolenbroek# and is not meaningful here
173*00b67f09SDavid van Moolenbroek#
174*00b67f09SDavid van Moolenbroek
175*00b67f09SDavid van Moolenbroek$T_configfile	= "t_config";
176*00b67f09SDavid van Moolenbroek$T_debug	= 0;
177*00b67f09SDavid van Moolenbroek$T_timeout	= 10;
178*00b67f09SDavid van Moolenbroek$T_testnum	= -1;
179*00b67f09SDavid van Moolenbroek
180*00b67f09SDavid van Moolenbroek$T_dir		= $main'opt_b if (defined($main'opt_b));
181*00b67f09SDavid van Moolenbroek$T_debug	= $main'opt_d if (defined($main'opt_d));
182*00b67f09SDavid van Moolenbroek$T_configfile	= $main'opt_c if (defined($main'opt_c));
183*00b67f09SDavid van Moolenbroek$T_testnum	= $main'opt_n if (defined($main'opt_n));
184*00b67f09SDavid van Moolenbroek$T_timeout	= $main'opt_q if (defined($main'opt_q));
185*00b67f09SDavid van Moolenbroek
186*00b67f09SDavid van Moolenbroek$SIG{'ABRT'} = 't_api\'t_on_abort';
187*00b67f09SDavid van Moolenbroek$SIG{'ALRM'} = 't_api\'t_on_alarm';
188*00b67f09SDavid van Moolenbroek$SIG{'INT'}  = 't_api\'t_on_int';
189*00b67f09SDavid van Moolenbroek$SIG{'QUIT'} = 't_api\'t_on_int';
190*00b67f09SDavid van Moolenbroek
191*00b67f09SDavid van Moolenbroek# print the start line
192*00b67f09SDavid van Moolenbroek$date = `date`;
193*00b67f09SDavid van Moolenbroekchop $date;
194*00b67f09SDavid van Moolenbroek($cmd = $0) =~ s/\.\///g;
195*00b67f09SDavid van Moolenbroekprintf("S:$cmd:$date\n");
196*00b67f09SDavid van Moolenbroek
197*00b67f09SDavid van Moolenbroek# initialize the test environment
198*00b67f09SDavid van Moolenbroek&t_initconf($T_configfile);
199*00b67f09SDavid van Moolenbroek&t_dumpconf() if ($T_debug);
200*00b67f09SDavid van Moolenbroek
201*00b67f09SDavid van Moolenbroek# establish working directory if requested
202*00b67f09SDavid van Moolenbroekchdir("$T_dir") if (defined($T_dir) && (-d "$T_dir"));
203*00b67f09SDavid van Moolenbroek
204*00b67f09SDavid van Moolenbroek# run the tests
205*00b67f09SDavid van Moolenbroekif ($T_testnum == -1) {
206*00b67f09SDavid van Moolenbroek	# run all tests
207*00b67f09SDavid van Moolenbroek	$T_ntests = $#main'T_testlist + 1;
208*00b67f09SDavid van Moolenbroek	for ($T_cnt = 0; $T_cnt < $T_ntests; ++$T_cnt) {
209*00b67f09SDavid van Moolenbroek		&doTestN($T_cnt);
210*00b67f09SDavid van Moolenbroek	}
211*00b67f09SDavid van Moolenbroek}
212*00b67f09SDavid van Moolenbroekelse {
213*00b67f09SDavid van Moolenbroek	# otherwise run the specified test
214*00b67f09SDavid van Moolenbroek	&doTest($T_testnum);
215*00b67f09SDavid van Moolenbroek}
216*00b67f09SDavid van Moolenbroek
217*00b67f09SDavid van Moolenbroek# print the end line
218*00b67f09SDavid van Moolenbroek$date = `date`;
219*00b67f09SDavid van Moolenbroekchop $date;
220*00b67f09SDavid van Moolenbroekprintf("E:$cmd:$date\n");
221*00b67f09SDavid van Moolenbroek
222*00b67f09SDavid van Moolenbroek1;
223*00b67f09SDavid van Moolenbroek
224