perl-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <s...@stason.org>
Subject [mp2] an interesting case of breakage with eval and filters
Date Sat, 05 Jun 2004 00:45:17 GMT
Here is the test case:
#--------------------------------
package TestFilter::out_str_eval;

use strict;
use warnings FATAL => 'all';

use Apache::RequestRec ();
use Apache::RequestIO ();
use Apache::Filter ();

use Apache::Test;
use Apache::TestUtil;

use Apache::Const -compile => qw(OK DECLINED);

# dummy pass_through filter was good enough to trigger the problem
sub handler {
     return Apache::DECLINED;
}

sub response {
     my $r = shift;

     plan $r, tests => 1;
     eval { i_do_not_exist_really_i_do_not() };
     ok t_cmp(qr/Undefined subroutine/, $@, "some croak");

     return Apache::OK;
}

1;
#--------------------------------
PerlModule TestFilter::out_str_eval
<Location /TestFilter__out_str_eval>
     SetHandler modperl
     PerlResponseHandler TestFilter::out_str_eval::response
     PerlOutputFilterHandler TestFilter::out_str_eval
</Location>

#--------------------------------

This part worked just fine:

   eval { i_do_not_exist_really_i_do_not() };
       ok t_cmp(qr/Undefined subroutine/, $@, "some croak");

but:

   ok t_cmp(qr/Undefined subroutine/, $@, "some croak");

didn't. What happens is that t_cmp, prints some debug headers. Since we have 
an output filter, we get a new handler invoked, which resets $@. By the time 
t_cmp gets to use $@ it's already not the one it had at the beginning. And all 
the related tests fail.

For now the solution I found is to adjust t_cmp, not to try to print anything 
before it has done the comparison and created the strings it wants to print as 
a debug:

Index: lib/Apache/TestUtil.pm
===================================================================
RCS file: /home/cvs/httpd-test/perl-framework/Apache-Test/lib/Apache/TestUtil.pm,v
retrieving revision 1.39
diff -u -r1.39 TestUtil.pm
--- lib/Apache/TestUtil.pm      2 Jun 2004 02:13:23 -0000       1.39
+++ lib/Apache/TestUtil.pm      5 Jun 2004 00:42:08 -0000
@@ -100,10 +100,14 @@
          ' usage: $res = t_cmp($expected, $received, [$comment])')
              if @_ < 2 || @_ > 3;

-    t_debug("testing : " . pop) if @_ == 3;
-    t_debug("expected: " . struct_as_string(0, $_[0]));
-    t_debug("received: " . struct_as_string(0, $_[1]));
-    return t_is_equal($_[0], $_[1]);
+    my $result = t_is_equal($_[0], $_[1]);
+
+    my @debug = ();
+    push @debug, t_debug_no_print("testing : " . pop) if @_ == 3;
+    push @debug, t_debug_no_print("expected: " . struct_as_string(0, $_[0]));
+    push @debug, t_debug_no_print("received: " . struct_as_string(0, $_[1]));
+    print @debug;
+    return $result;
  }

  # Essentially t_cmp, but on Win32, first converts pathnames
@@ -123,7 +127,11 @@
      sub { @_ };

  sub t_debug {
-    print map {"# $_\n"} map {split /\n/} grep {defined} expand(@_);
+    print t_debug_no_print(@_);
+}
+
+sub t_debug_no_print {
+    map {"# $_\n"} map {split /\n/} grep {defined} expand(@_);
  }

  sub t_open_file {

This is something that we need to at least document, it took me some time to 
figure it out. I doubt we can and should fix it to restore $@ after the filter 
handler returns. Comments?


-- 
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org


Mime
View raw message