blob: ad7a01de547564227cb72fe8246663a08fa01c64 [file] [log] [blame]
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
package TestCommon::SameInterp;
use Apache::Test;
use Apache::TestUtil;
use Exporter;
use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter);
@EXPORT = qw(same_interp_req same_interp_req_body
same_interp_skip_not_found);
sub same_interp_req {
my $res = eval {
Apache::TestRequest::same_interp_do(@_);
};
return undef if $@ && $@ =~ /unable to find interp/;
die $@ if $@;
return $res;
}
sub same_interp_req_body {
my $res = same_interp_req(@_);
return $res ? $res->content : "";
}
sub same_interp_skip_not_found {
my $skip_cond = shift;
if ($skip_cond) {
skip "Skip couldn't find the same interpreter", 0;
}
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;
__END__
=head1 NAME
TestCommon::SameInterp - Helper functions for same_interp framework
=head1 Synopsis
use Apache::Test;
use Apache::TestUtil;
use Apache::TestRequest;
use TestCommon::SameInterp;
plan tests => 3;
my $url = "/path";
my $same_interp = Apache::TestRequest::same_interp_tie($url);
ok $same_interp;
my $expected = 1;
my $skip = 0;
# test GET over the same same_interp
for (1..2) {
$expected++;
my $res = same_interp_req($same_interp, \&GET, $url, foo => 'bar');
$skip++ unless defined $res;
same_interp_skip_not_found(
$skip,
defined $res && $res->content,
$expected,
"GET over the same interp"
);
}
=head1 Description
In addition to same_interp base blocks from Apache::TestRequest, this
helper module provides extra wrappers to simplify the writing of tests
META: consider merging those into Apache::TestRequest (or add a new
module, e.g. Apache::TestRequestSameInterp)
=head1 API
=head2 C<same_interp_req>
normally one runs:
my $res = GET $url, @data;
in the same_interp framework one runs
my $res = Apache::TestRequest::same_interp_do($same_interp,
\&GET, $url, @data);
but if there is a failure to find the same interpreter we get an
exception. and there could be other exceptions as well (e.g. failure
to run the request). This wrapper handles all exceptions, returning
C<undef> if the exception was in a failure to find the same
interpreter, re-throws the exception otherwise. If there is no
exception, the response object is returned.
So one passes the same arguments to this wrapper as you'd to
Apache::TestRequest::same_interp_do:
my $res = same_interp_req($same_interp, \&GET, $url, @data);
=head2 C<same_interp_req_body>
This function calls C<L<same_interp_req|/C_same_interp_req_>> and
extracts the response body if the response object is defined. (sort of
GET_BODY for same_interp)
=head2 C<same_interp_skip_not_found>
make the tests resistant to a failure of finding the same perl
interpreter, which happens randomly and not an error. so instead of running:
my $res = same_interp_req($same_interp, \&GET, $url, @data);
ok t_cmp(defined $res && $res->content, $expected, "comment")
one can run:
my $res = same_interp_req($same_interp, \&GET, $url, @data);
$skip = defined $res ? 0 : 1;
same_interp_skip_not_found(
$skip,
defined $res && $res->content,
$expected,
"comment"
);
the first argument is used to decide whether to skip the sub-test, the
rest of the arguments are passed to 'ok t_cmp'.
This wrapper is smart enough to report the correct line number as if
ok() was run in the test file itself and not in the wrapper, by doing:
my ($package, $filename, $line) = caller;
return eval <<EOE;
#line $line $filename
ok &t_cmp;
EOE
C<&t_cmp> receives C<@_>, containing all but the skip argument, as if
the wrapper was never called.
=cut