stas 2004/05/03 23:19:59
Modified: t/error runtime.t t/response/TestError runtime.pm Log: new tests for exception objects Revision Changes Path 1.3 +27 -8 modperl-2.0/t/error/runtime.t Index: runtime.t =================================================================== RCS file: /home/cvs/modperl-2.0/t/error/runtime.t,v retrieving revision 1.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- runtime.t 18 Apr 2003 06:18:56 -0000 1.2 +++ runtime.t 4 May 2004 06:19:59 -0000 1.3 @@ -5,13 +5,32 @@ use Apache::TestUtil; use Apache::TestRequest; -plan tests => 1; - my $location = "/TestError__runtime"; -my $res = GET($location); -#t_debug($res->content); -ok t_cmp( - 500, - $res->code, - "500 error on runtime error", + +my @untrapped = qw(plain_mp_error plain_non_mp_error + die_hook_confess_mp_error die_hook_confess_non_mp_error + die_hook_custom_mp_error die_hook_custom_non_mp_error); +my @trapped = qw(eval_block_mp_error eval_block_non_mp_error + eval_string_mp_error eval_block_non_error); + +plan tests => @untrapped + @trapped; + +for my $type (@untrapped) { + my $res = GET("$location?$type"); + #t_debug($res->content); + ok t_cmp( + 500, + $res->code, + "500 error on $type exception", ); +} + +for my $type (@trapped) { + my $body = GET_BODY("$location?$type"); + ok t_cmp( + "ok $type", + $body, + "200 on $type exception", + ); +} + 1.3 +104 -3 modperl-2.0/t/response/TestError/runtime.pm Index: runtime.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestError/runtime.pm,v retrieving revision 1.2 retrieving revision 1.3 diff -u -u -r1.2 -r1.3 --- runtime.pm 1 Apr 2003 04:39:30 -0000 1.2 +++ runtime.pm 4 May 2004 06:19:59 -0000 1.3 @@ -5,22 +5,123 @@ use Apache::RequestRec (); use Apache::RequestIO (); +use Apache::Connection (); +use APR::Socket (); use Apache::TestUtil; use Apache::Const -compile => qw(OK); +use APR::Const -compile => qw(TIMEUP); + +use constant SIZE => 2048; sub handler { my $r = shift; + my $socket = $r->connection->client_socket; + my $args = $r->args; $r->content_type('text/plain'); - t_server_log_error_is_expected(); - no_such_func(); + # set timeout to 1 usec (microsec!) which makes sure that any + # socket read call will fail + $socket->timeout_set(1); - $r->print('ok'); + no strict 'refs'; + $args->($r, $socket); return Apache::OK; +} + +sub plain_mp_error { + my($r, $socket) = @_; + t_server_log_error_is_expected(); + mp_error($socket); +} + +sub plain_non_mp_error { + my($r, $socket) = @_; + t_server_log_error_is_expected(); + non_mp_error($socket); +} + +sub die_hook_confess_mp_error { + my($r, $socket) = @_; + local $SIG{__DIE__} = \&APR::Error::confess; + t_server_log_error_is_expected(); + mp_error($socket); +} + +sub die_hook_confess_non_mp_error { + my($r, $socket) = @_; + local $SIG{__DIE__} = \&APR::Error::confess; + t_server_log_error_is_expected(); + non_mp_error($socket); +} + +sub die_hook_custom_mp_error { + my($r, $socket) = @_; + local $SIG{__DIE__} = sub { die "custom die hook: $_[0]" }; + t_server_log_error_is_expected(); + mp_error($socket); +} + +sub die_hook_custom_non_mp_error { + my($r, $socket) = @_; + local $SIG{__DIE__} = sub { die "custom die hook: $_[0]" }; + t_server_log_error_is_expected(); + non_mp_error($socket); +} + +sub eval_block_mp_error { + my($r, $socket) = @_; + eval { mp_error($socket) }; + if ($@ && ref($@) && $@ == APR::TIMEUP) { + $r->print("ok eval_block_mp_error"); + } + else { + die "eval block has failed: $@"; + } +} + +sub eval_string_mp_error { + my($r, $socket) = @_; + eval "\$socket->recv(SIZE)"; + if ($@ && ref($@) && $@ == APR::TIMEUP) { + $r->print("ok eval_string_mp_error"); + } + else { + die "eval string has failed: $@"; + } +} + +sub eval_block_non_mp_error { + my($r, $socket) = @_; + eval { non_mp_error($socket) }; + if ($@ && !ref($@)) { + $r->print("ok eval_block_non_mp_error"); + } + else { + die "eval eval_non_mp_error has failed: $@"; + } +} + +sub eval_block_non_error { + my($r, $socket) = @_; + eval { 1; }; + if ($@) { + die "eval eval_block_non_mp_error has failed"; + } + $r->print("ok eval_block_non_error"); +} + +sub non_mp_error { + no_such_func(); +} + +# fails because of the timeout set earlier in the handler +sub mp_error { + my $socket = shift; + $socket->recv(SIZE); } 1;