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