X-Git-Url: http://www.privoxy.org/gitweb/%40proxy-info-url%40?a=blobdiff_plain;f=tools%2Fprivoxy-regression-test.pl;h=ea9d78ca29ae606de3545735a0a92e76de7afeb1;hb=a1656f702b2ed3a07ca3c189a895a393611791bc;hp=f5c010a12ed55e5f24d9b1065ecf3baad8323cb2;hpb=ef38825f4c7de83bcb0f1730dbd5dd95366dc874;p=privoxy.git diff --git a/tools/privoxy-regression-test.pl b/tools/privoxy-regression-test.pl index f5c010a1..ea9d78ca 100755 --- a/tools/privoxy-regression-test.pl +++ b/tools/privoxy-regression-test.pl @@ -7,15 +7,12 @@ # A regression test "framework" for Privoxy. For documentation see: # perldoc privoxy-regression-test.pl # -# $Id: privoxy-regression-test.pl,v 1.136 2008/03/26 12:38:36 fk Exp $ +# $Id: privoxy-regression-test.pl,v 1.154 2008/06/21 16:44:09 fk Exp $ # # Wish list: # # - Update documentation # - Validate HTTP times. -# - Understand default.action.master comment syntax -# and verify that we actually block and unblock what -# the comments claim we do. # - Implement a HTTP_VERSION directive or allow to # specify whole request lines. # - Support filter regression tests. @@ -57,7 +54,7 @@ use constant { CLI_MAX_LEVEL => 25, 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, @@ -237,61 +234,46 @@ sub tokenize ($) { sub enlist_new_test ($$$$$$) { my ($regression_tests, $token, $value, $si, $ri, $number) = @_; + my $type; if ($token eq 'set header') { l(LL_FILE_LOADING, "Header to set: " . $value); - $$regression_tests[$si][$ri]{'type'} = CLIENT_HEADER_TEST; - # Implicit default - $$regression_tests[$si][$ri]{'level'} = CLIENT_HEADER_TEST; + $type = CLIENT_HEADER_TEST; } elsif ($token eq 'request header') { l(LL_FILE_LOADING, "Header to request: " . $value); - $$regression_tests[$si][$ri]{'type'} = SERVER_HEADER_TEST; - # Implicit default + $type = SERVER_HEADER_TEST; $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - $$regression_tests[$si][$ri]{'level'} = SERVER_HEADER_TEST; } elsif ($token eq 'trusted cgi request') { l(LL_FILE_LOADING, "CGI URL to test in a dumb way: " . $value); - $$regression_tests[$si][$ri]{'type'} = TRUSTED_CGI_REQUEST; - # Implicit default + $type = TRUSTED_CGI_REQUEST; $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - $$regression_tests[$si][$ri]{'level'} = TRUSTED_CGI_REQUEST; } elsif ($token eq 'fetch test') { l(LL_FILE_LOADING, "URL to test in a dumb way: " . $value); - $$regression_tests[$si][$ri]{'type'} = DUMB_FETCH_TEST; - # Implicit default + $type = DUMB_FETCH_TEST; $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - $$regression_tests[$si][$ri]{'level'} = DUMB_FETCH_TEST; } elsif ($token eq 'method test') { l(LL_FILE_LOADING, "Method to test: " . $value); - $$regression_tests[$si][$ri]{'type'} = METHOD_TEST; - # Implicit default + $type = METHOD_TEST; $$regression_tests[$si][$ri]{'expected-status-code'} = 200; - $$regression_tests[$si][$ri]{'level'} = METHOD_TEST; } elsif ($token eq 'blocked url') { l(LL_FILE_LOADING, "URL to block-test: " . $value); - $$regression_tests[$si][$ri]{'type'} = BLOCK_TEST; - # Implicit default - $$regression_tests[$si][$ri]{'expected-status-code'} = 403; - $$regression_tests[$si][$ri]{'level'} = BLOCK_TEST; + $type = BLOCK_TEST; } elsif ($token eq 'url') { l(LL_FILE_LOADING, "Sticky URL to test: " . $value); - $$regression_tests[$si][$ri]{'type'} = STICKY_ACTIONS_TEST; - # Implicit default - $$regression_tests[$si][$ri]{'level'} = STICKY_ACTIONS_TEST; - $$regression_tests[$si][$ri]{'url'} = ''; + $type = STICKY_ACTIONS_TEST; } else { @@ -299,6 +281,9 @@ sub enlist_new_test ($$$$$$) { } + $$regression_tests[$si][$ri]{'type'} = $type; + $$regression_tests[$si][$ri]{'level'} = $type; + check_for_forbidden_characters($value); $$regression_tests[$si][$ri]{'data'} = $value; @@ -338,7 +323,7 @@ sub load_action_files ($) { my $no_checks = 0; chomp; - + if (/

Contents of Actions File (.*?)@@g; s@\s*$@@g; + # Decode characters we care about. + s@"@"@g; + $filtered_request .= "\n" . $_; if (/^$header_to_get/) { @@ -953,6 +950,10 @@ sub get_server_header ($$) { my $header; my $header_to_get; + # XXX: Should be caught before starting to test. + l(LL_ERROR, "No expect header for test " . $test{'number'}) + unless defined $expect_header; + if ($expect_header eq 'REMOVAL' or $expect_header eq 'NO CHANGE' or $expect_header eq 'SOME CHANGE') { @@ -1024,6 +1025,20 @@ sub test_content_as_string ($) { return $s; } +sub fuzz_header($) { + my $header = shift; + my $white_space = int(rand(2)) - 1 ? " " : "\t"; + + $white_space = $white_space x (1 + int(rand(5))); + + # Only fuzz white space before the first quoted token. + # (Privoxy doesn't touch white space inside quoted tokens + # and modifying it would cause the tests to fail). + $header =~ s@(^[^"]*?)\s@$1$white_space@g; + + return $header; +} + ############################################################################ # # HTTP fetch functions @@ -1062,6 +1077,7 @@ sub get_cgi_page_or_else ($) { return $content_ref; } +# XXX: misleading name sub get_show_request_with_curl ($) { our $privoxy_cgi_url; @@ -1069,11 +1085,16 @@ sub get_show_request_with_curl ($) { my %test = %{$test_ref}; my $curl_parameters = ' '; + my $header = $test{'data'}; + + if (cli_option_is_set('header-fuzzing')) { + $header = fuzz_header($header); + } # Enable the action to test $curl_parameters .= '-H \'X-Privoxy-Control: ' . $test{'tag'} . '\' '; # The header to filter - $curl_parameters .= '-H \'' . $test{'data'} . '\' '; + $curl_parameters .= '-H \'' . $header . '\' '; $curl_parameters .= ' '; $curl_parameters .= $privoxy_cgi_url; @@ -1106,15 +1127,15 @@ sub get_head_with_curl ($) { sub get_page_with_curl ($) { + our $proxy; + my $parameters = shift; my @buffer; my $curl_line = CURL; my $retries_left = get_cli_option('retries') + 1; my $failure_reason; - if (cli_option_is_set('privoxy-address')) { - $curl_line .= ' --proxy ' . get_cli_option('privoxy-address'); - } + $curl_line .= ' --proxy ' . $proxy if (defined $proxy); # We want to see the HTTP status code $curl_line .= " --include "; @@ -1310,7 +1331,7 @@ sub log_result ($$) { } } - log_message($message) unless ($result && cli_option_is_set('silent')); + log_message($message) if (!$result or cli_option_is_set('verbose')); } sub quote ($) { @@ -1332,8 +1353,10 @@ sub help () { Options and their default values if they have any: [--debug $cli_options{'debug'}] + [--fuzzer-address] [--fuzzer-feeding] [--help] + [--header-fuzzing] [--level] [--loops $cli_options{'loops'}] [--max-level $cli_options{'max-level'}] @@ -1341,7 +1364,7 @@ Options and their default values if they have any: [--min-level $cli_options{'min-level'}] [--privoxy-address] [--retries $cli_options{'retries'}] - [--silent] + [--verbose] [--version] see "perldoc $0" for more information EOF @@ -1372,16 +1395,18 @@ sub parse_cli_options () { GetOptions ( 'debug=s' => \$cli_options{'debug'}, 'help' => sub { help }, - 'silent' => \$cli_options{'silent'}, + 'header-fuzzing' => \$cli_options{'header-fuzzing'}, 'min-level=s' => \$cli_options{'min-level'}, 'max-level=s' => \$cli_options{'max-level'}, 'privoxy-address=s' => \$cli_options{'privoxy-address'}, + 'fuzzer-address=s' => \$cli_options{'fuzzer-address'}, 'level=s' => \$cli_options{'level'}, 'loops=s' => \$cli_options{'loops'}, 'test-number=s' => \$cli_options{'test-number'}, 'fuzzer-feeding' => \$cli_options{'fuzzer-feeding'}, 'retries=s' => \$cli_options{'retries'}, 'max-time=s' => \$cli_options{'max-time'}, + 'verbose' => \$cli_options{'verbose'}, 'version' => sub { print_version && exit(0) } ); $log_level |= $cli_options{'debug'}; @@ -1405,12 +1430,32 @@ sub get_cli_option ($) { return $cli_options{$cli_option}; } +sub init_proxy_settings($) { + + my $choice = shift; + our $proxy = undef; + + if (($choice eq 'fuzz-proxy') and cli_option_is_set('fuzzer-address')) { + $proxy = get_cli_option('fuzzer-address'); + } + + if ((not defined $proxy) or ($choice eq 'vanilla-proxy')) { + + if (cli_option_is_set('privoxy-address')) { + $proxy .= get_cli_option('privoxy-address'); + } + + } +} + sub main () { init_our_variables(); parse_cli_options(); check_for_curl(); + init_proxy_settings('vanilla-proxy'); load_regressions_tests(); + init_proxy_settings('fuzz-proxy'); execute_regression_tests(); } @@ -1422,10 +1467,11 @@ B - A regression test "framework" for Privoxy. =head1 SYNOPSIS -B [B<--debug bitmask>] [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<--silent>] [B<--version>] +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<--min-level min-level>] B<--privoxy-address proxy-address> +[B<--retries retries>] [B<--verbose>] [B<--version>] =head1 DESCRIPTION @@ -1524,6 +1570,10 @@ 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<--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. + B<--fuzzer-feeding> Ignore some errors that would otherwise cause Privoxy-Regression-Test to abort the test because they shouldn't happen in normal operation. This option is @@ -1534,6 +1584,9 @@ message. B<--help> Shows available command line options. +B<--header-fuzzing> Modifies linear white space in +headers in a way that should not affect the test result. + B<--level level> Only execute tests with the specified B. B<--loop count> Loop through the regression tests B times. @@ -1560,7 +1613,7 @@ syntax. B<--retries retries> Retry B times. -B<--silent> Don't log succesful test runs. +B<--verbose> Also log succesful test runs. B<--version> Print version and exit.