X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=tools%2Fprivoxy-regression-test.pl;h=986279e148a9908962a2bcd1bc8446f0d02af440;hb=08a611cffcf193cfde6cc3737f7eb48392dff872;hp=3240bd412618e7b90ab5c2768237ea6d3f379c96;hpb=c437e931e230afe216e356b53780df6e54b31c55;p=privoxy.git
diff --git a/tools/privoxy-regression-test.pl b/tools/privoxy-regression-test.pl
index 3240bd41..986279e1 100755
--- a/tools/privoxy-regression-test.pl
+++ b/tools/privoxy-regression-test.pl
@@ -7,7 +7,7 @@
# A regression test "framework" for Privoxy. For documentation see:
# perldoc privoxy-regression-test.pl
#
-# $Id: privoxy-regression-test.pl,v 1.152 2008/05/19 17:30:14 fk Exp $
+# $Id: privoxy-regression-test.pl,v 1.161 2008/10/25 15:44:26 fk Exp $
#
# Wish list:
#
@@ -16,8 +16,6 @@
# - Implement a HTTP_VERSION directive or allow to
# specify whole request lines.
# - Support filter regression tests.
-# - Add option to fork regression tests and run them in parallel,
-# possibly optional forever.
# - Document magic Expect Header values
# - Internal fuzz support?
#
@@ -42,19 +40,20 @@ use strict;
use Getopt::Long;
use constant {
- PRT_VERSION => 'Privoxy-Regression-Test 0.2',
+ PRT_VERSION => 'Privoxy-Regression-Test 0.3',
- CURL => 'curl',
+ CURL => 'curl',
# CLI option defaults
- CLI_RETRIES => 1,
- CLI_LOOPS => 1,
- CLI_MAX_TIME => 5,
- CLI_MIN_LEVEL => 0,
- CLI_MAX_LEVEL => 25,
+ CLI_RETRIES => 1,
+ CLI_LOOPS => 1,
+ CLI_MAX_TIME => 5,
+ CLI_MIN_LEVEL => 0,
+ CLI_MAX_LEVEL => 25,
+ CLI_FORKS => 0,
PRIVOXY_CGI_URL => 'http://p.p/',
- FELLATIO_URL => 'http://10.0.0.1:8080/',
+ FELLATIO_URL => 'http://127.0.0.1:8080/',
LEADING_LOG_DATE => 1,
LEADING_LOG_TIME => 1,
@@ -156,9 +155,11 @@ sub load_regressions_tests () {
our $privoxy_cgi_url;
our @privoxy_config;
+ our %privoxy_features;
my @actionfiles;
my $curl_url = '';
my $file_number = 0;
+ my $feature;
$curl_url .= $privoxy_cgi_url;
$curl_url .= 'show-status';
@@ -177,6 +178,15 @@ sub load_regressions_tests () {
my $directive = $1 . " " . $2;
push (@privoxy_config, $directive);
+
+ } elsif (m@
([^<]*) | @) {
+
+ $feature = $1;
+
+ } elsif (m@ (Yes|No) | @) {
+
+ $privoxy_features{$feature} = $1 if defined $feature;
+ $feature = undef;
}
}
@@ -311,7 +321,8 @@ sub load_action_files ($) {
my $ignored = 0;
- l(LL_STATUS, "Loading regression tests from action file(s) delivered by Privoxy.");
+ l(LL_STATUS, "Gathering regression tests from " .
+ @actionfiles . " action file(s) delivered by Privoxy.");
for my $file_number (0 .. @actionfiles - 1) {
@@ -539,6 +550,8 @@ sub dependency_unsatisfied ($) {
my $level = shift;
our %dependencies;
our @privoxy_config;
+ our %privoxy_features;
+
my $dependency_problem = 0;
if (defined ($dependencies{$level}{'config line'})) {
@@ -549,6 +562,20 @@ sub dependency_unsatisfied ($) {
foreach (@privoxy_config) {
$dependency_problem = 0 if (/$dependency/);
+ last;
+ }
+
+ } elsif (defined ($dependencies{$level}{'feature status'})) {
+
+ my $dependency = $dependencies{$level}{'feature status'};
+ my ($feature, $status) = $dependency =~ /([^\s]*)\s+(Yes|No)/;
+
+ $dependency_problem = 1;
+
+ if (defined($privoxy_features{$feature})
+ and ($privoxy_features{$feature} eq $status))
+ {
+ $dependency_problem = 0;
}
}
@@ -563,7 +590,12 @@ sub register_dependency ($$) {
if ($dependency =~ /config line\s+(.*)/) {
- $dependencies{$level}{'config line'} = $1;
+ $dependencies{$level}{'config line'} = $1;
+
+ } elsif ($dependency =~ /feature status\s+(.*)/) {
+
+ $dependencies{$level}{'feature status'} = $1;
+
}
}
@@ -741,7 +773,13 @@ sub check_status_code_result ($$) {
my $expected_status_code = shift;
my $result = 0;
- if ($expected_status_code == $status_code) {
+ unless (defined $status_code) {
+
+ # XXX: should probably be caught earlier.
+ l(LL_VERBOSE_FAILURE,
+ "Ooops. We expected status code " . $expected_status_code . ", but didn't get any status code at all.");
+
+ } elsif ($expected_status_code == $status_code) {
$result = 1;
l(LL_VERBOSE_SUCCESS,
@@ -788,7 +826,6 @@ sub execute_server_header_regression_test ($) {
return check_header_result($test_ref, $header);
}
-
sub interpret_result ($) {
my $success = shift;
return $success ? "Success" : "Failure";
@@ -1097,7 +1134,6 @@ sub get_show_request_with_curl ($) {
return get_cgi_page_or_else($curl_parameters);
}
-
sub get_head_with_curl ($) {
our $fellatio_url = FELLATIO_URL;
@@ -1118,7 +1154,6 @@ sub get_head_with_curl ($) {
return get_page_with_curl($curl_parameters);
}
-
sub get_page_with_curl ($) {
our $proxy;
@@ -1188,7 +1223,6 @@ sub array_as_string ($) {
return $string;
}
-
sub show_test ($) {
my $test_ref = shift;
log_message('Test is:' . test_content_as_string($test_ref));
@@ -1347,6 +1381,7 @@ sub help () {
Options and their default values if they have any:
[--debug $cli_options{'debug'}]
+ [--forks $cli_options{'forks'}]
[--fuzzer-address]
[--fuzzer-feeding]
[--help]
@@ -1358,6 +1393,7 @@ Options and their default values if they have any:
[--min-level $cli_options{'min-level'}]
[--privoxy-address]
[--retries $cli_options{'retries'}]
+ [--test-number]
[--verbose]
[--version]
see "perldoc $0" for more information
@@ -1377,6 +1413,7 @@ sub init_cli_options () {
$cli_options{'loops'} = CLI_LOOPS;
$cli_options{'max-time'} = CLI_MAX_TIME;
$cli_options{'retries'} = CLI_RETRIES;
+ $cli_options{'forks'} = CLI_FORKS;
}
sub parse_cli_options () {
@@ -1388,6 +1425,7 @@ sub parse_cli_options () {
GetOptions (
'debug=s' => \$cli_options{'debug'},
+ 'forks=s' => \$cli_options{'forks'},
'help' => sub { help },
'header-fuzzing' => \$cli_options{'header-fuzzing'},
'min-level=s' => \$cli_options{'min-level'},
@@ -1442,6 +1480,20 @@ sub init_proxy_settings($) {
}
}
+sub start_forks($) {
+ my $forks = shift;
+
+ l(LL_ERROR, "Invalid --fork value: " . $forks . ".") if ($forks < 0);
+
+ foreach my $fork (1 .. $forks) {
+ log_message("Starting fork $fork");
+ my $pid = fork();
+ if (defined $pid && !$pid) {
+ return;
+ }
+ }
+}
+
sub main () {
init_our_variables();
@@ -1450,6 +1502,7 @@ sub main () {
init_proxy_settings('vanilla-proxy');
load_regressions_tests();
init_proxy_settings('fuzz-proxy');
+ start_forks(get_cli_option('forks')) if cli_option_is_set('forks');
execute_regression_tests();
}
@@ -1461,11 +1514,12 @@ B - A regression test "framework" for Privoxy.
=head1 SYNOPSIS
-B [B<--debug bitmask>] [B<--fuzzer-feeding>]
-[B<--fuzzer-feeding>] [B<--help>] [B<--level level>] [B<--loops count>]
-[B<--max-level max-level>] [B<--max-time max-time>]
+B [B<--debug bitmask>] [B<--forks> forks]
+[B<--fuzzer-feeding>] [B<--fuzzer-feeding>] [B<--help>] [B<--level level>]
+[B<--loops count>] [B<--max-level max-level>] [B<--max-time max-time>]
[B<--min-level min-level>] B<--privoxy-address proxy-address>
-[B<--retries retries>] [B<--verbose>] [B<--version>]
+[B<--retries retries>] [B<--test-number test-number>] [B<--verbose>]
+[B<--version>]
=head1 DESCRIPTION
@@ -1564,6 +1618,9 @@ requests to level 3 and client-header-action tests to level 1.
B<--debug bitmask> Add the bitmask provided as integer
to the debug settings.
+B<--forks forks> Number of forks to start before executing
+the regression tests. This is mainly useful for stress-testing.
+
B<--fuzzer-address> Listening address used when executing
the regression tests. Useful to make sure that the requests
to load the regression tests don't fail due to fuzzing.
@@ -1607,6 +1664,9 @@ syntax.
B<--retries retries> Retry B times.
+B<--test-number test-number> Only run the test with the specified
+number.
+
B<--verbose> Also log succesful test runs.
B<--version> Print version and exit.