9512fe850e98fdd448c638ca63fdd92a8a510255ahl#!/usr/perl5/bin/perl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# CDDL HEADER START
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# The contents of this file are subject to the terms of the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# Common Development and Distribution License (the "License").
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# You may not use this file except in compliance with the License.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# or http://www.opensolaris.org/os/licensing.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# See the License for the specific language governing permissions
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# and limitations under the License.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# When distributing Covered Code, include this CDDL HEADER in each
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# If applicable, add the following below this CDDL HEADER, with the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# fields enclosed by brackets "[]" replaced with your own identifying
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# information: Portions Copyright [yyyy] [name of copyright owner]
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# CDDL HEADER END
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
e77b06d21580f630e0a7c437495ab283d3672828tomee# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# Use is subject to license terms.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill#
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill# Copyright (c) 2011, Joyent, Inc. All rights reserved.
e5803b76927480e8f9b67b22201c484ccf4c2bcfAdam H. Leventhal# Copyright (c) 2012 by Delphix. All rights reserved.
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill#
df0345f7d6cc87cde9e532e8362f1aca053d98ccJohn Sonnenscheinrequire 5.8.4;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahluse File::Find;
9512fe850e98fdd448c638ca63fdd92a8a510255ahluse File::Basename;
9512fe850e98fdd448c638ca63fdd92a8a510255ahluse Getopt::Std;
9512fe850e98fdd448c638ca63fdd92a8a510255ahluse Cwd;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeeuse Cwd 'abs_path';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$PNAME = $0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$PNAME =~ s:.*/::;
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill$OPTSTR = 'abd:fFghi:jlnqsx:';
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill$USAGE = "Usage: $PNAME [-abfFghjlnqs] [-d dir] [-i isa] "
9512fe850e98fdd448c638ca63fdd92a8a510255ahl . "[-x opt[=arg]] [file | dir ...]\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl($MACH = `uname -p`) =~ s/\W*\n//;
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq($PLATFORM = `uname -i`) =~ s/\W*\n//;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl@dtrace_argv = ();
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$ksh_path = '/usr/bin/ksh';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl@files = ();
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee%exceptions = ();
e77b06d21580f630e0a7c437495ab283d3672828tomee%results = ();
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$errs = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# If no test files are specified on the command-line, execute a find on "."
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# and append any tst.*.d, tst.*.ksh, err.*.d or drp.*.d files found within
9512fe850e98fdd448c638ca63fdd92a8a510255ahl# the directory tree.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub wanted
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl push(@files, $File::Find::name)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($_ =~ /^(tst|err|drp)\..+\.(d|ksh)$/ && -f "$_");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub dirname {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($s) = @_;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($i);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $s = substr($s, 0, $i) if (($i = rindex($s, '/')) != -1);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl return $i == -1 ? '.' : $i == 0 ? '/' : $s;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrillsub inpath
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill{
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill my ($exec) = (@_);
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill my @path = File::Spec->path();
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill for my $dir (@path) {
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill if (-x $dir . "/" . $exec) {
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill return 1;
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill }
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill }
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill return 0;
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill}
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub usage
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print $USAGE;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -a execute test suite using anonymous enablings\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -b execute bad ioctl test program\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -d specify directory for test results files and cores\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -g enable libumem debugging when running tests\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee print "\t -f force bypassed tests to run\n";
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill print "\t -F force tests to be run, even if missing dependencies\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -h display verbose usage message\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -i specify ISA to test instead of isaexec(3C) default\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee print "\t -j execute test suite using jdtrace (Java API) only\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -l save log file of results and PIDs used by tests\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee print "\t -n execute test suite using dtrace(1m) only\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -q set quiet mode (only report errors and summary)\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -s save results files even for tests that pass\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print "\t -x pass corresponding -x argument to dtrace(1M)\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(2);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub errmsg
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($msg) = @_;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print STDERR $msg;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print LOG $msg if ($opt_l);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $errs++;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub fail
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my(@parms) = @_;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($msg) = $parms[0];
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($errfile) = $parms[1];
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($n) = 0;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($dest) = basename($file);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl while (-d "$opt_d/failure.$n") {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $n++;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unless (mkdir "$opt_d/failure.$n") {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl warn "ERROR: failed to make directory $opt_d/failure.$n: $!\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(125);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl open(README, ">$opt_d/failure.$n/README");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print README "ERROR: " . $file . " " . $msg;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (scalar @parms > 1) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print README "; see $errfile\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl } else {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (-f "$opt_d/$pid.core") {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print README "; see $pid.core\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl } else {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print README "\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl close(README);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (-f "$opt_d/$pid.out") {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl rename("$opt_d/$pid.out", "$opt_d/failure.$n/$pid.out");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl link("$file.out", "$opt_d/failure.$n/$dest.out");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (-f "$opt_d/$pid.err") {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl rename("$opt_d/$pid.err", "$opt_d/failure.$n/$pid.err");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl link("$file.err", "$opt_d/failure.$n/$dest.err");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (-f "$opt_d/$pid.core") {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl rename("$opt_d/$pid.core", "$opt_d/failure.$n/$pid.core");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl link("$file", "$opt_d/failure.$n/$dest");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $msg = "ERROR: " . $dest . " " . $msg;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (scalar @parms > 1) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $msg = $msg . "; see $errfile in failure.$n\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl } else {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $msg = $msg . "; details in failure.$n\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl errmsg($msg);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlsub logmsg
9512fe850e98fdd448c638ca63fdd92a8a510255ahl{
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my($msg) = @_;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print STDOUT $msg unless ($opt_q);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl print LOG $msg if ($opt_l);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee# Trim leading and trailing whitespace
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeesub trim {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee my($s) = @_;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee $s =~ s/^\s*//;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee $s =~ s/\s*$//;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return $s;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee}
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee# Load exception set of skipped tests from the file at the given
e77b06d21580f630e0a7c437495ab283d3672828tomee# pathname. The test names are assumed to be paths relative to $dt_tst,
e77b06d21580f630e0a7c437495ab283d3672828tomee# for example: common/aggs/tst.neglquant.d, and specify tests to be
e77b06d21580f630e0a7c437495ab283d3672828tomee# skipped.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeesub load_exceptions {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee my($listfile) = @_;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee my($line) = "";
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee %exceptions = ();
e77b06d21580f630e0a7c437495ab283d3672828tomee if (length($listfile) > 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(123) unless open(STDIN, "<$listfile");
e77b06d21580f630e0a7c437495ab283d3672828tomee while (<STDIN>) {
e77b06d21580f630e0a7c437495ab283d3672828tomee chomp;
e77b06d21580f630e0a7c437495ab283d3672828tomee $line = $_;
e77b06d21580f630e0a7c437495ab283d3672828tomee # line is non-empty and not a comment
e77b06d21580f630e0a7c437495ab283d3672828tomee if ((length($line) > 0) && ($line =~ /^\s*[^\s#]/ )) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $exceptions{trim($line)} = 1;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee}
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee# Return 1 if the test is found in the exception set, 0 otherwise.
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeesub is_exception {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee my($file) = @_;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee my($i) = -1;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (scalar(keys(%exceptions)) == 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee return 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee # hash absolute pathname after $dt_tst/
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee $file = abs_path($file);
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee $i = index($file, $dt_tst);
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee if ($i == 0) {
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee $file = substr($file, length($dt_tst) + 1);
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return $exceptions{$file};
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee }
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee return 0;
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee}
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee#
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# Iterate over the set of test files specified on the command-line or by a find
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# on "$defdir/common", "$defdir/$MACH" and "$defdir/$PLATFORM" and execute each
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# one. If the test file is executable, we fork and exec it. If the test is a
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# .ksh file, we run it with $ksh_path. Otherwise we run dtrace -s on it. If
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# the file is named tst.* we assume it should return exit status 0. If the
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# file is named err.* we assume it should return exit status 1. If the file is
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# named err.D_[A-Z0-9]+[.*].d we use dtrace -xerrtags and examine stderr to
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# ensure that a matching error tag was produced. If the file is named
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# drp.[A-Z0-9]+[.*].d we use dtrace -xdroptags and examine stderr to ensure
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# that a matching drop tag was produced. If any *.out or *.err files are found
c7158ae983f5a04c4a998f468ecefba6d23ba721tariq# we perform output comparisons.
e77b06d21580f630e0a7c437495ab283d3672828tomee#
e77b06d21580f630e0a7c437495ab283d3672828tomee# run_tests takes two arguments: The first is the pathname of the dtrace
e77b06d21580f630e0a7c437495ab283d3672828tomee# command to invoke when running the tests. The second is the pathname
e77b06d21580f630e0a7c437495ab283d3672828tomee# of a file (may be the empty string) listing tests that ought to be
e77b06d21580f630e0a7c437495ab283d3672828tomee# skipped (skipped tests are listed as paths relative to $dt_tst, for
e77b06d21580f630e0a7c437495ab283d3672828tomee# example: common/aggs/tst.neglquant.d).
e77b06d21580f630e0a7c437495ab283d3672828tomee#
e77b06d21580f630e0a7c437495ab283d3672828tomeesub run_tests {
e77b06d21580f630e0a7c437495ab283d3672828tomee my($dtrace, $exceptions_path) = @_;
e77b06d21580f630e0a7c437495ab283d3672828tomee my($passed) = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee my($bypassed) = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee my($failed) = $errs;
e77b06d21580f630e0a7c437495ab283d3672828tomee my($total) = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill die "$PNAME: $dtrace not found; aborting\n" unless (-x "$dtrace");
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill logmsg("executing tests using $dtrace ...\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee load_exceptions($exceptions_path);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee foreach $file (sort @files) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $file =~ m:.*/((.*)\.(\w+)):;
e77b06d21580f630e0a7c437495ab283d3672828tomee $name = $1;
e77b06d21580f630e0a7c437495ab283d3672828tomee $base = $2;
e77b06d21580f630e0a7c437495ab283d3672828tomee $ext = $3;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee $dir = dirname($file);
e77b06d21580f630e0a7c437495ab283d3672828tomee $isksh = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee $tag = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee $droptag = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($name =~ /^tst\./) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $isksh = ($ext eq 'ksh');
e77b06d21580f630e0a7c437495ab283d3672828tomee $status = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee } elsif ($name =~ /^err\.(D_[A-Z0-9_]+)\./) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $status = 1;
e77b06d21580f630e0a7c437495ab283d3672828tomee $tag = $1;
e77b06d21580f630e0a7c437495ab283d3672828tomee } elsif ($name =~ /^err\./) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $status = 1;
e77b06d21580f630e0a7c437495ab283d3672828tomee } elsif ($name =~ /^drp\.([A-Z0-9_]+)\./) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $status = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee $droptag = $1;
e77b06d21580f630e0a7c437495ab283d3672828tomee } else {
e77b06d21580f630e0a7c437495ab283d3672828tomee errmsg("ERROR: $file is not a valid test file name\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee $fullname = "$dir/$name";
e77b06d21580f630e0a7c437495ab283d3672828tomee $exe = "$dir/$base.exe";
e77b06d21580f630e0a7c437495ab283d3672828tomee $exe_pid = -1;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($opt_a && ($status != 0 || $tag != 0 || $droptag != 0 ||
e77b06d21580f630e0a7c437495ab283d3672828tomee -x $exe || $isksh || -x $fullname)) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $bypassed++;
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (!$opt_f && is_exception("$dir/$name")) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $bypassed++;
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (!$isksh && -x $exe) {
e77b06d21580f630e0a7c437495ab283d3672828tomee if (($exe_pid = fork()) == -1) {
e77b06d21580f630e0a7c437495ab283d3672828tomee errmsg(
e77b06d21580f630e0a7c437495ab283d3672828tomee "ERROR: failed to fork to run $exe: $!\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($exe_pid == 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee open(STDIN, '</dev/null');
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee exec($exe);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: failed to exec $exe: $!\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg("testing $file ... ");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (($pid = fork()) == -1) {
e77b06d21580f630e0a7c437495ab283d3672828tomee errmsg("ERROR: failed to fork to run test $file: $!\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($pid == 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee open(STDIN, '</dev/null');
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(125) unless open(STDOUT, ">$opt_d/$$.out");
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(125) unless open(STDERR, ">$opt_d/$$.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee unless (chdir($dir)) {
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: failed to chdir for $file: $!\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(126);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, '-xerrtags') if ($tag);
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, '-xdroptags') if ($droptag);
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, $exe_pid) if ($exe_pid != -1);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($isksh) {
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(123) unless open(STDIN, "<$name");
e77b06d21580f630e0a7c437495ab283d3672828tomee exec("$ksh_path /dev/stdin $dtrace");
e77b06d21580f630e0a7c437495ab283d3672828tomee } elsif (-x $name) {
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: $name is executable\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(1);
e77b06d21580f630e0a7c437495ab283d3672828tomee } else {
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($tag == 0 && $status == $0 && $opt_a) {
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, '-A');
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, '-C');
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, '-s');
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, $name);
e77b06d21580f630e0a7c437495ab283d3672828tomee exec($dtrace, @dtrace_argv);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: failed to exec for $file: $!\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(127);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (waitpid($pid, 0) == -1) {
e77b06d21580f630e0a7c437495ab283d3672828tomee errmsg("ERROR: timed out waiting for $file\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee kill(9, $exe_pid) if ($exe_pid != -1);
e77b06d21580f630e0a7c437495ab283d3672828tomee kill(9, $pid);
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee kill(9, $exe_pid) if ($exe_pid != -1);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($tag == 0 && $status == $0 && $opt_a) {
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee # We can chuck the earler output.
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee unlink($pid . '.out');
e77b06d21580f630e0a7c437495ab283d3672828tomee unlink($pid . '.err');
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee # This is an anonymous enabling. We need to get
e77b06d21580f630e0a7c437495ab283d3672828tomee # the module unloaded.
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee system("dtrace -ae 1> /dev/null 2> /dev/null");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("svcadm disable -s " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "svc:/network/nfs/mapid:default");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("modunload -i 0 ; modunload -i 0 ; " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "modunload -i 0");
e77b06d21580f630e0a7c437495ab283d3672828tomee if (!system("modinfo | grep dtrace")) {
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: couldn't unload dtrace\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee system("svcadm enable " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "-s svc:/network/nfs/mapid:default");
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(124);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee # DTrace is gone. Now update_drv(1M), and rip
e77b06d21580f630e0a7c437495ab283d3672828tomee # everything out again.
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee system("update_drv dtrace");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("dtrace -ae 1> /dev/null 2> /dev/null");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("modunload -i 0 ; modunload -i 0 ; " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "modunload -i 0");
e77b06d21580f630e0a7c437495ab283d3672828tomee if (!system("modinfo | grep dtrace")) {
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: couldn't unload dtrace\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee system("svcadm enable " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "-s svc:/network/nfs/mapid:default");
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(124);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee # Now bring DTrace back in.
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee system("sync ; sync");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("dtrace -l -n bogusprobe 1> /dev/null " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "2> /dev/null");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("svcadm enable -s " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "svc:/network/nfs/mapid:default");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee # That should have caused DTrace to reload with
e77b06d21580f630e0a7c437495ab283d3672828tomee # the new configuration file. Now we can try to
e77b06d21580f630e0a7c437495ab283d3672828tomee # snag our anonymous state.
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee if (($pid = fork()) == -1) {
e77b06d21580f630e0a7c437495ab283d3672828tomee errmsg("ERROR: failed to fork to run " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "test $file: $!\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($pid == 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee open(STDIN, '</dev/null');
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(125) unless open(STDOUT, ">$opt_d/$$.out");
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(125) unless open(STDERR, ">$opt_d/$$.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_argv, '-a');
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee unless (chdir($dir)) {
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: failed to chdir " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "for $file: $!\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(126);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee exec($dtrace, @dtrace_argv);
e77b06d21580f630e0a7c437495ab283d3672828tomee warn "ERROR: failed to exec for $file: $!\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee exit(127);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (waitpid($pid, 0) == -1) {
e77b06d21580f630e0a7c437495ab283d3672828tomee errmsg("ERROR: timed out waiting for $file\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee kill(9, $pid);
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg("[$pid]\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee $wstat = $?;
e77b06d21580f630e0a7c437495ab283d3672828tomee $wifexited = ($wstat & 0xFF) == 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee $wexitstat = ($wstat >> 8) & 0xFF;
e77b06d21580f630e0a7c437495ab283d3672828tomee $wtermsig = ($wstat & 0x7F);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (!$wifexited) {
e77b06d21580f630e0a7c437495ab283d3672828tomee fail("died from signal $wtermsig");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($wexitstat == 125) {
e77b06d21580f630e0a7c437495ab283d3672828tomee die "$PNAME: failed to create output file in $opt_d " .
e77b06d21580f630e0a7c437495ab283d3672828tomee "(cd elsewhere or use -d)\n";
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($wexitstat != $status) {
e77b06d21580f630e0a7c437495ab283d3672828tomee fail("returned $wexitstat instead of $status");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (-f "$file.out" &&
e77b06d21580f630e0a7c437495ab283d3672828tomee system("cmp -s $file.out $opt_d/$pid.out") != 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee fail("stdout mismatch", "$pid.out");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (-f "$file.err" &&
e77b06d21580f630e0a7c437495ab283d3672828tomee system("cmp -s $file.err $opt_d/$pid.err") != 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee fail("stderr mismatch: see $pid.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($tag) {
e77b06d21580f630e0a7c437495ab283d3672828tomee open(TSTERR, "<$opt_d/$pid.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee $tsterr = <TSTERR>;
e77b06d21580f630e0a7c437495ab283d3672828tomee close(TSTERR);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee unless ($tsterr =~ /: \[$tag\] line \d+:/) {
e77b06d21580f630e0a7c437495ab283d3672828tomee fail("errtag mismatch: see $pid.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($droptag) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $found = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee open(TSTERR, "<$opt_d/$pid.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee while (<TSTERR>) {
e77b06d21580f630e0a7c437495ab283d3672828tomee if (/\[$droptag\] /) {
e77b06d21580f630e0a7c437495ab283d3672828tomee $found = 1;
e77b06d21580f630e0a7c437495ab283d3672828tomee last;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee close (TSTERR);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee unless ($found) {
e77b06d21580f630e0a7c437495ab283d3672828tomee fail("droptag mismatch: see $pid.err");
e77b06d21580f630e0a7c437495ab283d3672828tomee next;
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee unless ($opt_s) {
e77b06d21580f630e0a7c437495ab283d3672828tomee unlink($pid . '.out');
e77b06d21580f630e0a7c437495ab283d3672828tomee unlink($pid . '.err');
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($opt_a) {
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee # If we're running with anonymous enablings, we need to
e77b06d21580f630e0a7c437495ab283d3672828tomee # restore the .conf file.
e77b06d21580f630e0a7c437495ab283d3672828tomee #
e77b06d21580f630e0a7c437495ab283d3672828tomee system("dtrace -A 1> /dev/null 2> /dev/null");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("dtrace -ae 1> /dev/null 2> /dev/null");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("modunload -i 0 ; modunload -i 0 ; modunload -i 0");
e77b06d21580f630e0a7c437495ab283d3672828tomee system("update_drv dtrace");
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee $total = scalar(@files);
e77b06d21580f630e0a7c437495ab283d3672828tomee $failed = $errs - $failed;
e77b06d21580f630e0a7c437495ab283d3672828tomee $passed = ($total - $failed - $bypassed);
e77b06d21580f630e0a7c437495ab283d3672828tomee $results{$dtrace} = {
e77b06d21580f630e0a7c437495ab283d3672828tomee "passed" => $passed,
e77b06d21580f630e0a7c437495ab283d3672828tomee "bypassed" => $bypassed,
e77b06d21580f630e0a7c437495ab283d3672828tomee "failed" => $failed,
e77b06d21580f630e0a7c437495ab283d3672828tomee "total" => $total
e77b06d21580f630e0a7c437495ab283d3672828tomee };
e77b06d21580f630e0a7c437495ab283d3672828tomee}
e77b06d21580f630e0a7c437495ab283d3672828tomee
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomeedie $USAGE unless (getopts($OPTSTR));
9512fe850e98fdd448c638ca63fdd92a8a510255ahlusage() if ($opt_h);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlforeach $arg (@ARGV) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (-f $arg) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl push(@files, $arg);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl } elsif (-d $arg) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl find(\&wanted, $arg);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl } else {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl die "$PNAME: $arg is not a valid file or directory\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee$dt_tst = '/opt/SUNWdtrt/tst';
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee$dt_bin = '/opt/SUNWdtrt/bin';
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee$defdir = -d $dt_tst ? $dt_tst : '.';
23b5c241225a8ade2b6b9f06ebb891ee459e3b02tomee$bindir = -d $dt_bin ? $dt_bin : '.';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrillif (!$opt_F) {
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill my @dependencies = ("gcc", "make", "java", "perl");
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill for my $dep (@dependencies) {
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill if (!inpath($dep)) {
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill die "$PNAME: '$dep' not found (use -F to force run)\n";
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill }
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill }
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill}
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill
9512fe850e98fdd448c638ca63fdd92a8a510255ahlfind(\&wanted, "$defdir/common") if (scalar(@ARGV) == 0);
9512fe850e98fdd448c638ca63fdd92a8a510255ahlfind(\&wanted, "$defdir/$MACH") if (scalar(@ARGV) == 0);
c7158ae983f5a04c4a998f468ecefba6d23ba721tariqfind(\&wanted, "$defdir/$PLATFORM") if (scalar(@ARGV) == 0);
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill
9512fe850e98fdd448c638ca63fdd92a8a510255ahldie $USAGE if (scalar(@files) == 0);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
e77b06d21580f630e0a7c437495ab283d3672828tomee$dtrace_path = '/usr/sbin/dtrace';
e77b06d21580f630e0a7c437495ab283d3672828tomee$jdtrace_path = "$bindir/jdtrace";
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee%exception_lists = ("$jdtrace_path" => "$bindir/exception.lst");
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomeeif ($opt_j || $opt_n || $opt_i) {
e77b06d21580f630e0a7c437495ab283d3672828tomee @dtrace_cmds = ();
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_cmds, $dtrace_path) if ($opt_n);
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_cmds, $jdtrace_path) if ($opt_j);
e77b06d21580f630e0a7c437495ab283d3672828tomee push(@dtrace_cmds, "/usr/sbin/$opt_i/dtrace") if ($opt_i);
e77b06d21580f630e0a7c437495ab283d3672828tomee} else {
c090e5dfb10cc96e71e6b0f55bf98c18027b002cBryan Cantrill @dtrace_cmds = ($dtrace_path);
e77b06d21580f630e0a7c437495ab283d3672828tomee}
e77b06d21580f630e0a7c437495ab283d3672828tomee
9512fe850e98fdd448c638ca63fdd92a8a510255ahlif ($opt_d) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl die "$PNAME: -d arg must be absolute path\n" unless ($opt_d =~ /^\//);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl die "$PNAME: -d arg $opt_d is not a directory\n" unless (-d "$opt_d");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl system("coreadm -p $opt_d/%p.core");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl} else {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl my $dir = getcwd;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl system("coreadm -p $dir/%p.core");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $opt_d = '.';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlif ($opt_x) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl push(@dtrace_argv, '-x');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl push(@dtrace_argv, $opt_x);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahldie "$PNAME: failed to open $PNAME.$$.log: $!\n"
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unless (!$opt_l || open(LOG, ">$PNAME.$$.log"));
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
e5803b76927480e8f9b67b22201c484ccf4c2bcfAdam H. Leventhal$ENV{'DTRACE_DEBUG_REGSET'} = 'true';
e5803b76927480e8f9b67b22201c484ccf4c2bcfAdam H. Leventhal
9512fe850e98fdd448c638ca63fdd92a8a510255ahlif ($opt_g) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $ENV{'UMEM_DEBUG'} = 'default,verbose';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $ENV{'UMEM_LOGGING'} = 'fail,contents';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $ENV{'LD_PRELOAD'} = 'libumem.so';
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlif ($opt_b) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl logmsg("badioctl'ing ... ");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (($badioctl = fork()) == -1) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl errmsg("ERROR: failed to fork to run badioctl: $!\n");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($badioctl == 0) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl open(STDIN, '</dev/null');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(125) unless open(STDOUT, ">$opt_d/$$.out");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(125) unless open(STDERR, ">$opt_d/$$.err");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exec($bindir . "/badioctl");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl warn "ERROR: failed to exec badioctl: $!\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(127);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl logmsg("[$badioctl]\n");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # If we're going to be bad, we're just going to iterate over each
9512fe850e98fdd448c638ca63fdd92a8a510255ahl # test file.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl #
9512fe850e98fdd448c638ca63fdd92a8a510255ahl foreach $file (sort @files) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl ($name = $file) =~ s:.*/::;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl $dir = dirname($file);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (!($name =~ /^tst\./ && $name =~ /\.d$/)) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl logmsg("baddof'ing $file ... ");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if (($pid = fork()) == -1) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl errmsg("ERROR: failed to fork to run baddof: $!\n");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl next;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl if ($pid == 0) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl open(STDIN, '</dev/null');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(125) unless open(STDOUT, ">$opt_d/$$.out");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(125) unless open(STDERR, ">$opt_d/$$.err");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unless (chdir($dir)) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl warn "ERROR: failed to chdir for $file: $!\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(126);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exec($bindir . "/baddof", $name);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl warn "ERROR: failed to exec for $file: $!\n";
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(127);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl sleep 60;
9512fe850e98fdd448c638ca63fdd92a8a510255ahl kill(9, $pid);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl waitpid($pid, 0);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl logmsg("[$pid]\n");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unless ($opt_s) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unlink($pid . '.out');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unlink($pid . '.err');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl kill(9, $badioctl);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl waitpid($badioctl, 0);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unless ($opt_s) {
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unlink($badioctl . '.out');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl unlink($badioctl . '.err');
9512fe850e98fdd448c638ca63fdd92a8a510255ahl }
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl exit(0);
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
e77b06d21580f630e0a7c437495ab283d3672828tomee# Run all the tests specified on the command-line (the entire test suite
e77b06d21580f630e0a7c437495ab283d3672828tomee# by default) once for each dtrace command tested, skipping any tests
e77b06d21580f630e0a7c437495ab283d3672828tomee# not valid for that command.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl#
e77b06d21580f630e0a7c437495ab283d3672828tomeeforeach $dtrace_cmd (@dtrace_cmds) {
e77b06d21580f630e0a7c437495ab283d3672828tomee run_tests($dtrace_cmd, $exception_lists{$dtrace_cmd});
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahl$opt_q = 0; # force final summary to appear regardless of -q option
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahllogmsg("\n==== TEST RESULTS ====\n");
e77b06d21580f630e0a7c437495ab283d3672828tomeeforeach $key (keys %results) {
e77b06d21580f630e0a7c437495ab283d3672828tomee my $passed = $results{$key}{"passed"};
e77b06d21580f630e0a7c437495ab283d3672828tomee my $bypassed = $results{$key}{"bypassed"};
e77b06d21580f630e0a7c437495ab283d3672828tomee my $failed = $results{$key}{"failed"};
e77b06d21580f630e0a7c437495ab283d3672828tomee my $total = $results{$key}{"total"};
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg("\n mode: " . $key . "\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg(" passed: " . $passed . "\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee if ($bypassed) {
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg(" bypassed: " . $bypassed . "\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg(" failed: " . $failed . "\n");
e77b06d21580f630e0a7c437495ab283d3672828tomee logmsg(" total: " . $total . "\n");
9512fe850e98fdd448c638ca63fdd92a8a510255ahl}
9512fe850e98fdd448c638ca63fdd92a8a510255ahl
9512fe850e98fdd448c638ca63fdd92a8a510255ahlexit($errs != 0);