stas 2003/08/21 17:41:32
Modified: ModPerl-Registry/t closure.t perlrun_require.t special_blocks.t t/modperl sameinterp.t Log: protect all tests using the same_interpreter setup from failures when the same interpreter is not found. Revision Changes Path 1.9 +28 -21 modperl-2.0/ModPerl-Registry/t/closure.t Index: closure.t =================================================================== RCS file: /home/cvs/modperl-2.0/ModPerl-Registry/t/closure.t,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- closure.t 8 Aug 2003 20:07:14 -0000 1.8 +++ closure.t 22 Aug 2003 00:41:32 -0000 1.9 @@ -35,10 +35,10 @@ my $same_interp = Apache::TestRequest::same_interp_tie($url); # should be no closure effect, always returns 1 - my $first = req($same_interp, $url); - my $second = req($same_interp, $url); + my $first = get_body($same_interp, $url); + my $second = get_body($same_interp, $url); skip_not_same_intrep( - scalar(grep defined, $first, $second), + (scalar(grep defined, $first, $second) != 2), 0, $first && $second && ($second - $first), "never the closure problem", @@ -48,9 +48,9 @@ sleep_and_touch_file($path); # it doesn't matter, since the script is not cached anyway - my $third = req($same_interp, $url); + my $third = get_body($same_interp, $url); skip_not_same_intrep( - scalar(grep defined, $first, $second, $third), + (scalar(grep defined, $first, $second, $third) != 3), 1, $third, "never the closure problem", @@ -67,10 +67,10 @@ # we don't know what other test has called this uri before, so we # check the difference between two subsequent calls. In this case # the difference should be 1. - my $first = req($same_interp, $url); - my $second = req($same_interp, $url); + my $first = get_body($same_interp, $url); + my $second = get_body($same_interp, $url); skip_not_same_intrep( - scalar(grep defined, $first, $second), + (scalar(grep defined, $first, $second) != 2), 1, $first && $second && ($second - $first), "the closure problem should exist", @@ -80,9 +80,9 @@ sleep_and_touch_file($path); # should not notice closure effect on the first request - my $third = req($same_interp, $url); + my $third = get_body($same_interp, $url); skip_not_same_intrep( - scalar(grep defined, $first, $second, $third), + (scalar(grep defined, $first, $second, $third) != 3), 1, $third, "no closure on the first request", @@ -99,10 +99,10 @@ # we don't know what other test has called this uri before, so we # check the difference between two subsequent calls. In this case # the difference should be 1. - my $first = req($same_interp, $url); - my $second = req($same_interp, $url); + my $first = get_body($same_interp, $url); + my $second = get_body($same_interp, $url); skip_not_same_intrep( - scalar(grep defined, $first, $second), + (scalar(grep defined, $first, $second) != 2), 1, $first && $second && ($second - $first), "the closure problem should exist", @@ -112,9 +112,9 @@ sleep_and_touch_file($path); # modification shouldn't be noticed - my $third = req($same_interp, $url); + my $third = get_body($same_interp, $url); skip_not_same_intrep( - scalar(grep defined, $first, $second, $third), + (scalar(grep defined, $first, $second, $third) != 3), 1, $first && $second && $third - $second, "no reload on modification, the closure problem persists", @@ -134,26 +134,33 @@ # if we fail to find the same interpreter, return undef (this is not # an error) -sub req { +sub get_body { my($same_interp, $url) = @_; my $res = eval { Apache::TestRequest::same_interp_do($same_interp, \&GET, $url); }; - return undef if $@; + return undef if $@ =~ /unable to find interp/; return $res->content if $res; - die "failed to fetch $url"; + die $@ if $@; } + # make the tests resistant to a failure of finding the same perl # interpreter, which happens randomly and not an error. # the first argument is used to decide whether to skip the sub-test, # the rest of the arguments are passed to 'ok t_cmp'; sub skip_not_same_intrep { - my $do_not_skip_cond = shift; - unless ($do_not_skip_cond) { + my $skip_cond = shift; + if ($skip_cond) { skip "Skip couldn't find the same interpreter"; } else { - ok t_cmp(@_); + my($package, $filename, $line) = caller; + # trick ok() into reporting the caller filename/line when a + # sub-test fails in sok() + return eval <<EOE; +#line $line $filename + ok &t_cmp; +EOE } } 1.2 +34 -7 modperl-2.0/ModPerl-Registry/t/perlrun_require.t Index: perlrun_require.t =================================================================== RCS file: /home/cvs/modperl-2.0/ModPerl-Registry/t/perlrun_require.t,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- perlrun_require.t 6 Jan 2003 10:42:38 -0000 1.1 +++ perlrun_require.t 22 Aug 2003 00:41:32 -0000 1.2 @@ -14,16 +14,43 @@ for (1..2) { # should not fail on the second request - ok t_cmp( + my $res = get_body($same_interp, $url); + skip_not_same_intrep( + !defined($res), "1", - req($same_interp, $url), + $res, "PerlRun requiering and external lib with subs", - ); + ); } -sub req { +# if we fail to find the same interpreter, return undef (this is not +# an error) +sub get_body { my($same_interp, $url) = @_; - my $res = Apache::TestRequest::same_interp_do($same_interp, - \&GET, $url); - return $res ? $res->content : undef; + my $res = eval { + Apache::TestRequest::same_interp_do($same_interp, \&GET, $url); + }; + return undef if $@ =~ /unable to find interp/; + return $res->content if $res; + die $@ if $@; +} + +# make the tests resistant to a failure of finding the same perl +# interpreter, which happens randomly and not an error. +# the first argument is used to decide whether to skip the sub-test, +# the rest of the arguments are passed to 'ok t_cmp'; +sub skip_not_same_intrep { + my $skip_cond = shift; + if ($skip_cond) { + skip "Skip couldn't find the same interpreter"; + } + else { + my($package, $filename, $line) = caller; + # trick ok() into reporting the caller filename/line when a + # sub-test fails in sok() + return eval <<EOE; +#line $line $filename + ok &t_cmp; +EOE + } } 1.6 +114 -52 modperl-2.0/ModPerl-Registry/t/special_blocks.t Index: special_blocks.t =================================================================== RCS file: /home/cvs/modperl-2.0/ModPerl-Registry/t/special_blocks.t,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- special_blocks.t 6 Jun 2003 01:30:41 -0000 1.5 +++ special_blocks.t 22 Aug 2003 00:41:32 -0000 1.6 @@ -24,29 +24,45 @@ my $url = "/same_interp/$alias/special_blocks.pl"; my $same_interp = Apache::TestRequest::same_interp_tie($url); - ok t_cmp( - "begin ok", - req($same_interp, "$url?begin"), - "$modules{$alias} is running BEGIN blocks on the first req", - ); - - ok t_cmp( - "begin ok", - req($same_interp, "$url?begin"), - "$modules{$alias} is running BEGIN blocks on the second req", - ); - - ok t_cmp( - "end ok", - req($same_interp, "$url?end"), - "$modules{$alias} is running END blocks on the first req", - ); - - ok t_cmp( - "end ok", - req($same_interp, "$url?end"), - "$modules{$alias} is running END blocks on the second req", - ); + # if one sub-test has failed to run on the same interpreter, skip + # the rest in the same group + my $skip = 0; + + my $res = get_body($same_interp, "$url?begin"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "begin ok", + $res, + "$modules{$alias} is running BEGIN blocks on the first request", + ); + + $res = $skip ? undef : get_body($same_interp, "$url?begin"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "begin ok", + $res, + "$modules{$alias} is running BEGIN blocks on the second request", + ); + + $res = $skip ? undef : get_body($same_interp, "$url?end"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "end ok", + $res, + "$modules{$alias} is running END blocks on the third request", + ); + + $res = $skip ? undef : get_body($same_interp, "$url?end"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "end ok", + $res, + "$modules{$alias} is running END blocks on the fourth request", + ); } # To properly test BEGIN/END blocks in registry implmentations @@ -58,41 +74,87 @@ my $url = "/same_interp/$alias/special_blocks.pl"; my $same_interp = Apache::TestRequest::same_interp_tie($url); + # if one sub-test has failed to run on the same interpreter, skip + # the rest in the same group + my $skip = 0; + # clear the cache of the registry package for the script in $url - req($same_interp, "$url?uncache"); + my $res = get_body($same_interp, "$url?uncache"); + $skip++ unless defined $res; - ok t_cmp( - "begin ok", - req($same_interp, "$url?begin"), - "$modules{$alias} is running BEGIN blocks on the first req", - ); - - ok t_cmp( - "", - req($same_interp, "$url?begin"), - "$modules{$alias} is not running BEGIN blocks on the second req", - ); + $res = $skip ? undef : get_body($same_interp, "$url?begin"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "begin ok", + $res, + "$modules{$alias} is running BEGIN blocks on the first request", + ); + + $res = $skip ? undef : get_body($same_interp, "$url?begin"); + $skip++ unless defined $res; + t_debug($res); + skip_not_same_intrep( + $skip, + "", + $res, + "$modules{$alias} is not running BEGIN blocks on the second request", + ); - # clear the cache of the registry package for the script in $url - req($same_interp, "$url?uncache"); + $same_interp = Apache::TestRequest::same_interp_tie($url); + $skip = 0; - ok t_cmp( - "end ok", - req($same_interp, "$url?end"), - "$modules{$alias} is running END blocks on the first req", - ); - - ok t_cmp( - "end ok", - req($same_interp, "$url?end"), - "$modules{$alias} is running END blocks on the second req", - ); + # clear the cache of the registry package for the script in $url + $res = get_body($same_interp, "$url?uncache"); + $skip++ unless defined $res; + $res = $skip ? undef : get_body($same_interp, "$url?end"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "end ok", + $res, + "$modules{$alias} is running END blocks on the first request", + ); + + $res = $skip ? undef : get_body($same_interp, "$url?end"); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, + "end ok", + $res, + "$modules{$alias} is running END blocks on the second request", + ); } -sub req { +# if we fail to find the same interpreter, return undef (this is not +# an error) +sub get_body { my($same_interp, $url) = @_; - my $res = Apache::TestRequest::same_interp_do($same_interp, - \&GET, $url); - return $res->is_success ? $res->content : undef; + my $res = eval { + Apache::TestRequest::same_interp_do($same_interp, \&GET, $url); + }; + return undef if $@ && $@ =~ /unable to find interp/; + die $@ if $@; + return $res->content if defined $res; +} + +# make the tests resistant to a failure of finding the same perl +# interpreter, which happens randomly and not an error. +# the first argument is used to decide whether to skip the sub-test, +# the rest of the arguments are passed to 'ok t_cmp'; +sub skip_not_same_intrep { + my $skip_cond = shift; + if ($skip_cond) { + skip "Skip couldn't find the same interpreter"; + } + else { + my($package, $filename, $line) = caller; + # trick ok() into reporting the caller filename/line when a + # sub-test fails in sok() + return eval <<EOE; +#line $line $filename + ok &t_cmp; +EOE + } } 1.4 +53 -13 modperl-2.0/t/modperl/sameinterp.t Index: sameinterp.t =================================================================== RCS file: /home/cvs/modperl-2.0/t/modperl/sameinterp.t,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- sameinterp.t 18 Apr 2003 06:18:58 -0000 1.3 +++ sameinterp.t 22 Aug 2003 00:41:32 -0000 1.4 @@ -18,15 +18,18 @@ ok $same_interp; my $value = 1; + my $skip = 0; # test GET over the same same_interp for (1..2) { $value++; - my $res = Apache::TestRequest::same_interp_do($same_interp, \&GET, - $url, foo => 'bar'); - ok t_cmp( + my $res = req($same_interp, \&GET, $url, foo => 'bar'); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, $value, defined $res && $res->content, - "GET over the same interp"); + "GET over the same interp" + ); } } @@ -36,16 +39,18 @@ ok $same_interp; my $value = 1; + my $skip = 0; for (1..2) { $value++; my $content = join ' ', 'ok', $_ + 3; - my $res = Apache::TestRequest::same_interp_do($same_interp, \&POST, - $url, - content => $content); - ok t_cmp( + my $res = req($same_interp, \&POST, $url, content => $content); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, $value, defined $res && $res->content, - "POST over the same interp"); + "POST over the same interp" + ); } } @@ -55,13 +60,48 @@ ok $same_interp; my $value = 1; + my $skip = 0; for (1..2) { $value++; - my $res = Apache::TestRequest::same_interp_do($same_interp, \&HEAD, - $url); - ok t_cmp( + my $res = req($same_interp, \&HEAD, $url); + $skip++ unless defined $res; + skip_not_same_intrep( + $skip, $same_interp, defined $res && $res->header(Apache::TestRequest::INTERP_KEY), - "HEAD over the same interp"); + "HEAD over the same interp" + ); + } +} + +# if we fail to find the same interpreter, return undef (this is not +# an error) +sub req { + my($same_interp, $url) = @_; + my $res = eval { + Apache::TestRequest::same_interp_do(@_); + }; + return undef if $@ && $@ =~ /unable to find interp/; + die $@ if $@; + return $res; +} + +# make the tests resistant to a failure of finding the same perl +# interpreter, which happens randomly and not an error. +# the first argument is used to decide whether to skip the sub-test, +# the rest of the arguments are passed to 'ok t_cmp'; +sub skip_not_same_intrep { + my $skip_cond = shift; + if ($skip_cond) { + skip "Skip couldn't find the same interpreter"; + } + else { + my($package, $filename, $line) = caller; + # trick ok() into reporting the caller filename/line when a + # sub-test fails in sok() + return eval <<EOE; +#line $line $filename + ok &t_cmp; +EOE } }