X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Flib%2Fdbixcsl_dumper_tests.pm;h=d37900cd1e6c4292ea2b8d9d726a4a0b4f48eb55;hb=ff4b0152ac81e80600a8d52a30a56538c563f2c4;hp=ff0cd06d86f2a3169dd90ad8bd3b3be9195eafd7;hpb=c213fd3d7802c6d46dceae4e371476de14c43c56;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/t/lib/dbixcsl_dumper_tests.pm b/t/lib/dbixcsl_dumper_tests.pm index ff0cd06..d37900c 100644 --- a/t/lib/dbixcsl_dumper_tests.pm +++ b/t/lib/dbixcsl_dumper_tests.pm @@ -4,22 +4,39 @@ use strict; use Test::More; use File::Path; use IPC::Open3; +use IO::Handle; +use List::MoreUtils 'any'; use DBIx::Class::Schema::Loader::Utils 'dumper_squashed'; use DBIx::Class::Schema::Loader (); +use Class::Unload (); +use namespace::clean; -use dbixcsl_test_dir qw/$tdir/; +use dbixcsl_test_dir '$tdir'; my $DUMP_PATH = "$tdir/dump"; + sub cleanup { rmtree($DUMP_PATH, 1, 1); } -sub append_to_class { - my ($self, $class, $string) = @_; +sub class_file { + my ($self, $class) = @_; + $class =~ s{::}{/}g; $class = $DUMP_PATH . '/' . $class . '.pm'; + + return $class; +} + +sub append_to_class { + my ($self, $class, $string) = @_; + + $class = $self->class_file($class); + open(my $appendfh, '>>', $class) or die "Failed to open '$class' for append: $!"; + print $appendfh $string; + close($appendfh); } @@ -30,7 +47,10 @@ sub dump_test { $tdata{options}{dump_directory} = $DUMP_PATH; $tdata{options}{use_namespaces} ||= 0; - for my $dumper (\&_dump_directly, \&_dump_dbicdump) { + SKIP: for my $dumper (\&_dump_directly, \&_dump_dbicdump) { + skip 'skipping dbicdump tests on Win32', 1, + if $dumper == \&_dump_dbicdump && $^O eq 'MSWin32'; + _test_dumps(\%tdata, $dumper->(%tdata)); } } @@ -43,16 +63,19 @@ sub _dump_directly { no strict 'refs'; @{$schema_class . '::ISA'} = ('DBIx::Class::Schema::Loader'); - $schema_class->loader_options(%{$tdata{options}}); + $schema_class->loader_options( + quiet => 1, + %{$tdata{options}}, + ); my @warns; eval { local $SIG{__WARN__} = sub { push(@warns, @_) }; - $schema_class->connect(_get_dsn(\%tdata)); + $schema_class->connect(_get_connect_info(\%tdata)); }; my $err = $@; - $schema_class->storage->disconnect if !$err && $schema_class->storage; - undef *{$schema_class}; + + Class::Unload->unload($schema_class); _check_error($err, $tdata{error}); @@ -63,39 +86,52 @@ sub _dump_dbicdump { my %tdata = @_; # use $^X so we execute ./script/dbicdump with the same perl binary that the tests were executed with - my @cmd = ($^X, qw(./script/dbicdump)); + my @cmd = ($^X, qw(script/dbicdump)); + + $tdata{options}{quiet} = 1 unless exists $tdata{options}{quiet}; while (my ($opt, $val) = each(%{ $tdata{options} })) { $val = dumper_squashed $val if ref $val; - push @cmd, '-o', "$opt=$val"; + + my $param = "$opt=$val"; + + if ($^O eq 'MSWin32') { + $param = q{"} . $param . q{"}; # that's not nearly enough... + } + + push @cmd, '-o', $param; } - push @cmd, $tdata{classname}, _get_dsn(\%tdata); + my @connect_info = _get_connect_info(\%tdata); + + for my $info (@connect_info) { + $info = dumper_squashed $info if ref $info; + } + + push @cmd, $tdata{classname}, @connect_info; # make sure our current @INC gets used by dbicdump use Config; local $ENV{PERL5LIB} = join $Config{path_sep}, @INC, ($ENV{PERL5LIB} || ''); - my ($in, $out, $err); - my $pid = open3($in, $out, $err, @cmd); + my $std = { map { $_ => IO::Handle->new } (qw/in out err/) }; + my $pid = open3(@{$std}{qw/in out err/}, @cmd); - my @out = <$out>; waitpid($pid, 0); - my ($error, @warns); + my @stdout = $std->{out}->getlines; + ok (!scalar @stdout, 'Silence on STDOUT'); + my @warnings = $std->{err}->getlines; if ($? >> 8 != 0) { - $error = $out[0]; - _check_error($error, $tdata{error}); - } - else { - @warns = @out; + my $exception = pop @warnings; + _check_error($exception, $tdata{error}); } - return @warns; + return @warnings; } -sub _get_dsn { +sub _get_connect_info { my $opts = shift; my $test_db_class = $opts->{test_db_class} || 'make_dbictest_db'; @@ -108,7 +144,7 @@ sub _get_dsn { ${$test_db_class . '::dsn'}; }; - return $dsn; + return ($dsn, @{ $opts->{extra_connect_info} || [] }); } sub _check_error { @@ -129,7 +165,6 @@ sub _check_error { is $got, $expected, 'error matches'; } - sub _test_dumps { my ($tdata, @warns) = @_; @@ -137,10 +172,12 @@ sub _test_dumps { my $schema_class = $tdata{classname}; my $check_warns = $tdata{warnings}; - is(@warns, @$check_warns, "$schema_class warning count"); + + is(@warns, @$check_warns, "$schema_class warning count") + or diag @warns; for(my $i = 0; $i <= $#$check_warns; $i++) { - like($warns[$i], $check_warns->[$i], "$schema_class warning $i"); + like(($warns[$i] || ''), $check_warns->[$i], "$schema_class warning $i"); } my $file_regexes = $tdata{regexes};