19fb16f52511969a48a056b8e71af852b0ff0da6dnjn#! @PERL@ 2a217f3d4e191eb886c986c5963c91891b544013anjn##--------------------------------------------------------------------## 3a217f3d4e191eb886c986c5963c91891b544013anjn##--- Valgrind regression testing script vg_regtest ---## 4a217f3d4e191eb886c986c5963c91891b544013anjn##--------------------------------------------------------------------## 5c2e7f483a74e57544febba85b603127c6d22c455njn 6b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn# This file is part of Valgrind, a dynamic binary instrumentation 7b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn# framework. 8c2e7f483a74e57544febba85b603127c6d22c455njn# 906766bdbcfe770592c0c91353cfa9e8f4d1ee4e6florian# Copyright (C) 2003-2013 Nicholas Nethercote 102bc10126a94b421a490b2759dc50ab67ec4ee116njn# njn@valgrind.org 11c2e7f483a74e57544febba85b603127c6d22c455njn# 12c2e7f483a74e57544febba85b603127c6d22c455njn# This program is free software; you can redistribute it and/or 13c2e7f483a74e57544febba85b603127c6d22c455njn# modify it under the terms of the GNU General Public License as 14c2e7f483a74e57544febba85b603127c6d22c455njn# published by the Free Software Foundation; either version 2 of the 15c2e7f483a74e57544febba85b603127c6d22c455njn# License, or (at your option) any later version. 16c2e7f483a74e57544febba85b603127c6d22c455njn# 17c2e7f483a74e57544febba85b603127c6d22c455njn# This program is distributed in the hope that it will be useful, but 18c2e7f483a74e57544febba85b603127c6d22c455njn# WITHOUT ANY WARRANTY; without even the implied warranty of 19c2e7f483a74e57544febba85b603127c6d22c455njn# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20c2e7f483a74e57544febba85b603127c6d22c455njn# General Public License for more details. 21c2e7f483a74e57544febba85b603127c6d22c455njn# 22c2e7f483a74e57544febba85b603127c6d22c455njn# You should have received a copy of the GNU General Public License 23c2e7f483a74e57544febba85b603127c6d22c455njn# along with this program; if not, write to the Free Software 24c2e7f483a74e57544febba85b603127c6d22c455njn# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 25c2e7f483a74e57544febba85b603127c6d22c455njn# 02111-1307, USA. 26c2e7f483a74e57544febba85b603127c6d22c455njn# 27c2e7f483a74e57544febba85b603127c6d22c455njn# The GNU General Public License is contained in the file COPYING. 28c2e7f483a74e57544febba85b603127c6d22c455njn 29c2e7f483a74e57544febba85b603127c6d22c455njn#---------------------------------------------------------------------------- 30a217f3d4e191eb886c986c5963c91891b544013anjn# usage: vg_regtest [options] <dirs | files> 31a217f3d4e191eb886c986c5963c91891b544013anjn# 32a217f3d4e191eb886c986c5963c91891b544013anjn# Options: 33a217f3d4e191eb886c986c5963c91891b544013anjn# --all: run tests in all subdirs 343ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn# --valgrind: valgrind launcher to use. Default is ./coregrind/valgrind. 353ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn# (This option should probably only be used in conjunction with 363ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn# --valgrind-lib.) 373ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn# --valgrind-lib: valgrind libraries to use. Default is $tests_dir/.in_place. 383ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn# (This option should probably only be used in conjunction with 393ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn# --valgrind.) 40eefeeb7a60a347bc851605fadd52672cbd927201sewardj# --keep-unfiltered: keep a copy of the unfiltered output/error output 41eefeeb7a60a347bc851605fadd52672cbd927201sewardj# of each test by adding an extension .unfiltered.out 42e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 4372faf10172c04674ac1e31cf4f7e57be241da7daphilippe# --outer-valgrind: run this valgrind under the given outer valgrind. 4472faf10172c04674ac1e31cf4f7e57be241da7daphilippe# This valgrind must be configured with --enable-inner. 4572faf10172c04674ac1e31cf4f7e57be241da7daphilippe# --outer-tool: tool to use by the outer valgrind (default memcheck). 4672faf10172c04674ac1e31cf4f7e57be241da7daphilippe# --outer-args: use this as outer tool args. 4769e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe# --loop-till-fail: loops on the test(s) till one fail, then exit 4869e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe# This is useful to obtain detailed trace or --keep-unfiltered 4969e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe# output of a non deterministic test failure 5072faf10172c04674ac1e31cf4f7e57be241da7daphilippe# 514ba5a79d946b22c52856d62dca7c927cb306dfa3njn# The easiest way is to run all tests in valgrind/ with (assuming you installed 524ba5a79d946b22c52856d62dca7c927cb306dfa3njn# in $PREFIX): 534ba5a79d946b22c52856d62dca7c927cb306dfa3njn# 544ba5a79d946b22c52856d62dca7c927cb306dfa3njn# $PREFIX/bin/vg_regtest --all 554ba5a79d946b22c52856d62dca7c927cb306dfa3njn# 56a217f3d4e191eb886c986c5963c91891b544013anjn# You can specify individual files to test, or whole directories, or both. 57855d93d2e9940890b28874520fa4c1677bf825e2jsgf# Directories are traversed recursively, except for ones named, for example, 58855d93d2e9940890b28874520fa4c1677bf825e2jsgf# CVS/ or docs/. 59e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 60e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Each test is defined in a file <test>.vgtest, containing one or more of the 61a217f3d4e191eb886c986c5963c91891b544013anjn# following lines, in any order: 628d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# - prog: <prog to run> 638d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# - prog-asis: <prog to run> 648d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# - env: <environment variable for prog> (default: none) 65e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# - args: <args for prog> (default: none) 66f6b0076ba64f5c22f9e09be70c351a9d4b095883njn# - vgopts: <Valgrind options> (default: none; 67f6b0076ba64f5c22f9e09be70c351a9d4b095883njn# multiple are allowed) 68e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# - stdout_filter: <filter to run stdout through> (default: none) 69a217f3d4e191eb886c986c5963c91891b544013anjn# - stderr_filter: <filter to run stderr through> (default: ./filter_stderr) 7031014dae410799bfb128af2d396ee70374fa4b75florian# - stdout_filter_args: <args for stdout_filter> (default: basename of .vgtest file) 7131014dae410799bfb128af2d396ee70374fa4b75florian# - stderr_filter_args: <args for stderr_filter> (default: basename of .vgtest file) 723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# 733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# - progB: <prog to run in parallel with prog> (default: none) 743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# - argsB: <args for progB> (default: none) 753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# - stdinB: <input file for progB> (default: none) 763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# - stdoutB_filter: <filter progB stdout through> (default: none) 773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# - stderrB_filter: <filter progB stderr through> (default: ./filter_stderr) 7831014dae410799bfb128af2d396ee70374fa4b75florian# - stdoutB_filter_args: <args for stdout_filterB> (default: basename of .vgtest file) 7931014dae410799bfb128af2d396ee70374fa4b75florian# - stderrB_filter_args: <args for stderr_filterB> (default: basename of .vgtest file) 803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# 81c5e1d806c4f11f91401be4b9f70ac08b1c9d6f61nethercote# - prereq: <prerequisite command> (default: none) 82734b805cb3af82ddd7d3ba22a0e22aba29b78305njn# - post: <post-test check command> (default: none) 83734b805cb3af82ddd7d3ba22a0e22aba29b78305njn# - cleanup: <post-test cleanup cmd> (default: none) 84a217f3d4e191eb886c986c5963c91891b544013anjn# 858d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# One of prog or prog-asis must be specified. 863b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# If prog or probB is a relative path, it will be prefix with the test directory. 878d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# prog-asis will be taken as is, i.e. not prefixed with the test directory. 88a217f3d4e191eb886c986c5963c91891b544013anjn# Note that filters are necessary for stderr results to filter out things that 89a217f3d4e191eb886c986c5963c91891b544013anjn# always change, eg. process id numbers. 903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# Note that if a progB is specified, it is started in background (before prog). 91e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 928d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# There can be more than one env: declaration. Here is an example: 938d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# env: PATH=/opt/bin:$PATH 948d22844dfa3625689d53e1ed0e471329de0f4c1eflorian# 951ee25f0cbf81a034d8189bff8bf7f1ad6be99cf0njn# Expected stdout (filtered) is kept in <test>.stdout.exp* (can be more 964592db65c3ff3fd299613306dcd83b7b584a7a84nethercote# than one expected output). It can be missing if it would be empty. Expected 9779e88da1b0ca82e02ca66e9109c63da995fcc65asewardj# stderr (filtered) is kept in <test>.stderr.exp*. There must be at least 98e8ffe52448e268273f7f566a98b038eb87490350njn# one stderr.exp* file. Any .exp* file that ends in '~' or '#' is ignored; 99e8ffe52448e268273f7f566a98b038eb87490350njn# this is because Emacs creates temporary files of these names. 100e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 1013b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# Expected output for progB is handled similarly, except that 1023b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# expected stdout and stderr for progB are in <test>.stdoutB.exp* 1033b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# and <test>.stderrB.exp*. 1043b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# 105e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# If results don't match, the output can be found in <test>.std<strm>.out, 1061ee25f0cbf81a034d8189bff8bf7f1ad6be99cf0njn# and the diff between expected and actual in <test>.std<strm>.diff*. 1073b290486cd4cd601b20e04340e593c9ed9717e5fsewardj# (for progB, in <test>.std<strm>2.out and <test>.std<strm>2.diff*). 108e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 10961485ab2fb3be07029d03088a5d66eb804e0f535njn# The prerequisite command, if present, works like this: 11061485ab2fb3be07029d03088a5d66eb804e0f535njn# - if it returns 0 the test is run 11161485ab2fb3be07029d03088a5d66eb804e0f535njn# - if it returns 1 the test is skipped 11261485ab2fb3be07029d03088a5d66eb804e0f535njn# - if it returns anything else the script aborts. 11361485ab2fb3be07029d03088a5d66eb804e0f535njn# The idea here is results other than 0 or 1 are likely to be due to 11461485ab2fb3be07029d03088a5d66eb804e0f535njn# problems with the commands, and you don't want to conflate them with the 1 11561485ab2fb3be07029d03088a5d66eb804e0f535njn# case, which would happen if you just tested for zero or non-zero. 11661485ab2fb3be07029d03088a5d66eb804e0f535njn# 11761485ab2fb3be07029d03088a5d66eb804e0f535njn# The post-test command, if present, must return 0 and its stdout must match 11861485ab2fb3be07029d03088a5d66eb804e0f535njn# the expected stdout which is kept in <test>.post.exp*. 11961485ab2fb3be07029d03088a5d66eb804e0f535njn# 1209136899ca8bdb68de5555469d280e3f769a3418bsewardj# Sometimes it is useful to run all the tests at a high sanity check 1219136899ca8bdb68de5555469d280e3f769a3418bsewardj# level or with arbitrary other flags. To make this simple, extra 1229136899ca8bdb68de5555469d280e3f769a3418bsewardj# options, applied to all tests run, are read from $EXTRA_REGTEST_OPTS, 1239136899ca8bdb68de5555469d280e3f769a3418bsewardj# and handed to valgrind prior to any other flags specified by the 1249136899ca8bdb68de5555469d280e3f769a3418bsewardj# .vgtest file. 1259136899ca8bdb68de5555469d280e3f769a3418bsewardj# 1267358d5279a943b065f90ad02b56e39402128338bnjn# Some more notes on adding regression tests for a new tool are in 1277358d5279a943b065f90ad02b56e39402128338bnjn# docs/xml/manual-writing-tools.xml. 128e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 129e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 1309fb16f52511969a48a056b8e71af852b0ff0da6dnjnuse warnings; 131e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnuse strict; 132e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 133e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 134e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Global vars 135e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 136a8162b21279cf61a262fe6cabd9e437811b1abaesewardjmy $usage="\n" 137eefeeb7a60a347bc851605fadd52672cbd927201sewardj . "Usage:\n" 13872faf10172c04674ac1e31cf4f7e57be241da7daphilippe . " vg_regtest [--all, --valgrind, --valgrind-lib, --keep-unfiltered\n" 13969e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe . " --outer-valgrind, --outer-tool, --outer-args\n" 14069e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe . " --loop-till-fail]\n" 141eefeeb7a60a347bc851605fadd52672cbd927201sewardj . " Use EXTRA_REGTEST_OPTS to supply extra args for all tests\n" 142eefeeb7a60a347bc851605fadd52672cbd927201sewardj . "\n"; 143e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 144e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $tmp="vg_regtest.tmp.$$"; 145e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 146e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Test variables 147e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $vgopts; # valgrind options 148e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $prog; # test prog 149e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $args; # test prog args 150e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $stdout_filter; # filter program to run stdout results file through 151e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $stderr_filter; # filter program to run stderr results file through 15231014dae410799bfb128af2d396ee70374fa4b75florianmy $stdout_filter_args; # arguments passed to stdout_filter 15331014dae410799bfb128af2d396ee70374fa4b75florianmy $stderr_filter_args; # arguments passed to stderr_filter 1543b290486cd4cd601b20e04340e593c9ed9717e5fsewardjmy $progB; # Same but for progB 1553b290486cd4cd601b20e04340e593c9ed9717e5fsewardjmy $argsB; # 1563b290486cd4cd601b20e04340e593c9ed9717e5fsewardjmy $stdoutB_filter; # 1573b290486cd4cd601b20e04340e593c9ed9717e5fsewardjmy $stderrB_filter; # 15831014dae410799bfb128af2d396ee70374fa4b75florianmy $stdoutB_filter_args;# arguments passed to stdout_filterB 15931014dae410799bfb128af2d396ee70374fa4b75florianmy $stderrB_filter_args;# arguments passed to stderr_filterB 1603b290486cd4cd601b20e04340e593c9ed9717e5fsewardjmy $stdinB; # Input file for progB 161c5e1d806c4f11f91401be4b9f70ac08b1c9d6f61nethercotemy $prereq; # prerequisite test to satisfy before running test 162734b805cb3af82ddd7d3ba22a0e22aba29b78305njnmy $post; # check command after running test 16364bc5af199f2b6a12e87d044ed7f9c1244860ad0nethercotemy $cleanup; # cleanup command to run 1648d22844dfa3625689d53e1ed0e471329de0f4c1eflorianmy @env = (); # environment variable to set prior calling $prog 165e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 166e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy @failures; # List of failed tests 167e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 1689fb16f52511969a48a056b8e71af852b0ff0da6dnjnmy $num_tests_done = 0; 1693b290486cd4cd601b20e04340e593c9ed9717e5fsewardjmy %num_failures = (stderr => 0, stdout => 0, 1703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj stderrB => 0, stdoutB => 0, 1713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj post => 0); 172e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 17371fe3e69d0f860cffc97acb96cb4553c6429d867njn# Default valgrind to use is this build tree's (uninstalled) one 17471fe3e69d0f860cffc97acb96cb4553c6429d867njnmy $valgrind = "./coregrind/valgrind"; 175e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 176e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnchomp(my $tests_dir = `pwd`); 177e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 17872faf10172c04674ac1e31cf4f7e57be241da7daphilippe# Outer valgrind to use, and args to use for it. 17972faf10172c04674ac1e31cf4f7e57be241da7daphilippemy $outer_valgrind; 18072faf10172c04674ac1e31cf4f7e57be241da7daphilippemy $outer_tool = "memcheck"; 18172faf10172c04674ac1e31cf4f7e57be241da7daphilippemy $outer_args; 18272faf10172c04674ac1e31cf4f7e57be241da7daphilippe 1833ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjnmy $valgrind_lib = "$tests_dir/.in_place"; 184eefeeb7a60a347bc851605fadd52672cbd927201sewardjmy $keepunfiltered = 0; 18569e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippemy $looptillfail = 0; 1863ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn 187e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# default filter is the one named "filter_stderr" in the test's directory 188e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy $default_stderr_filter = "filter_stderr"; 189e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 190e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 191e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 192e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Process command line, setup 193e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 194e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 195e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# If $prog is a relative path, it prepends $dir to it. Useful for two reasons: 196e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 197e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 1. Can prepend "." onto programs to avoid trouble with users who don't have 198e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# "." in their path (by making $dir = ".") 199e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 2. Can prepend the current dir to make the command absolute to avoid 200e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# subsequent trouble when we change directories. 201e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# 202e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Also checks the program exists and is executable. 203f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercotesub validate_program ($$$$) 204e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 205f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote my ($dir, $prog, $must_exist, $must_be_executable) = @_; 206e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 207e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn # If absolute path, leave it alone. If relative, make it 208e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn # absolute -- by prepending current dir -- so we can change 209e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn # dirs and still use it. 210e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn $prog = "$dir/$prog" if ($prog !~ /^\//); 211f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote if ($must_exist) { 212f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote (-f $prog) or die "vg_regtest: `$prog' not found or not a file ($dir)\n"; 213f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote } 21471fe3e69d0f860cffc97acb96cb4553c6429d867njn if ($must_be_executable) { 215f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote (-x $prog) or die "vg_regtest: `$prog' not executable ($dir)\n"; 21671fe3e69d0f860cffc97acb96cb4553c6429d867njn } 217e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 218e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn return $prog; 219e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 220e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 221e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnsub process_command_line() 222e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 223e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn my $alldirs = 0; 224e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn my @fs; 225e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 226e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn for my $arg (@ARGV) { 227e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn if ($arg =~ /^-/) { 228d8ced86d011bbc4069433f08096a5ad854d1a6e4njn if ($arg =~ /^--all$/) { 229e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn $alldirs = 1; 230e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } elsif ($arg =~ /^--valgrind=(.*)$/) { 231e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn $valgrind = $1; 23272faf10172c04674ac1e31cf4f7e57be241da7daphilippe } elsif ($arg =~ /^--outer-valgrind=(.*)$/) { 23372faf10172c04674ac1e31cf4f7e57be241da7daphilippe $outer_valgrind = $1; 23472faf10172c04674ac1e31cf4f7e57be241da7daphilippe } elsif ($arg =~ /^--outer-tool=(.*)$/) { 23572faf10172c04674ac1e31cf4f7e57be241da7daphilippe $outer_tool = $1; 23672faf10172c04674ac1e31cf4f7e57be241da7daphilippe } elsif ($arg =~ /^--outer-args=(.*)$/) { 23772faf10172c04674ac1e31cf4f7e57be241da7daphilippe $outer_args = $1; 2383ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn } elsif ($arg =~ /^--valgrind-lib=(.*)$/) { 2393ed896035e9e6d7ac33f7cc23f95c54ef7d477ffnjn $valgrind_lib = $1; 240eefeeb7a60a347bc851605fadd52672cbd927201sewardj } elsif ($arg =~ /^--keep-unfiltered$/) { 241eefeeb7a60a347bc851605fadd52672cbd927201sewardj $keepunfiltered = 1; 24269e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } elsif ($arg =~ /^--loop-till-fail$/) { 24369e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe $looptillfail = 1; 244e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } else { 245e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn die $usage; 246e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 247e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } else { 248e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn push(@fs, $arg); 249e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 250e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 251f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote $valgrind = validate_program($tests_dir, $valgrind, 1, 0); 25272faf10172c04674ac1e31cf4f7e57be241da7daphilippe 25372faf10172c04674ac1e31cf4f7e57be241da7daphilippe if (defined $outer_valgrind) { 25414ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe $outer_valgrind = validate_program($tests_dir, $outer_valgrind, 1, 1); 25572faf10172c04674ac1e31cf4f7e57be241da7daphilippe if (not defined $outer_args) { 25672faf10172c04674ac1e31cf4f7e57be241da7daphilippe $outer_args = 25714ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe " --command-line-only=yes" 25872faf10172c04674ac1e31cf4f7e57be241da7daphilippe . " --run-libc-freeres=no --sim-hints=enable-outer" 25914ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe . " --smc-check=all-non-file" 26072faf10172c04674ac1e31cf4f7e57be241da7daphilippe . " --vgdb=no --trace-children=yes --read-var-info=no" 2610a961fc3cd26c69331c1f66d94edcd08633c0030philippe . " --read-inline-info=yes" 26272faf10172c04674ac1e31cf4f7e57be241da7daphilippe . " --suppressions=" 26372faf10172c04674ac1e31cf4f7e57be241da7daphilippe . validate_program($tests_dir,"./tests/outer_inner.supp",1,0) 26472faf10172c04674ac1e31cf4f7e57be241da7daphilippe . " --memcheck:leak-check=full --memcheck:show-reachable=no" 26572faf10172c04674ac1e31cf4f7e57be241da7daphilippe . " "; 26672faf10172c04674ac1e31cf4f7e57be241da7daphilippe } 26772faf10172c04674ac1e31cf4f7e57be241da7daphilippe } 268e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 269e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn if ($alldirs) { 270e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn @fs = (); 271e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn foreach my $f (glob "*") { 272e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn push(@fs, $f) if (-d $f); 273e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 274e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 275e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 276e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn (0 != @fs) or die "No test files or directories specified\n"; 277e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 278e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn return @fs; 279e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 280e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 281e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 282e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Read a .vgtest file 283e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 284e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnsub read_vgtest_file($) 285e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 286e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn my ($f) = @_; 287e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 288e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn # Defaults. 2893b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ($vgopts, $prog, $args) = ("", undef, ""); 2903b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ($stdout_filter, $stderr_filter) = (undef, undef); 2913b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ($progB, $argsB, $stdinB) = (undef, "", undef); 2923b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ($stdoutB_filter, $stderrB_filter) = (undef, undef); 2933b290486cd4cd601b20e04340e593c9ed9717e5fsewardj ($prereq, $post, $cleanup) = (undef, undef, undef); 29431014dae410799bfb128af2d396ee70374fa4b75florian ($stdout_filter_args, $stderr_filter_args) = (undef, undef); 29531014dae410799bfb128af2d396ee70374fa4b75florian ($stdoutB_filter_args, $stderrB_filter_args) = (undef, undef); 296e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 297e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn # Every test directory must have a "filter_stderr" 298f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote $stderr_filter = validate_program(".", $default_stderr_filter, 1, 1); 2993b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $stderrB_filter = validate_program(".", $default_stderr_filter, 1, 1); 3003b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 301e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 302e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn open(INPUTFILE, "< $f") || die "File $f not openable\n"; 303e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 304e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn while (my $line = <INPUTFILE>) { 305b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj if ($line =~ /^\s*#/ || $line =~ /^\s*$/) { 306b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj next; 307b5f6f51ebcac183818061bf53427a3e7808ef10dsewardj } elsif ($line =~ /^\s*vgopts:\s*(.*)$/) { 308ef3862559ff73146bc2020d65918cabc243b6da8bart my $addvgopts = $1; 309ef3862559ff73146bc2020d65918cabc243b6da8bart $addvgopts =~ s/\${PWD}/$ENV{PWD}/g; 310ef3862559ff73146bc2020d65918cabc243b6da8bart $vgopts = $vgopts . " " . $addvgopts; # Nb: Make sure there's a space! 311e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } elsif ($line =~ /^\s*prog:\s*(.*)$/) { 312f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote $prog = validate_program(".", $1, 0, 0); 3138d22844dfa3625689d53e1ed0e471329de0f4c1eflorian } elsif ($line =~ /^\s*prog-asis:\s*(.*)$/) { 3148d22844dfa3625689d53e1ed0e471329de0f4c1eflorian $prog = $1; 315e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } elsif ($line =~ /^\s*args:\s*(.*)$/) { 316e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn $args = $1; 317e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } elsif ($line =~ /^\s*stdout_filter:\s*(.*)$/) { 318f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote $stdout_filter = validate_program(".", $1, 1, 1); 319e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } elsif ($line =~ /^\s*stderr_filter:\s*(.*)$/) { 320f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote $stderr_filter = validate_program(".", $1, 1, 1); 32131014dae410799bfb128af2d396ee70374fa4b75florian } elsif ($line =~ /^\s*stdout_filter_args:\s*(.*)$/) { 32231014dae410799bfb128af2d396ee70374fa4b75florian $stdout_filter_args = $1; 32331014dae410799bfb128af2d396ee70374fa4b75florian } elsif ($line =~ /^\s*stderr_filter_args:\s*(.*)$/) { 32431014dae410799bfb128af2d396ee70374fa4b75florian $stderr_filter_args = $1; 3253b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } elsif ($line =~ /^\s*progB:\s*(.*)$/) { 3263b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $progB = validate_program(".", $1, 0, 0); 3273b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } elsif ($line =~ /^\s*argsB:\s*(.*)$/) { 3283b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $argsB = $1; 3293b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } elsif ($line =~ /^\s*stdinB:\s*(.*)$/) { 3303b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $stdinB = $1; 3313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } elsif ($line =~ /^\s*stdoutB_filter:\s*(.*)$/) { 3323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $stdoutB_filter = validate_program(".", $1, 1, 1); 3333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } elsif ($line =~ /^\s*stderrB_filter:\s*(.*)$/) { 3343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $stderrB_filter = validate_program(".", $1, 1, 1); 3354b5c3f074cf9f275990dd6a61fbcfbe962877d98florian } elsif ($line =~ /^\s*stdoutB_filter_args:\s*(.*)$/) { 3364b5c3f074cf9f275990dd6a61fbcfbe962877d98florian $stdoutB_filter_args = $1; 3374b5c3f074cf9f275990dd6a61fbcfbe962877d98florian } elsif ($line =~ /^\s*stderrB_filter_args:\s*(.*)$/) { 3384b5c3f074cf9f275990dd6a61fbcfbe962877d98florian $stderrB_filter_args = $1; 339c5e1d806c4f11f91401be4b9f70ac08b1c9d6f61nethercote } elsif ($line =~ /^\s*prereq:\s*(.*)$/) { 340c5e1d806c4f11f91401be4b9f70ac08b1c9d6f61nethercote $prereq = $1; 341734b805cb3af82ddd7d3ba22a0e22aba29b78305njn } elsif ($line =~ /^\s*post:\s*(.*)$/) { 342734b805cb3af82ddd7d3ba22a0e22aba29b78305njn $post = $1; 34364bc5af199f2b6a12e87d044ed7f9c1244860ad0nethercote } elsif ($line =~ /^\s*cleanup:\s*(.*)$/) { 34464bc5af199f2b6a12e87d044ed7f9c1244860ad0nethercote $cleanup = $1; 3458d22844dfa3625689d53e1ed0e471329de0f4c1eflorian } elsif ($line =~ /^\s*env:\s*(.*)$/) { 3468d22844dfa3625689d53e1ed0e471329de0f4c1eflorian push @env,$1; 347e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } else { 348e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn die "Bad line in $f: $line\n"; 349e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 350e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 351e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn close(INPUTFILE); 352e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 353e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn if (!defined $prog) { 354f4928da3dcf75e364ed0636c25ddcff856ec6ca8nethercote $prog = ""; # allow no prog for testing error and --help cases 355e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 356e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 357e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 358e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 359e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Do one test 360e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 361e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Since most of the program time is spent in system() calls, need this to 362e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# propagate a Ctrl-C enabling us to quit. 363e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnsub mysystem($) 364e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 365734b805cb3af82ddd7d3ba22a0e22aba29b78305njn my $exit_code = system($_[0]); 366734b805cb3af82ddd7d3ba22a0e22aba29b78305njn ($exit_code == 2) and exit 1; # 2 is SIGINT 367734b805cb3af82ddd7d3ba22a0e22aba29b78305njn return $exit_code; 368e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 369e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 370eefeeb7a60a347bc851605fadd52672cbd927201sewardj# if $keepunfiltered, copies $1 to $1.unfiltered.out 371eefeeb7a60a347bc851605fadd52672cbd927201sewardj# renames $0 tp $1 372eefeeb7a60a347bc851605fadd52672cbd927201sewardjsub filtered_rename($$) 373eefeeb7a60a347bc851605fadd52672cbd927201sewardj{ 374eefeeb7a60a347bc851605fadd52672cbd927201sewardj if ($keepunfiltered == 1) { 375eefeeb7a60a347bc851605fadd52672cbd927201sewardj mysystem("cp $_[1] $_[1].unfiltered.out"); 376eefeeb7a60a347bc851605fadd52672cbd927201sewardj } 377eefeeb7a60a347bc851605fadd52672cbd927201sewardj rename ($_[0], $_[1]); 378eefeeb7a60a347bc851605fadd52672cbd927201sewardj} 379eefeeb7a60a347bc851605fadd52672cbd927201sewardj 380eefeeb7a60a347bc851605fadd52672cbd927201sewardj 381137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercote# from a directory name like "/foo/cachesim/tests/" determine the tool name 382137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercotesub determine_tool() 383cac76cb18577b9c51d331f56e8ea241f6effaf31njn{ 384cac76cb18577b9c51d331f56e8ea241f6effaf31njn my $dir = `pwd`; 385137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercote $dir =~ /.*\/([^\/]+)\/tests.*/; # foo/tool_name/tests/foo 386cac76cb18577b9c51d331f56e8ea241f6effaf31njn return $1; 387cac76cb18577b9c51d331f56e8ea241f6effaf31njn} 388cac76cb18577b9c51d331f56e8ea241f6effaf31njn 3894592db65c3ff3fd299613306dcd83b7b584a7a84nethercote# Compare output against expected output; it should match at least one of 3904592db65c3ff3fd299613306dcd83b7b584a7a84nethercote# them. 3914592db65c3ff3fd299613306dcd83b7b584a7a84nethercotesub do_diffs($$$$) 3924592db65c3ff3fd299613306dcd83b7b584a7a84nethercote{ 3934592db65c3ff3fd299613306dcd83b7b584a7a84nethercote my ($fullname, $name, $mid, $f_exps) = @_; 3944592db65c3ff3fd299613306dcd83b7b584a7a84nethercote 3954592db65c3ff3fd299613306dcd83b7b584a7a84nethercote for my $f_exp (@$f_exps) { 3964592db65c3ff3fd299613306dcd83b7b584a7a84nethercote (-r $f_exp) or die "Could not read `$f_exp'\n"; 3974592db65c3ff3fd299613306dcd83b7b584a7a84nethercote 398e8ffe52448e268273f7f566a98b038eb87490350njn # Emacs produces temporary files that end in '~' and '#'. We ignore 399e8ffe52448e268273f7f566a98b038eb87490350njn # these. 400e8ffe52448e268273f7f566a98b038eb87490350njn if ($f_exp !~ /[~#]$/) { 401e8ffe52448e268273f7f566a98b038eb87490350njn # $n is the (optional) suffix after the ".exp"; we tack it onto 402e8ffe52448e268273f7f566a98b038eb87490350njn # the ".diff" file. 403e8ffe52448e268273f7f566a98b038eb87490350njn my $n = ""; 404e8ffe52448e268273f7f566a98b038eb87490350njn if ($f_exp =~ /.*\.exp(.*)$/) { 405e8ffe52448e268273f7f566a98b038eb87490350njn $n = $1; 406e8ffe52448e268273f7f566a98b038eb87490350njn } else { 407e8ffe52448e268273f7f566a98b038eb87490350njn $n = ""; 408e8ffe52448e268273f7f566a98b038eb87490350njn ($f_exp eq "/dev/null") or die "Unexpected .exp file: $f_exp\n"; 409e8ffe52448e268273f7f566a98b038eb87490350njn } 4104592db65c3ff3fd299613306dcd83b7b584a7a84nethercote 4110d2e58f427658a7322ca5a6a715bd33e8a2930b8njn mysystem("@DIFF@ $f_exp $name.$mid.out > $name.$mid.diff$n"); 4124592db65c3ff3fd299613306dcd83b7b584a7a84nethercote 413e8ffe52448e268273f7f566a98b038eb87490350njn if (not -s "$name.$mid.diff$n") { 414e8ffe52448e268273f7f566a98b038eb87490350njn # A match; remove .out and any previously created .diff files. 415e8ffe52448e268273f7f566a98b038eb87490350njn unlink("$name.$mid.out"); 416e8ffe52448e268273f7f566a98b038eb87490350njn unlink(<$name.$mid.diff*>); 417e8ffe52448e268273f7f566a98b038eb87490350njn return; 418e8ffe52448e268273f7f566a98b038eb87490350njn } 4194592db65c3ff3fd299613306dcd83b7b584a7a84nethercote } 4204592db65c3ff3fd299613306dcd83b7b584a7a84nethercote } 4214592db65c3ff3fd299613306dcd83b7b584a7a84nethercote # If we reach here, none of the .exp files matched. 4224592db65c3ff3fd299613306dcd83b7b584a7a84nethercote print "*** $name failed ($mid) ***\n"; 4234592db65c3ff3fd299613306dcd83b7b584a7a84nethercote push(@failures, sprintf("%-40s ($mid)", "$fullname")); 4244592db65c3ff3fd299613306dcd83b7b584a7a84nethercote $num_failures{$mid}++; 42569e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe if ($looptillfail == 1) { 42669e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe print "Failure encountered, stopping to loop\n"; 42769e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe exit 1 42869e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } 4294592db65c3ff3fd299613306dcd83b7b584a7a84nethercote} 4304592db65c3ff3fd299613306dcd83b7b584a7a84nethercote 431e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnsub do_one_test($$) 432e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 433e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn my ($dir, $vgtest) = @_; 434e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn $vgtest =~ /^(.*)\.vgtest/; 435e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn my $name = $1; 436e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn my $fullname = "$dir/$name"; 437e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 4389136899ca8bdb68de5555469d280e3f769a3418bsewardj # Pull any extra options (for example, --sanity-level=4) 4399136899ca8bdb68de5555469d280e3f769a3418bsewardj # from $EXTRA_REGTEST_OPTS. 4409136899ca8bdb68de5555469d280e3f769a3418bsewardj my $maybe_extraopts = $ENV{"EXTRA_REGTEST_OPTS"}; 4419136899ca8bdb68de5555469d280e3f769a3418bsewardj my $extraopts = $maybe_extraopts ? $maybe_extraopts : ""; 4429136899ca8bdb68de5555469d280e3f769a3418bsewardj 443e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn read_vgtest_file($vgtest); 444e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 445c5e1d806c4f11f91401be4b9f70ac08b1c9d6f61nethercote if (defined $prereq) { 44661485ab2fb3be07029d03088a5d66eb804e0f535njn my $prereq_res = system("$prereq"); 44761485ab2fb3be07029d03088a5d66eb804e0f535njn if (0 == $prereq_res) { 44861485ab2fb3be07029d03088a5d66eb804e0f535njn # Do nothing (ie. continue with the test) 44961485ab2fb3be07029d03088a5d66eb804e0f535njn } elsif (256 == $prereq_res) { 45061485ab2fb3be07029d03088a5d66eb804e0f535njn # Nb: weird Perl-ism -- exit code of '1' is seen by Perl as 256... 45161485ab2fb3be07029d03088a5d66eb804e0f535njn # Prereq failed, skip. 452c5e1d806c4f11f91401be4b9f70ac08b1c9d6f61nethercote printf("%-16s (skipping, prereq failed: $prereq)\n", "$name:"); 453781bed4df9b5d4e523b3b2f111e4a1d5f79534e5nethercote return; 45461485ab2fb3be07029d03088a5d66eb804e0f535njn } else { 45561485ab2fb3be07029d03088a5d66eb804e0f535njn # Bad prereq; abort. 45661485ab2fb3be07029d03088a5d66eb804e0f535njn $prereq_res /= 256; 45761485ab2fb3be07029d03088a5d66eb804e0f535njn die "prereq returned $prereq_res: $prereq\n"; 458781bed4df9b5d4e523b3b2f111e4a1d5f79534e5nethercote } 459b1affa88ef798064014f9657fa6bb4a8501fdbf8nethercote } 460b1affa88ef798064014f9657fa6bb4a8501fdbf8nethercote 461e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 4623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (defined $progB) { 4633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # If there is a progB, let's start it in background: 4643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj printf("%-16s valgrind $extraopts $vgopts $prog $args (progB: $progB $argsB)\n", 4653b290486cd4cd601b20e04340e593c9ed9717e5fsewardj "$name:"); 4663b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # progB.done used to detect child has finished. See below. 4673b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # Note: redirection of stdout and stderr is before $progB to allow argsB 4683b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # to e.g. redirect stdoutB to stderrB 4693b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (defined $stdinB) { 4703b290486cd4cd601b20e04340e593c9ed9717e5fsewardj mysystem("(rm -f progB.done;" 4713b290486cd4cd601b20e04340e593c9ed9717e5fsewardj . " < $stdinB > $name.stdoutB.out 2> $name.stderrB.out $progB $argsB;" 4723b290486cd4cd601b20e04340e593c9ed9717e5fsewardj . "touch progB.done) &"); 4733b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 4743b290486cd4cd601b20e04340e593c9ed9717e5fsewardj mysystem("(rm -f progB.done;" 4753b290486cd4cd601b20e04340e593c9ed9717e5fsewardj . " > $name.stdoutB.out 2> $name.stderrB.out $progB $argsB;" 4763b290486cd4cd601b20e04340e593c9ed9717e5fsewardj . "touch progB.done) &"); 4773b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4783b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } else { 4793b290486cd4cd601b20e04340e593c9ed9717e5fsewardj printf("%-16s valgrind $extraopts $vgopts $prog $args\n", "$name:"); 4803b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 4818d22844dfa3625689d53e1ed0e471329de0f4c1eflorian 4828d22844dfa3625689d53e1ed0e471329de0f4c1eflorian # Collect environment variables, if any. 4838d22844dfa3625689d53e1ed0e471329de0f4c1eflorian my $envvars = ""; 4848d22844dfa3625689d53e1ed0e471329de0f4c1eflorian foreach my $e (@env) { 4858d22844dfa3625689d53e1ed0e471329de0f4c1eflorian $envvars = "$envvars $e"; 4868d22844dfa3625689d53e1ed0e471329de0f4c1eflorian } 4878d22844dfa3625689d53e1ed0e471329de0f4c1eflorian 488137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercote # Pass the appropriate --tool option for the directory (can be overridden 48914ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe # by an "args:" line, though). 490137bc55f216bc7d9528f159a78cdf9025e0b02ffnethercote my $tool=determine_tool(); 49172faf10172c04674ac1e31cf4f7e57be241da7daphilippe if (defined $outer_valgrind ) { 49214ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe # in an outer-inner setup, only set VALGRIND_LIB_INNER 4938d22844dfa3625689d53e1ed0e471329de0f4c1eflorian mysystem( "$envvars VALGRIND_LIB_INNER=$valgrind_lib " 49414ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe . "$outer_valgrind " 49572faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "--tool=" . $outer_tool . " " 49672faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "$outer_args " 49772faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "--log-file=" . "$name.outer.log " 49872faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "$valgrind --command-line-only=yes --memcheck:leak-check=no " 49972faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "--sim-hints=no-inner-prefix " 50072faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "--tool=$tool $extraopts $vgopts " 50172faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "$prog $args > $name.stdout.out 2> $name.stderr.out"); 50272faf10172c04674ac1e31cf4f7e57be241da7daphilippe } else { 50314ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe # Set both VALGRIND_LIB and VALGRIND_LIB_INNER in case this Valgrind 50414ab1a33f4cf3f9ed5a15794a1adb50106f7ea3aphilippe # was configured with --enable-inner. 5058d22844dfa3625689d53e1ed0e471329de0f4c1eflorian mysystem( "$envvars VALGRIND_LIB=$valgrind_lib VALGRIND_LIB_INNER=$valgrind_lib " 50672faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "$valgrind --command-line-only=yes --memcheck:leak-check=no " 50772faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "--tool=$tool $extraopts $vgopts " 50872faf10172c04674ac1e31cf4f7e57be241da7daphilippe . "$prog $args > $name.stdout.out 2> $name.stderr.out"); 50972faf10172c04674ac1e31cf4f7e57be241da7daphilippe } 510e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 5110001fc3062186352db6f31829b0b62953dda138enjn # Filter stdout 512e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn if (defined $stdout_filter) { 51331014dae410799bfb128af2d396ee70374fa4b75florian $stdout_filter_args = $name if (! defined $stdout_filter_args); 51431014dae410799bfb128af2d396ee70374fa4b75florian mysystem("$stdout_filter $stdout_filter_args < $name.stdout.out > $tmp"); 515eefeeb7a60a347bc851605fadd52672cbd927201sewardj filtered_rename($tmp, "$name.stdout.out"); 516e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 5174592db65c3ff3fd299613306dcd83b7b584a7a84nethercote # Find all the .stdout.exp files. If none, use /dev/null. 5184592db65c3ff3fd299613306dcd83b7b584a7a84nethercote my @stdout_exps = <$name.stdout.exp*>; 5194592db65c3ff3fd299613306dcd83b7b584a7a84nethercote @stdout_exps = ( "/dev/null" ) if (0 == scalar @stdout_exps); 5200001fc3062186352db6f31829b0b62953dda138enjn do_diffs($fullname, $name, "stdout", \@stdout_exps); 521e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 5220001fc3062186352db6f31829b0b62953dda138enjn # Filter stderr 52331014dae410799bfb128af2d396ee70374fa4b75florian $stderr_filter_args = $name if (! defined $stderr_filter_args); 52431014dae410799bfb128af2d396ee70374fa4b75florian mysystem("$stderr_filter $stderr_filter_args < $name.stderr.out > $tmp"); 525eefeeb7a60a347bc851605fadd52672cbd927201sewardj filtered_rename($tmp, "$name.stderr.out"); 52679e88da1b0ca82e02ca66e9109c63da995fcc65asewardj # Find all the .stderr.exp files. At least one must exist. 5274592db65c3ff3fd299613306dcd83b7b584a7a84nethercote my @stderr_exps = <$name.stderr.exp*>; 52879e88da1b0ca82e02ca66e9109c63da995fcc65asewardj (0 != scalar @stderr_exps) or die "Could not find `$name.stderr.exp*'\n"; 5294592db65c3ff3fd299613306dcd83b7b584a7a84nethercote do_diffs($fullname, $name, "stderr", \@stderr_exps); 5300001fc3062186352db6f31829b0b62953dda138enjn 5313b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (defined $progB) { 5323b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # wait for the child to be finished 5333b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # tried things such as: 5343b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # wait; 5353b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # $SIG{CHLD} = sub { wait }; 5363b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # but nothing worked: 5373b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # e.g. running mssnapshot.vgtest in a loop failed from time to time 5383b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # due to some missing output (not yet written?). 5393b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # So, we search progB.done during max 100 times 100 millisecond. 5403b290486cd4cd601b20e04340e593c9ed9717e5fsewardj my $count; 5413b290486cd4cd601b20e04340e593c9ed9717e5fsewardj for ($count = 1; $count <= 100; $count++) { 5423b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (-f "progB.done") or select(undef, undef, undef, 0.100); 5433b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 5443b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # Filter stdout 5453b290486cd4cd601b20e04340e593c9ed9717e5fsewardj if (defined $stdoutB_filter) { 54631014dae410799bfb128af2d396ee70374fa4b75florian $stdoutB_filter_args = $name if (! defined $stdoutB_filter_args); 54731014dae410799bfb128af2d396ee70374fa4b75florian mysystem("$stdoutB_filter $stdoutB_filter_args < $name.stdoutB.out > $tmp"); 548eefeeb7a60a347bc851605fadd52672cbd927201sewardj filtered_rename($tmp, "$name.stdoutB.out"); 5493b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 5503b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # Find all the .stdoutB.exp files. If none, use /dev/null. 5513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj my @stdoutB_exps = <$name.stdoutB.exp*>; 5523b290486cd4cd601b20e04340e593c9ed9717e5fsewardj @stdoutB_exps = ( "/dev/null" ) if (0 == scalar @stdoutB_exps); 5533b290486cd4cd601b20e04340e593c9ed9717e5fsewardj do_diffs($fullname, $name, "stdoutB", \@stdoutB_exps); 5543b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5553b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # Filter stderr 55631014dae410799bfb128af2d396ee70374fa4b75florian $stderrB_filter_args = $name if (! defined $stderrB_filter_args); 55731014dae410799bfb128af2d396ee70374fa4b75florian mysystem("$stderrB_filter $stderrB_filter_args < $name.stderrB.out > $tmp"); 558eefeeb7a60a347bc851605fadd52672cbd927201sewardj filtered_rename($tmp, "$name.stderrB.out"); 5593b290486cd4cd601b20e04340e593c9ed9717e5fsewardj # Find all the .stderrB.exp files. At least one must exist. 5603b290486cd4cd601b20e04340e593c9ed9717e5fsewardj my @stderrB_exps = <$name.stderrB.exp*>; 5613b290486cd4cd601b20e04340e593c9ed9717e5fsewardj (0 != scalar @stderrB_exps) or die "Could not find `$name.stderrB.exp*'\n"; 5623b290486cd4cd601b20e04340e593c9ed9717e5fsewardj do_diffs($fullname, $name, "stderrB", \@stderrB_exps); 5633b290486cd4cd601b20e04340e593c9ed9717e5fsewardj } 5643b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 5650001fc3062186352db6f31829b0b62953dda138enjn # Maybe do post-test check 566734b805cb3af82ddd7d3ba22a0e22aba29b78305njn if (defined $post) { 567734b805cb3af82ddd7d3ba22a0e22aba29b78305njn if (mysystem("$post > $name.post.out") != 0) { 568734b805cb3af82ddd7d3ba22a0e22aba29b78305njn print("post check failed: $post\n"); 569734b805cb3af82ddd7d3ba22a0e22aba29b78305njn $num_failures{"post"}++; 5700001fc3062186352db6f31829b0b62953dda138enjn } else { 571734b805cb3af82ddd7d3ba22a0e22aba29b78305njn # Find all the .post.exp files. If none, use /dev/null. 572734b805cb3af82ddd7d3ba22a0e22aba29b78305njn my @post_exps = <$name.post.exp*>; 573734b805cb3af82ddd7d3ba22a0e22aba29b78305njn @post_exps = ( "/dev/null" ) if (0 == scalar @post_exps); 574734b805cb3af82ddd7d3ba22a0e22aba29b78305njn do_diffs($fullname, $name, "post", \@post_exps); 5750001fc3062186352db6f31829b0b62953dda138enjn } 5760001fc3062186352db6f31829b0b62953dda138enjn } 577c1f8ad91417317d6465a8326b77831a485939c52nethercote 57864bc5af199f2b6a12e87d044ed7f9c1244860ad0nethercote if (defined $cleanup) { 57964bc5af199f2b6a12e87d044ed7f9c1244860ad0nethercote (system("$cleanup") == 0) or 58064bc5af199f2b6a12e87d044ed7f9c1244860ad0nethercote print("(cleanup operation failed: $cleanup)\n"); 581c1f8ad91417317d6465a8326b77831a485939c52nethercote } 582c1f8ad91417317d6465a8326b77831a485939c52nethercote 5839fb16f52511969a48a056b8e71af852b0ff0da6dnjn $num_tests_done++; 584e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 585e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 586e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 587cac76cb18577b9c51d331f56e8ea241f6effaf31njn# Test one directory (and any subdirs) 588e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 589db3c469408a7439182e354b6914e8558023ca59enjnsub test_one_dir($$); # forward declaration 590cac76cb18577b9c51d331f56e8ea241f6effaf31njn 591db3c469408a7439182e354b6914e8558023ca59enjnsub test_one_dir($$) 592e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 593db3c469408a7439182e354b6914e8558023ca59enjn my ($dir, $prev_dirs) = @_; 594e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn $dir =~ s/\/$//; # trim a trailing '/' 595e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 596362c0d257b76d1f731a38f9eeb81351d9519963bnethercote # Ignore dirs into which we should not recurse. 59792f0b80fbc7dcdec2bb9f97c9c5cf7e35c48ad6emueller if ($dir =~ /^(BitKeeper|CVS|SCCS|docs|doc)$/) { return; } 598cac76cb18577b9c51d331f56e8ea241f6effaf31njn 599107bc570086d154e2be46cf044a8b0f72fb07949njn (-x "$tests_dir/tests/arch_test") or die 600107bc570086d154e2be46cf044a8b0f72fb07949njn "vg_regtest: 'arch_test' is missing. Did you forget to 'make check'?\n"; 60152783ca9c51977276ef0a8367bad550f283b461anjn 602362c0d257b76d1f731a38f9eeb81351d9519963bnethercote # Ignore any dir whose name matches that of an architecture which is not 603107bc570086d154e2be46cf044a8b0f72fb07949njn # the architecture we are running on. Eg. when running on x86, ignore 604107bc570086d154e2be46cf044a8b0f72fb07949njn # ppc/ directories ('arch_test' returns 1 for this case). Likewise for 605107bc570086d154e2be46cf044a8b0f72fb07949njn # the OS and platform. 606362c0d257b76d1f731a38f9eeb81351d9519963bnethercote # Nb: weird Perl-ism -- exit code of '1' is seen by Perl as 256... 60761485ab2fb3be07029d03088a5d66eb804e0f535njn if (256 == system("$tests_dir/tests/arch_test $dir")) { return; } 60861485ab2fb3be07029d03088a5d66eb804e0f535njn if (256 == system("$tests_dir/tests/os_test $dir")) { return; } 609107bc570086d154e2be46cf044a8b0f72fb07949njn if ($dir =~ /(\w+)-(\w+)/ && 610107bc570086d154e2be46cf044a8b0f72fb07949njn 256 == system("sh $tests_dir/tests/platform_test $1 $2")) { return; } 611362c0d257b76d1f731a38f9eeb81351d9519963bnethercote 612e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn chdir($dir) or die "Could not change into $dir\n"; 613e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 614584eaacf6c0cc2820a54da7323d2b01c1796cd1cnjn # Nb: Don't prepend a '/' to the base directory 615584eaacf6c0cc2820a54da7323d2b01c1796cd1cnjn my $full_dir = $prev_dirs . ($prev_dirs eq "" ? "" : "/") . $dir; 616db3c469408a7439182e354b6914e8558023ca59enjn my $dashes = "-" x (50 - length $full_dir); 617db3c469408a7439182e354b6914e8558023ca59enjn 618cac76cb18577b9c51d331f56e8ea241f6effaf31njn my @fs = glob "*"; 619db3c469408a7439182e354b6914e8558023ca59enjn my $found_tests = (0 != (grep { $_ =~ /\.vgtest$/ } @fs)); 620cac76cb18577b9c51d331f56e8ea241f6effaf31njn 621db3c469408a7439182e354b6914e8558023ca59enjn if ($found_tests) { 622db3c469408a7439182e354b6914e8558023ca59enjn print "-- Running tests in $full_dir $dashes\n"; 623db3c469408a7439182e354b6914e8558023ca59enjn } 624cac76cb18577b9c51d331f56e8ea241f6effaf31njn foreach my $f (@fs) { 625cac76cb18577b9c51d331f56e8ea241f6effaf31njn if (-d $f) { 626db3c469408a7439182e354b6914e8558023ca59enjn test_one_dir($f, $full_dir); 627cac76cb18577b9c51d331f56e8ea241f6effaf31njn } elsif ($f =~ /\.vgtest$/) { 628db3c469408a7439182e354b6914e8558023ca59enjn do_one_test($full_dir, $f); 629cac76cb18577b9c51d331f56e8ea241f6effaf31njn } 630e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 631db3c469408a7439182e354b6914e8558023ca59enjn if ($found_tests) { 632db3c469408a7439182e354b6914e8558023ca59enjn print "-- Finished tests in $full_dir $dashes\n"; 633db3c469408a7439182e354b6914e8558023ca59enjn } 634db3c469408a7439182e354b6914e8558023ca59enjn 635e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn chdir(".."); 636e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 637e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 638e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 639e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# Summarise results 640e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 6419fb16f52511969a48a056b8e71af852b0ff0da6dnjnsub plural($) 6429fb16f52511969a48a056b8e71af852b0ff0da6dnjn{ 6439fb16f52511969a48a056b8e71af852b0ff0da6dnjn return ( $_[0] == 1 ? "" : "s" ); 6449fb16f52511969a48a056b8e71af852b0ff0da6dnjn} 6459fb16f52511969a48a056b8e71af852b0ff0da6dnjn 646e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnsub summarise_results 647e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 648d8ced86d011bbc4069433f08096a5ad854d1a6e4njn my $x = ( $num_tests_done == 1 ? "test" : "tests" ); 649d8ced86d011bbc4069433f08096a5ad854d1a6e4njn 6500001fc3062186352db6f31829b0b62953dda138enjn printf("\n== %d test%s, %d stderr failure%s, %d stdout failure%s, " 6513b290486cd4cd601b20e04340e593c9ed9717e5fsewardj . "%d stderrB failure%s, %d stdoutB failure%s, " 652734b805cb3af82ddd7d3ba22a0e22aba29b78305njn . "%d post failure%s ==\n", 6539fb16f52511969a48a056b8e71af852b0ff0da6dnjn $num_tests_done, plural($num_tests_done), 6540001fc3062186352db6f31829b0b62953dda138enjn $num_failures{"stderr"}, plural($num_failures{"stderr"}), 6550001fc3062186352db6f31829b0b62953dda138enjn $num_failures{"stdout"}, plural($num_failures{"stdout"}), 6563b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $num_failures{"stderrB"}, plural($num_failures{"stderrB"}), 6573b290486cd4cd601b20e04340e593c9ed9717e5fsewardj $num_failures{"stdoutB"}, plural($num_failures{"stdoutB"}), 658734b805cb3af82ddd7d3ba22a0e22aba29b78305njn $num_failures{"post"}, plural($num_failures{"post"})); 6599fb16f52511969a48a056b8e71af852b0ff0da6dnjn 6609fb16f52511969a48a056b8e71af852b0ff0da6dnjn foreach my $failure (@failures) { 6619fb16f52511969a48a056b8e71af852b0ff0da6dnjn print "$failure\n"; 662e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 6639fb16f52511969a48a056b8e71af852b0ff0da6dnjn print "\n"; 664e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 665e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 666e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 667e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn# main(), sort of 668e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#---------------------------------------------------------------------------- 6699136899ca8bdb68de5555469d280e3f769a3418bsewardjsub warn_about_EXTRA_REGTEST_OPTS() 6709136899ca8bdb68de5555469d280e3f769a3418bsewardj{ 6719136899ca8bdb68de5555469d280e3f769a3418bsewardj print "WARNING: \$EXTRA_REGTEST_OPTS is set. You probably don't want\n"; 6729136899ca8bdb68de5555469d280e3f769a3418bsewardj print "to run the regression tests with it set, unless you are doing some\n"; 6739136899ca8bdb68de5555469d280e3f769a3418bsewardj print "strange experiment, and/or you really know what you are doing.\n"; 6749136899ca8bdb68de5555469d280e3f769a3418bsewardj print "\n"; 6759136899ca8bdb68de5555469d280e3f769a3418bsewardj} 676e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 677bb936987ffdbca90f57d80c56cf10e0512e83c86daywalker# nuke VALGRIND_OPTS 678bb936987ffdbca90f57d80c56cf10e0512e83c86daywalker$ENV{"VALGRIND_OPTS"} = ""; 679e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 6809136899ca8bdb68de5555469d280e3f769a3418bsewardjif ($ENV{"EXTRA_REGTEST_OPTS"}) { 6819136899ca8bdb68de5555469d280e3f769a3418bsewardj print "\n"; 6829136899ca8bdb68de5555469d280e3f769a3418bsewardj warn_about_EXTRA_REGTEST_OPTS(); 6839136899ca8bdb68de5555469d280e3f769a3418bsewardj} 6849136899ca8bdb68de5555469d280e3f769a3418bsewardj 685e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnmy @fs = process_command_line(); 68669e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippewhile (1) { # we will exit after one loop, unless looptillfail 68769e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe foreach my $f (@fs) { 68869e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe if (-d $f) { 68969e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe test_one_dir($f, ""); 69069e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } else { 69169e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe # Allow the .vgtest suffix to be given or omitted 69269e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe if ($f =~ /.vgtest$/ && -r $f) { 69369e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe # do nothing 69469e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } elsif (-r "$f.vgtest") { 69569e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe $f = "$f.vgtest"; 69669e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } else { 69769e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe die "`$f' neither a directory nor a readable test file/name\n" 69869e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } 69969e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe my $dir = `dirname $f`; chomp $dir; 70069e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe my $file = `basename $f`; chomp $file; 70169e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe chdir($dir) or die "Could not change into $dir\n"; 70269e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe do_one_test($dir, $file); 703e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 70469e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe chdir($tests_dir); 70569e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe } 70669e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe if ($looptillfail == 0) { 70769e8f1712e67bc40439e91e39dc7b0ea2ed55ecephilippe last; 708e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn } 709e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 710e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnsummarise_results(); 711e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 7129136899ca8bdb68de5555469d280e3f769a3418bsewardjif ($ENV{"EXTRA_REGTEST_OPTS"}) { 7139136899ca8bdb68de5555469d280e3f769a3418bsewardj warn_about_EXTRA_REGTEST_OPTS(); 7149136899ca8bdb68de5555469d280e3f769a3418bsewardj} 7159136899ca8bdb68de5555469d280e3f769a3418bsewardj 7160001fc3062186352db6f31829b0b62953dda138enjnif (0 == $num_failures{"stdout"} && 7170001fc3062186352db6f31829b0b62953dda138enjn 0 == $num_failures{"stderr"} && 7183b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 0 == $num_failures{"stdoutB"} && 7193b290486cd4cd601b20e04340e593c9ed9717e5fsewardj 0 == $num_failures{"stderrB"} && 720734b805cb3af82ddd7d3ba22a0e22aba29b78305njn 0 == $num_failures{"post"}) { 721ab4221970f8a69c7918cc1dc85f3ae670c11f135nethercote exit 0; 722ab4221970f8a69c7918cc1dc85f3ae670c11f135nethercote} else { 723ab4221970f8a69c7918cc1dc85f3ae670c11f135nethercote exit 1; 724ab4221970f8a69c7918cc1dc85f3ae670c11f135nethercote} 725ab4221970f8a69c7918cc1dc85f3ae670c11f135nethercote 726c2e7f483a74e57544febba85b603127c6d22c455njn##--------------------------------------------------------------------## 727c2e7f483a74e57544febba85b603127c6d22c455njn##--- end vg_regtest ---## 728c2e7f483a74e57544febba85b603127c6d22c455njn##--------------------------------------------------------------------## 729