X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Fdebug.t;h=e023fff9894c41dbfbae6a51487b32b5d25697a0;hb=8494142cea239b72298004f762cf500f71650533;hp=d16e1292e66ce9d37812e71e10f2511d3b0eb3ad;hpb=a5a7bb733a940db710b7408508374833683a2e79;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/debug.t b/t/storage/debug.t index d16e129..e023fff 100644 --- a/t/storage/debug.t +++ b/t/storage/debug.t @@ -4,6 +4,8 @@ no warnings 'once'; use Test::More; use Test::Exception; +use Try::Tiny; +use File::Spec; use lib qw(t/lib); use DBICTest; use Path::Class qw/file/; @@ -53,12 +55,45 @@ END { } open(STDERRCOPY, '>&STDERR'); -close(STDERR); -dies_ok { - $schema->resultset('CD')->search({})->count; -} 'Died on closed FH'; -open(STDERR, '>&STDERRCOPY'); +my $exception_line_number; +# STDERR will be closed, no T::B diag in blocks +my $exception = try { + close(STDERR); + $exception_line_number = __LINE__ + 1; # important for test, do not reformat + $schema->resultset('CD')->search({})->count; +} catch { + $_ +} finally { + # restore STDERR + open(STDERR, '>&STDERRCOPY'); +}; + +like $exception, qr/ + \QDuplication of STDERR for debug output failed (perhaps your STDERR is closed?)\E + .+ + \Qat @{[__FILE__]} line $exception_line_number\E$ +/xms; + +my @warnings; +$exception = try { + local $SIG{__WARN__} = sub { push @warnings, @_ if $_[0] =~ /character/i }; + close STDERR; + open(STDERR, '>', File::Spec->devnull) or die $!; + $schema->resultset('CD')->search({ title => "\x{1f4a9}" })->count; + ''; +} catch { + $_; +} finally { + # restore STDERR + close STDERR; + open(STDERR, '>&STDERRCOPY'); +}; + +die "How did that fail... $exception" + if $exception; + +is_deeply(\@warnings, [], 'No warnings with unicode on STDERR'); # test debugcb and debugobj protocol { @@ -101,4 +136,40 @@ open(STDERR, '>&STDERRCOPY'); is_deeply ( $do->{_traced_bind}, \@bind_trace ); } +# recreate test as seen in DBIx::Class::QueryLog +# the rationale is that if someone uses a non-IO::Handle object +# on CPAN, many are *bound* to use one on darkpan. Thus this +# test to ensure there is no future silent breakage +{ + my $output = ""; + + { + package DBICTest::_Printable; + + sub print { + my ($self, @args) = @_; + $output .= join('', @args); + } + } + + $schema->storage->debugobj(undef); + $schema->storage->debug(1); + $schema->storage->debugfh( bless {}, "DBICTest::_Printable" ); + $schema->storage->txn_do( sub { $schema->resultset('Artist')->count } ); + + like ( + $output, + qr/ + \A + ^ \QBEGIN WORK\E \s*? + ^ \QSELECT COUNT( * ) FROM artist me:\E \s*? + ^ \QCOMMIT\E \s*? + \z + /xm + ); + + $schema->storage->debug(0); + $schema->storage->debugfh(undef); +} + done_testing;