App-CPAN-Mini-Visit
view release on metacpan or search on metacpan
lib/App/CPAN/Mini/Visit.pm view on Meta::CPAN
sub _visit {
my ( $archive, @cmd_line ) = @_;
my $tempd = tempd;
my $ae = Archive::Extract->new( archive => $archive );
my $olderr;
# stderr > /dev/null if quiet
if ( !$Archive::Extract::WARN ) {
open $olderr, ">&STDERR";
open STDERR, ">", File::Spec->devnull;
}
my $extract_ok = $ae->extract;
# restore stderr if quiet
if ( !$Archive::Extract::WARN ) {
open STDERR, ">&", $olderr;
close $olderr;
}
if ( !$extract_ok ) {
warn "Couldn't extract '$archive'\n" if $Archive::Extract::WARN;
return;
}
t/01-App-CPAN-Mini-Visit.t view on Meta::CPAN
plan tests => 30;
require_ok('App::CPAN::Mini::Visit');
#--------------------------------------------------------------------------#
# fixtures
#--------------------------------------------------------------------------#
my $exe = basename $0;
my ( $stdout, $stderr );
my $tempdir = tempdir( CLEANUP => 1 );
my $minicpan = dir(qw/t CPAN/);
my $archive_re = qr{\.(?:tar\.(?:bz2|gz|Z)|t(?:gz|bz)|zip|pm\.gz)$}i;
my @files;
find(
{
follow => 0,
no_chdir => 1,
wanted => sub { push @files, $_ if -f && /\.tar\.gz$/ },
t/01-App-CPAN-Mini-Visit.t view on Meta::CPAN
#--------------------------------------------------------------------------#
# Option: version
#--------------------------------------------------------------------------#
for my $opt (qw/ --version -V /) {
try eval {
capture sub {
App::CPAN::Mini::Visit->run($opt);
} => \$stdout,
\$stderr;
};
catch my $err;
is( $stderr, "$exe: $App::CPAN::Mini::Visit::VERSION\n", "[$opt] correct" )
or diag $err;
}
#--------------------------------------------------------------------------#
# Option: help
#--------------------------------------------------------------------------#
for my $opt (qw/ --help -h /) {
try eval {
capture sub {
App::CPAN::Mini::Visit->run($opt);
} => \$stdout,
\$stderr;
};
catch my $err;
like( $stderr, qr/^Usage:/, "[$opt] correct" ) or diag $err;
}
#--------------------------------------------------------------------------#
# minicpan -- no minicpanrc and no --minicpan should fail with error
#--------------------------------------------------------------------------#
# homedir for testing
local $ENV{HOME} = $tempdir;
# should have error here
{
my $label = "no minicpan config";
try eval {
capture sub {
App::CPAN::Mini::Visit->run();
} => \$stdout,
\$stderr;
};
catch my $err;
like( $stderr, qr/^No minicpan configured/, "[$label] error message correct" )
or diag $err;
}
# missing minicpan directory should have error
my $bad_minicpan = 'doesntexist';
_create_minicpanrc("local: $bad_minicpan");
{
my $label = "missing minicpan dir";
try eval {
capture sub {
App::CPAN::Mini::Visit->run();
} => \$stdout,
\$stderr;
};
catch my $err;
like(
$stderr,
qr/^Directory '$bad_minicpan' does not appear to be a CPAN repository/,
"[$label] error message correct"
) or diag $err;
}
# badly structured minicpan directory should have error
$bad_minicpan = dir( $tempdir, 'CPAN' );
mkdir $bad_minicpan;
_create_minicpanrc("local: $bad_minicpan");
{
my $label = "bad minicpan dir";
try eval {
capture sub {
App::CPAN::Mini::Visit->run();
} => \$stdout,
\$stderr;
};
catch my $err;
like(
$stderr,
qr/^Directory '\Q$bad_minicpan\E' does not appear to be a CPAN repository/,
"[$label] error message correct"
) or diag $err;
}
# good minicpan directory (from options -- overrides bad config)
for my $opt (qw/ --minicpan -m /) {
my $label = "good $opt=...";
try eval {
capture sub {
App::CPAN::Mini::Visit->run("$opt=$minicpan");
} => \$stdout,
\$stderr;
};
catch my $err;
is( $stderr, "", "[$label] no error message" ) or diag $err;
}
# good minicpan directory (from config only)
_create_minicpanrc("local: $minicpan");
{
my $label = "good minicpan from config";
try eval {
capture sub {
App::CPAN::Mini::Visit->run();
} => \$stdout,
\$stderr;
};
catch my $err;
is( $stderr, "", "[$label] no error message" ) or diag $err;
}
# bad minicpan directory (from options -- overrides bad config)
{
my $label = "bad -m=...";
try eval {
capture sub {
App::CPAN::Mini::Visit->run("-m=$bad_minicpan");
} => \$stdout,
\$stderr;
};
catch my $err;
like(
$stderr,
qr/^Directory '\Q$bad_minicpan\E' does not appear to be a CPAN repository/,
"[$label] error message correct"
) or diag $err;
}
#--------------------------------------------------------------------------#
# default behavior -- list files
#--------------------------------------------------------------------------#
{
my $label = "list files";
try eval {
capture sub {
App::CPAN::Mini::Visit->run();
} => \$stdout,
\$stderr;
};
catch my $err;
my @found = split /\n/, $stdout;
is_deeply( \@found, \@files, "[$label] listing correct" );
}
#--------------------------------------------------------------------------#
# run program
#--------------------------------------------------------------------------#
{
my $label = "pwd";
try eval {
capture sub {
App::CPAN::Mini::Visit->run( "--", $^X, '-e',
'use Cwd qw/abs_path/; print abs_path(".") . "\n"' );
} => \$stdout,
\$stderr;
};
catch my $err;
my @found =
map { dir($_)->relative( dir($_)->parent ) } split /\n/, $stdout;
my @expect = map {
my $base = file($_)->basename;
$base =~ s{$archive_re}{};
$base;
} @files;
ok( length $stdout, "[$label] got stdout" ) or diag $err;
is_deeply( \@found, \@expect, "[$label] listing correct" )
or diag "STDOUT:\n$stdout\nSTDERR:\n$stderr\n";
}
#--------------------------------------------------------------------------#
# run perl -e
#--------------------------------------------------------------------------#
{
my $label = "perl-e";
try eval {
capture sub {
App::CPAN::Mini::Visit->run( '-e',
'use Cwd qw/abs_path/; print abs_path(".") . "\n"' );
} => \$stdout,
\$stderr;
};
catch my $err;
my @found =
map { dir($_)->relative( dir($_)->parent ) } split /\n/, $stdout;
my @expect = map {
my $base = file($_)->basename;
$base =~ s{$archive_re}{};
$base;
} @files;
ok( length $stdout, "[$label] got stdout" ) or diag $err;
is_deeply( \@found, \@expect, "[$label] listing correct" )
or diag "STDOUT:\n$stdout\nSTDERR:\n$stderr\n";
}
#--------------------------------------------------------------------------#
# run perl -E
#--------------------------------------------------------------------------#
{
my $label = "perl-E";
try eval {
capture sub {
App::CPAN::Mini::Visit->run( '-E',
'use Cwd qw/abs_path/; print abs_path(".") . "\n"' );
} => \$stdout,
\$stderr;
};
catch my $err;
my @found =
map { dir($_)->relative( dir($_)->parent ) } split /\n/, $stdout;
my @expect = map {
my $base = file($_)->basename;
$base =~ s{$archive_re}{};
$base;
} @files;
ok( length $stdout, "[$label] got stdout" ) or diag $err;
is_deeply( \@found, \@expect, "[$label] listing correct" )
or diag "STDOUT:\n$stdout\nSTDERR:\n$stderr\n";
}
#--------------------------------------------------------------------------#
# --append path
#--------------------------------------------------------------------------#
{
my $label = "path";
for my $opt (qw/ --append -a /) {
try eval {
capture sub {
App::CPAN::Mini::Visit->run( "$opt=path", "--", $^X, '-e',
'print shift(@ARGV) . "\n"' );
} => \$stdout,
\$stderr;
};
catch my $err;
my @found = split /\n/, $stdout;
my @expect = @files;
ok( length $stdout, "[$label] ($opt) got stdout" ) or diag $err;
is_deeply( \@found, \@expect, "[$label] ($opt) listing correct" )
or diag "STDOUT:\n$stdout\nSTDERR:\n$stderr\n";
}
}
#--------------------------------------------------------------------------#
# --append dist
#--------------------------------------------------------------------------#
{
my $label = "dist";
for my $opt (qw/ --append -a /) {
try eval {
capture sub {
App::CPAN::Mini::Visit->run( "$opt=dist", "--", $^X, '-e',
'print shift(@ARGV) . "\n"' );
} => \$stdout,
\$stderr;
};
catch my $err;
my @found = split /\n/, $stdout;
my $prefix = dir( $minicpan, qw/ authors id / )->absolute;
my @expect = map {
( my $file = $_ ) =~ s{$prefix[/\\].[/\\]..[/\\]}{};
$file;
} @files;
ok( length $stdout, "[$label] ($opt) got stdout" ) or diag $err;
is_deeply( \@found, \@expect, "[$label] ($opt) listing correct" )
or diag "STDOUT:\n$stdout\nSTDERR:\n$stderr\n";
}
}
#--------------------------------------------------------------------------#
# --output file
#--------------------------------------------------------------------------#
{
my $label = "output";
my $tempfile = tmpnam();
try eval {
capture sub {
App::CPAN::Mini::Visit->run("--output=$tempfile");
} => \$stdout,
\$stderr;
};
catch my $err;
ok( -f $tempfile, "[$label] output file created" );
my @found = map { chomp; $_ } do { local @ARGV = ($tempfile); <> };
is( $stdout, '', "[$label] saw no output on terminal" );
is_deeply( \@found, \@files, "[$label] listing correct" );
}
xt/author/00-compile.t view on Meta::CPAN
use File::Spec;
use IPC::Open3;
use IO::Handle;
open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!";
my @warnings;
for my $lib (@module_files)
{
# see L<perlfaq8/How can I capture STDERR from an external command?>
my $stderr = IO::Handle->new;
my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, '-e', "require q[$lib]");
binmode $stderr, ':crlf' if $^O eq 'MSWin32';
my @_warnings = <$stderr>;
waitpid($pid, 0);
is($?, 0, "$lib loaded ok");
if (@_warnings)
{
warn @_warnings;
push @warnings, @_warnings;
}
}
foreach my $file (@scripts)
{ SKIP: {
open my $fh, '<', $file or warn("Unable to open $file: $!"), next;
my $line = <$fh>;
close $fh and skip("$file isn't perl", 1) unless $line =~ /^#!.*?\bperl\b\s*(.*)$/;
my @flags = $1 ? split(/\s+/, $1) : ();
my $stderr = IO::Handle->new;
my $pid = open3($stdin, '>&STDERR', $stderr, $^X, $inc_switch, @flags, '-c', $file);
binmode $stderr, ':crlf' if $^O eq 'MSWin32';
my @_warnings = <$stderr>;
waitpid($pid, 0);
is($?, 0, "$file compiled ok");
# in older perls, -c output is simply the file portion of the path being tested
if (@_warnings = grep { !/\bsyntax OK$/ }
grep { chomp; $_ ne (File::Spec->splitpath($file))[2] } @_warnings)
{
warn @_warnings;
push @warnings, @_warnings;
}
( run in 1.130 second using v1.01-cache-2.11-cpan-49f99fa48dc )