Archive-Tar-Builder

 view release on metacpan or  search on metacpan

t/lib-Archive-Tar-Builder.t  view on Meta::CPAN

use strict;
use warnings;

use ExtUtils::testlib;
use FindBin;

use Cwd        ();
use File::Temp ();
use File::Path ();
use IPC::Open3 ();
use Symbol     ();
use Errno;

use Archive::Tar::Builder ();

use Test::More tests => 74;
use Test::Exception;

sub find_tar {
    my @PATH     = qw( /usr/local/bin /usr/bin /bin );
    my @PROGRAMS = qw( gtar ustar star bsdtar tar );

    foreach my $program (@PROGRAMS) {
        foreach my $dir (@PATH) {
            my $name = "$dir/$program";

            return $name if -x $name;
        }
    }

    die('Could not locate a tar binary');
}

sub is_bsd_tar {
    my ($tar) = @_;
    my $is_bsd_tar = 0;

    open( my $in,  '<', '/dev/null' ) or die("Unable to open /dev/null for reading: $!");
    open( my $out, '>', '/dev/null' ) or die("Unable to open /dev/null for writing: $!");

    my $err = Symbol::gensym();

    my $pid = IPC::Open3::open3( $in, $out, $err, $tar, '--help' );

    close $in;
    close $out;

    while ( my $line = readline($err) ) {
        chomp $line;
        $is_bsd_tar = 1 if $line =~ /^usage: tar .*crtux/;
    }

    close $err;

    waitpid( $pid, 0 ) or die("Unable to waitpid() on $pid: $!");

    return $is_bsd_tar;
}

sub find_unused_ids {
    my ( $uid, $gid );

    for ( $uid = 99999; getpwuid($uid); $uid-- ) { }
    for ( $gid = 99999; getgrgid($gid); $gid-- ) { }

    return ( $uid, $gid );
}

sub build_tree {
    my $tmpdir = File::Temp::tempdir( 'CLEANUP' => 1 );
    my $file   = "$tmpdir/foo/exclude.txt";

    File::Path::mkpath("$tmpdir/foo/bar/baz/foo/cats");
    File::Path::mkpath("$tmpdir/foo/poop");
    File::Path::mkpath("$tmpdir/foo/cats/meow");
    File::Path::mkpath("$tmpdir/home/prrr/1327342027.M926735P26547V000000000000FD00I0000000001888287_0.one.two.threefour.five.S=2486:2.");

    open( my $fh, '>', $file ) or die("Unable to open $file for writing: $!");
    print {$fh} "cats\n";
    close $fh;

    my $long   = 'bleh' x 50;
    my $subdir = "$tmpdir/$long/$long";
    $file = "$subdir/thingie.txt";

    File::Path::mkpath($subdir);

    open( $fh, '>', $file ) or die("Unable to open $file for writing: $!");
    print {$fh} "Meow\n";
    close $fh;

    return $tmpdir;
}

my $badfile = '/dev/null/impossible';
my $tar     = find_tar();

{
    my $builder = Archive::Tar::Builder->new;

    eval { $builder->archive(); };

    like( $@ => qr/No paths to archive specified/, '$builder->archive() dies if no paths are specified' );

    eval { $builder->archive('foo'); };

    like( $@ => qr/No file handle set/, '$builder->archive() dies if no file handle is set' );

    eval { $builder->archive_as( 'foo' => 'bar' ); };

    like( $@ => qr/No file handle set/, '$builder->archive_as() dies if no file handle is set' );
}

SKIP: {
    skip( 'Cannot test permissions failures as root', 2 ) if $< == 0;

    my $tmp = File::Temp::tempdir( 'CLEANUP' => 1 );
    my $dir = "$tmp/foo";

    mkdir( $dir, 0000 );

    my $builder = Archive::Tar::Builder->new( 'quiet' => 1 );

    open( my $fh, '>', '/dev/null' ) or die("Unable to open /dev/null: $!");

    $builder->set_handle($fh);



( run in 1.562 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )