X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fstorage%2Fdebug.t;h=aac2a2371bf9930c5236a4c8458c4601cfa942b1;hb=dd1853390485b141d014a59aa550fba966493784;hp=77f7e423fe1ef1c7a08c4d80f5ba50542551a763;hpb=e9f71ab2a49f61024a982fd4ee6f6351fb283c6a;p=dbsrgits%2FDBIx-Class.git diff --git a/t/storage/debug.t b/t/storage/debug.t index 77f7e42..aac2a23 100644 --- a/t/storage/debug.t +++ b/t/storage/debug.t @@ -1,46 +1,59 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } + use strict; use warnings; no warnings 'once'; +BEGIN { + delete @ENV{qw( + DBIC_TRACE + DBIC_TRACE_PROFILE + DBICTEST_SQLITE_USE_FILE + DBICTEST_VIA_REPLICATED + )}; +} + use Test::More; use Test::Exception; use Try::Tiny; -use lib qw(t/lib); -use DBICTest; -use Path::Class qw/file/; +use File::Spec; -BEGIN { delete @ENV{qw(DBIC_TRACE DBIC_TRACE_PROFILE DBICTEST_SQLITE_USE_FILE)} } +use DBICTest; +use DBICTest::Util 'slurp_bytes'; my $schema = DBICTest->init_schema(); -my $lfn = file("t/var/sql-$$.log"); -unlink $lfn or die $! - if -e $lfn; +my $log_fn = "t/var/sql-$$.log"; +unlink $log_fn or die $! if -e $log_fn; # 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' ); -$schema->storage->debugfh($lfn->openw); -$schema->resultset('CD')->count; +{ + open my $dbgfh, '>', $log_fn or die $!; + $schema->storage->debugfh($dbgfh); + $schema->storage->debugfh->autoflush(1); + $schema->resultset('CD')->count; + $schema->storage->debugfh(undef); +} -my @loglines = $lfn->slurp; +my @loglines = slurp_bytes $log_fn; is (@loglines, 1, 'one line of log'); like($loglines[0], qr/^SELECT COUNT/, 'File log via debugfh success'); -$schema->storage->debugfh(undef); { - local $ENV{DBIC_TRACE} = "=$lfn"; - unlink $lfn; + local $ENV{DBIC_TRACE} = "=$log_fn"; + unlink $log_fn; $schema->resultset('CD')->count; my $schema2 = DBICTest->init_schema(no_deploy => 1); $schema2->storage->_do_query('SELECT 1'); # _do_query() logs via standard mechanisms - my @loglines = $lfn->slurp; + my @loglines = slurp_bytes $log_fn; is(@loglines, 2, '2 lines of log'); like($loglines[0], qr/^SELECT COUNT/, 'Env log from schema1 success'); like($loglines[1], qr/^SELECT 1:/, 'Env log from schema2 success'); @@ -49,14 +62,16 @@ $schema->storage->debugfh(undef); } END { - unlink $lfn; + unlink $log_fn if $log_fn; } open(STDERRCOPY, '>&STDERR'); +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 { $_ @@ -65,9 +80,32 @@ my $exception = try { open(STDERR, '>&STDERRCOPY'); }; -like $exception, qr/\QDuplication of STDERR for debug output failed (perhaps your STDERR is closed?)/; +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 { @@ -110,4 +148,40 @@ like $exception, qr/\QDuplication of STDERR for debug output failed (perhaps you 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;