X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Flib%2FDBICTest%2FRunMode.pm;h=82da4df233b45415cc93b51cf3ff0950ff45e6ce;hb=439a7283a981f27a56e745d99e456fc50a5a018f;hp=b15139202e859c89b0e713b52f4f81ed64545327;hpb=7b87b77c04e07cfea1103dba8ecbd3f219e949d2;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/t/lib/DBICTest/RunMode.pm b/t/lib/DBICTest/RunMode.pm index b151392..82da4df 100644 --- a/t/lib/DBICTest/RunMode.pm +++ b/t/lib/DBICTest/RunMode.pm @@ -4,86 +4,8 @@ package # hide from PAUSE use strict; use warnings; -use Path::Class qw/file dir/; -use Fcntl ':DEFAULT'; -use File::Spec (); -use File::Temp (); -use DBICTest::Util qw( local_umask find_co_root ); - -# Try to determine the root of a checkout/untar if possible -# return a Path::Class::Dir object or undef -sub _find_co_root { eval { dir( find_co_root() ) } } - -# PathTools has a bug where on MSWin32 it will often return / as a tmpdir. -# This is *really* stupid and the result of having our lockfiles all over -# the place is also rather obnoxious. So we use our own heuristics instead -# https://rt.cpan.org/Ticket/Display.html?id=76663 -my $tmpdir; -sub tmpdir { - dir ($tmpdir ||= do { - - # works but not always - my $dir = dir(File::Spec->tmpdir); - my $reason_dir_unusable; - - my @parts = File::Spec->splitdir($dir); - if (@parts == 2 and $parts[1] =~ /^ [\/\\]? $/x ) { - $reason_dir_unusable = - 'File::Spec->tmpdir returned a root directory instead of a designated ' - . 'tempdir (possibly https://rt.cpan.org/Ticket/Display.html?id=76663)'; - } - else { - # make sure we can actually create and sysopen a file in this dir - local $@; - my $u = local_umask(0); # match the umask we use in DBICTest(::Schema) - my $tempfile = ''; - eval { - $tempfile = File::Temp->new( - TEMPLATE => '_dbictest_writability_test_XXXXXX', - DIR => "$dir", - UNLINK => 1, - ); - close $tempfile or die "closing $tempfile failed: $!\n"; - - sysopen (my $tempfh2, "$tempfile", O_RDWR) or die "reopening $tempfile failed: $!\n"; - print $tempfh2 'deadbeef' x 1024 or die "printing to $tempfile failed: $!\n"; - close $tempfh2 or die "closing $tempfile failed: $!\n"; - 1; - } or do { - chomp( my $err = $@ ); - my @x_tests = map { (defined $_) ? ( $_ ? 1 : 0 ) : 'U' } map {(-e, -d, -f, -r, -w, -x, -o)} ("$dir", "$tempfile"); - $reason_dir_unusable = sprintf <<"EOE", "$tempfile"||'', $err, scalar $>, scalar $), umask(), (stat($dir))[4,5,2], @x_tests; -File::Spec->tmpdir returned a directory which appears to be non-writeable: -Error encountered while testing '%s': %s -Process EUID/EGID: %s / %s -Effective umask: %o -TmpDir UID/GID: %s / %s -TmpDir StatMode: %o -TmpDir X-tests: -e:%s -d:%s -f:%s -r:%s -w:%s -x:%s -o:%s -TmpFile X-tests: -e:%s -d:%s -f:%s -r:%s -w:%s -x:%s -o:%s -EOE - }; - } - - if ($reason_dir_unusable) { - # Replace with our local project tmpdir. This will make multiple runs - # from different runs conflict with each other, but is much better than - # polluting the root dir with random crap or failing outright - my $local_dir = _find_co_root()->subdir('t')->subdir('var'); - $local_dir->mkpath; - - warn "\n\nUsing '$local_dir' as test scratch-dir instead of '$dir': $reason_dir_unusable\n"; - $dir = $local_dir; - } - - $dir->stringify; - }); -} - - # Mimic $Module::Install::AUTHOR sub is_author { - return ( ! -d 'inc/Module' or