c34b793ca866723d5fcad54bf1c600994a305661William King#!/usr/local/bin/perl
4a73cf8ee07ae396be20231ac252a24830f3c801Bob Halley#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# Copyright (C) 1999-2001, 2004, 2007, 2012, 2016 Internet Systems Consortium, Inc. ("ISC")
bf8267aa453e5d2a735ed732a043b77a0b355b20Mark Andrews#
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews# file, You can obtain one at http://mozilla.org/MPL/2.0/.
c34b793ca866723d5fcad54bf1c600994a305661William King
70e5a7403f0e0a3bd292b8287c5fed5772c15270Automatic Updater# $Id: t_api.pl,v 1.10 2007/06/19 23:46:59 tbox Exp $
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
c34b793ca866723d5fcad54bf1c600994a305661William Kingrequire "getopts.pl";
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King#
c34b793ca866723d5fcad54bf1c600994a305661William King# a minimalistic test api in perl compatable with the C api
c34b793ca866723d5fcad54bf1c600994a305661William King# used for the bind 9 regression tests
c34b793ca866723d5fcad54bf1c600994a305661William King#
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_info {
c34b793ca866723d5fcad54bf1c600994a305661William King package t_api;
c34b793ca866723d5fcad54bf1c600994a305661William King local($format, @rest) = @_;
c34b793ca866723d5fcad54bf1c600994a305661William King printf("I:${format}%s", @rest);
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_result {
c34b793ca866723d5fcad54bf1c600994a305661William King package t_api;
c34b793ca866723d5fcad54bf1c600994a305661William King local($result) = @_;
c34b793ca866723d5fcad54bf1c600994a305661William King $T_inresult = 1;
c34b793ca866723d5fcad54bf1c600994a305661William King printf("R:$result\n");
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_assert {
c34b793ca866723d5fcad54bf1c600994a305661William King package t_api;
c34b793ca866723d5fcad54bf1c600994a305661William King local($component, $anum, $class, $what, @rest) = @_;
c34b793ca866723d5fcad54bf1c600994a305661William King printf("A:%s:%d:%s:$what\n", $component, $anum, $class, @rest);
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_getenv {
c34b793ca866723d5fcad54bf1c600994a305661William King package t_api;
c34b793ca866723d5fcad54bf1c600994a305661William King local($name) = @_;
c34b793ca866723d5fcad54bf1c600994a305661William King return($T_env{$name}) if (defined($T_env{$name}));
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingpackage t_api;
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King$| = 1;
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_on_abort {
c34b793ca866723d5fcad54bf1c600994a305661William King $T_aborted = 1;
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("got abort\n");
c34b793ca866723d5fcad54bf1c600994a305661William King die;
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_on_alarm {
c34b793ca866723d5fcad54bf1c600994a305661William King $T_timedout = 1;
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("got alarm\n");
c34b793ca866723d5fcad54bf1c600994a305661William King die;
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_on_int {
c34b793ca866723d5fcad54bf1c600994a305661William King $T_terminated = 1;
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("got int\n");
c34b793ca866723d5fcad54bf1c600994a305661William King die;
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# initialize the test environment
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_initconf {
c34b793ca866723d5fcad54bf1c600994a305661William King local($cfile) = @_;
c34b793ca866723d5fcad54bf1c600994a305661William King local($name, $value);
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King if ((-f $cfile) && (-s _)) {
c34b793ca866723d5fcad54bf1c600994a305661William King open(XXX, "< $cfile");
c34b793ca866723d5fcad54bf1c600994a305661William King while (<XXX>) {
c34b793ca866723d5fcad54bf1c600994a305661William King next if (/^\#/);
c34b793ca866723d5fcad54bf1c600994a305661William King next unless (/=/);
c34b793ca866723d5fcad54bf1c600994a305661William King chop;
c34b793ca866723d5fcad54bf1c600994a305661William King ($name, $value) = split(/=/, $_, 2);
c34b793ca866723d5fcad54bf1c600994a305661William King $T_env{$name} = $value;
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King close(XXX);
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# dump the configuration to the journal
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub t_dumpconf {
c34b793ca866723d5fcad54bf1c600994a305661William King local($name, $value);
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King foreach $name (sort keys %T_env) {
c34b793ca866723d5fcad54bf1c600994a305661William King &main't_info("%s\t%s\n", $name, $T_env{$name});
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# run a test
c34b793ca866723d5fcad54bf1c600994a305661William Kingsub doTestN {
c34b793ca866723d5fcad54bf1c600994a305661William King package main;
c34b793ca866723d5fcad54bf1c600994a305661William King local($testnumber) = @_;
c34b793ca866723d5fcad54bf1c600994a305661William King local($status);
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King if (defined($T_testlist[$testnumber])) {
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King $t_api'T_inresult = 0;
c34b793ca866723d5fcad54bf1c600994a305661William King $t_api'T_aborted = 0;
c34b793ca866723d5fcad54bf1c600994a305661William King $t_api'T_timedout = 0;
c34b793ca866723d5fcad54bf1c600994a305661William King $t_api'T_terminated = 0;
c34b793ca866723d5fcad54bf1c600994a305661William King $t_api'T_unresolved = 0;
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King alarm($t_api'T_timeout);
c34b793ca866723d5fcad54bf1c600994a305661William King $status = eval($T_testlist[$testnumber]);
c34b793ca866723d5fcad54bf1c600994a305661William King alarm(0);
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King if (! defined($status)) {
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("The test case timed out\n") if ($t_api'T_timedout);
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("The test case was terminated\n") if ($t_api'T_terminated);
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("The test case was aborted\n") if ($t_api'T_aborted);
c34b793ca866723d5fcad54bf1c600994a305661William King &t_result("UNRESOLVED");
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King elsif (! $t_api'T_inresult) {
c34b793ca866723d5fcad54bf1c600994a305661William King &t_result("NORESULT");
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King else {
c34b793ca866723d5fcad54bf1c600994a305661William King &t_info("Test %d is not defined\n", $testnumber);
c34b793ca866723d5fcad54bf1c600994a305661William King &t_result("UNTESTED");
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King$T_usage = "Usage:
c34b793ca866723d5fcad54bf1c600994a305661William King a : run all tests
c34b793ca866723d5fcad54bf1c600994a305661William King b <dir> : cd to dir before running tests
c34b793ca866723d5fcad54bf1c600994a305661William King c <configfile> : use configfile instead of t_config
c34b793ca866723d5fcad54bf1c600994a305661William King d <level> : set debug level to level
c34b793ca866723d5fcad54bf1c600994a305661William King h : print test info (not implemented)
c34b793ca866723d5fcad54bf1c600994a305661William King u : print usage info
c34b793ca866723d5fcad54bf1c600994a305661William King n <testnumber> : run test number testnumber
c34b793ca866723d5fcad54bf1c600994a305661William King t <name> : run test named testname (not implemented)
c34b793ca866723d5fcad54bf1c600994a305661William King q <seconds> : use seconds as the timeout value
c34b793ca866723d5fcad54bf1c600994a305661William King x : don't execute tests in a subproc (n/a)
c34b793ca866723d5fcad54bf1c600994a305661William King";
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# get command line args
c34b793ca866723d5fcad54bf1c600994a305661William King&main'Getopts('ab:c:d:hun:t:q:x');
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# if -u, print usage and exit
c34b793ca866723d5fcad54bf1c600994a305661William Kingif (defined($main'opt_u)) {
c34b793ca866723d5fcad54bf1c600994a305661William King print $T_usage;
c34b793ca866723d5fcad54bf1c600994a305661William King exit(0);
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# implement -h and -t after we add test descriptions to T_testlist ZZZ
c34b793ca866723d5fcad54bf1c600994a305661William Kingif (defined($main'opt_h)) {
c34b793ca866723d5fcad54bf1c600994a305661William King print "the -h option is not implemented\n";
c34b793ca866723d5fcad54bf1c600994a305661William King exit(0);
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William Kingif (defined($main'opt_t)) {
c34b793ca866723d5fcad54bf1c600994a305661William King print "the -t option is not implemented\n";
c34b793ca866723d5fcad54bf1c600994a305661William King exit(0);
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King#
c34b793ca866723d5fcad54bf1c600994a305661William King# silently ignore the -x option
c34b793ca866723d5fcad54bf1c600994a305661William King# this exists in the C version of the api
c34b793ca866723d5fcad54bf1c600994a305661William King# to facilitate exception debugging with gdb
c34b793ca866723d5fcad54bf1c600994a305661William King# and is not meaningful here
c34b793ca866723d5fcad54bf1c600994a305661William King#
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King$T_configfile = "t_config";
c34b793ca866723d5fcad54bf1c600994a305661William King$T_debug = 0;
c34b793ca866723d5fcad54bf1c600994a305661William King$T_timeout = 10;
c34b793ca866723d5fcad54bf1c600994a305661William King$T_testnum = -1;
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King$T_dir = $main'opt_b if (defined($main'opt_b));
c34b793ca866723d5fcad54bf1c600994a305661William King$T_debug = $main'opt_d if (defined($main'opt_d));
c34b793ca866723d5fcad54bf1c600994a305661William King$T_configfile = $main'opt_c if (defined($main'opt_c));
c34b793ca866723d5fcad54bf1c600994a305661William King$T_testnum = $main'opt_n if (defined($main'opt_n));
c34b793ca866723d5fcad54bf1c600994a305661William King$T_timeout = $main'opt_q if (defined($main'opt_q));
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King$SIG{'ABRT'} = 't_api\'t_on_abort';
c34b793ca866723d5fcad54bf1c600994a305661William King$SIG{'ALRM'} = 't_api\'t_on_alarm';
c34b793ca866723d5fcad54bf1c600994a305661William King$SIG{'INT'} = 't_api\'t_on_int';
c34b793ca866723d5fcad54bf1c600994a305661William King$SIG{'QUIT'} = 't_api\'t_on_int';
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# print the start line
c34b793ca866723d5fcad54bf1c600994a305661William King$date = `date`;
c34b793ca866723d5fcad54bf1c600994a305661William Kingchop $date;
c34b793ca866723d5fcad54bf1c600994a305661William King($cmd = $0) =~ s/\.\///g;
c34b793ca866723d5fcad54bf1c600994a305661William Kingprintf("S:$cmd:$date\n");
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# initialize the test environment
c34b793ca866723d5fcad54bf1c600994a305661William King&t_initconf($T_configfile);
c34b793ca866723d5fcad54bf1c600994a305661William King&t_dumpconf() if ($T_debug);
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# establish working directory if requested
c34b793ca866723d5fcad54bf1c600994a305661William Kingchdir("$T_dir") if (defined($T_dir) && (-d "$T_dir"));
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# run the tests
c34b793ca866723d5fcad54bf1c600994a305661William Kingif ($T_testnum == -1) {
c34b793ca866723d5fcad54bf1c600994a305661William King # run all tests
c34b793ca866723d5fcad54bf1c600994a305661William King $T_ntests = $#main'T_testlist + 1;
c34b793ca866723d5fcad54bf1c600994a305661William King for ($T_cnt = 0; $T_cnt < $T_ntests; ++$T_cnt) {
c34b793ca866723d5fcad54bf1c600994a305661William King &doTestN($T_cnt);
c34b793ca866723d5fcad54bf1c600994a305661William King }
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William Kingelse {
c34b793ca866723d5fcad54bf1c600994a305661William King # otherwise run the specified test
c34b793ca866723d5fcad54bf1c600994a305661William King &doTest($T_testnum);
c34b793ca866723d5fcad54bf1c600994a305661William King}
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King# print the end line
c34b793ca866723d5fcad54bf1c600994a305661William King$date = `date`;
c34b793ca866723d5fcad54bf1c600994a305661William Kingchop $date;
c34b793ca866723d5fcad54bf1c600994a305661William Kingprintf("E:$cmd:$date\n");
c34b793ca866723d5fcad54bf1c600994a305661William King
c34b793ca866723d5fcad54bf1c600994a305661William King1;
c34b793ca866723d5fcad54bf1c600994a305661William King