X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Fdebug.t;h=68687957b9c1d13462e792e29dad13e21da0468e;hb=5c505cafa292b25dbbfb0df53ac30e73069834a2;hp=632f370330518725bb312b608824efbcfa1977c9;hpb=09d763c81fee2ecb75b301c992f33105f981e82c;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/debug.t b/t/storage/debug.t index 632f370..6868795 100644 --- a/t/storage/debug.t +++ b/t/storage/debug.t @@ -2,23 +2,26 @@ use strict; use warnings; no warnings 'once'; +BEGIN { $ENV{DBICTEST_VIA_REPLICATED} = 0 } + use Test::More; use Test::Exception; +use Try::Tiny; +use File::Spec; use lib qw(t/lib); use DBICTest; -use DBIC::DebugObj; -use DBIC::SqlMakerTest; use Path::Class qw/file/; BEGIN { delete @ENV{qw(DBIC_TRACE DBIC_TRACE_PROFILE DBICTEST_SQLITE_USE_FILE)} } my $schema = DBICTest->init_schema(); -my $lfn = file('t/var/sql.log'); +my $lfn = file("t/var/sql-$$.log"); unlink $lfn or die $! if -e $lfn; # make sure we are testing the vanilla debugger and not ::PrettyPrint +require DBIx::Class::Storage::Statistics; $schema->storage->debugobj(DBIx::Class::Storage::Statistics->new); ok ( $schema->storage->debug(1), 'debug' ); @@ -49,33 +52,127 @@ $schema->storage->debugfh(undef); $schema->storage->debugobj->debugfh(undef) } +END { + unlink $lfn; +} + open(STDERRCOPY, '>&STDERR'); -close(STDERR); -dies_ok { + +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; -} 'Died on closed FH'; +} catch { + $_ +} finally { + # restore STDERR + open(STDERR, '>&STDERRCOPY'); +}; + +ok $exception =~ / + \QDuplication of STDERR for debug output failed (perhaps your STDERR is closed?)\E + .+ + \Qat @{[__FILE__]} line $exception_line_number\E$ +/xms + or diag "Unexpected exception text:\n\n$exception\n"; + +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 +{ + my $rs = $schema->resultset('CD')->search( { + artist => 1, + cdid => { -between => [ 1, 3 ] }, + title => { '!=' => \[ '?', undef ] } + }); + + my $sql_trace = 'SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( ( artist = ? AND ( cdid BETWEEN ? AND ? ) AND title != ? ) )'; + my @bind_trace = qw( '1' '1' '3' NULL ); # quotes are in fact part of the trace + + + my @args; + $schema->storage->debugcb(sub { push @args, @_ } ); -open(STDERR, '>&STDERRCOPY'); + $rs->all; + + is_deeply( \@args, [ + "SELECT", + sprintf( "%s: %s\n", $sql_trace, join ', ', @bind_trace ), + ]); + + { + package DBICTest::DebugObj; + our @ISA = 'DBIx::Class::Storage::Statistics'; + + sub query_start { + my $self = shift; + ( $self->{_traced_sql}, @{$self->{_traced_bind}} ) = @_; + } + } + + my $do = $schema->storage->debugobj(DBICTest::DebugObj->new); + + $rs->all; + + is( $do->{_traced_sql}, $sql_trace ); + + is_deeply ( $do->{_traced_bind}, \@bind_trace ); +} -# test trace output correctness for bind params +# 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 ($sql, @bind); - $schema->storage->debugobj(DBIC::DebugObj->new(\$sql, \@bind)); - - my @cds = $schema->resultset('CD')->search( { artist => 1, cdid => { -between => [ 1, 3 ] }, } ); - is_same_sql_bind( - $sql, \@bind, - "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( artist = ? AND (cdid BETWEEN ? AND ?) )", - [qw/'1' '1' '3'/], - 'got correct SQL with all bind parameters (debugcb)' - ); - - @cds = $schema->resultset('CD')->search( { artist => 1, cdid => { -between => [ 1, 3 ] }, } ); - is_same_sql_bind( - $sql, \@bind, - "SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me WHERE ( artist = ? AND (cdid BETWEEN ? AND ?) )", ["'1'", "'1'", "'3'"], - 'got correct SQL with all bind parameters (debugobj)' - ); + 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;