The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use Test::More;
use File::Temp ();
use File::Spec::Functions qw(catfile catdir file_name_is_absolute splitdir);
use TAP::Harness::Archive;
use Archive::Tar;
plan(tests => 10);

# a temp directory to put everything in
my $temp_dir = File::Temp->newdir('tap-archive-XXXXXXXX', CLEANUP => 1, TMPDIR => 1);
my @testfiles = (catfile('t', 'foo.t'), catfile('t', 'bar.t'));
my @extra_files = (
    catfile('t', 'extra_files', 'log1.txt'),
    catfile('t', 'extra_files', 'log2.txt'),
    catfile('t', 'extra_files', 'stuff', 'svk.info'),
);

# create an archive with extra files
$file = catfile($temp_dir, 'archive.tar.gz');
$harness = TAP::Harness::Archive->new(
    {
        archive     => $file,
        verbosity   => -2,
        extra_files => \@extra_files,
    }
);
$harness->runtests(@testfiles);
ok(-e $file, 'archive.tar.gz created');
check_archive($file);

sub check_archive {
    my $archive_file = shift;
    my %tap_files;
    my $aggregator = TAP::Harness::Archive->aggregator_from_archive(
        {
            archive            => $archive_file,
            meta_yaml_callback => sub {
                my $yaml = shift;
                $yaml = $yaml->[0];

                # did we have all of the extra files?
                my $x_files = $yaml->{extra_files};
                cmp_ok(ref $x_files,      'eq', 'ARRAY', 'extra_files is an array');
                cmp_ok(scalar(@$x_files), '==', 3,       '3 extra_files recorded');
            },
        }
    );

    isa_ok($aggregator, 'TAP::Parser::Aggregator');
    cmp_ok($aggregator->total, '==', 5, "aggregator has correct total");
    my @parsers = $aggregator->parsers();
    cmp_ok(scalar @parsers, '==', 2, "correct # of parsers");
}

my $tar = Archive::Tar->new($file);
isa_ok($tar, 'Archive::Tar');
my @contents = $tar->list_files();
foreach my $extra_file (@extra_files) {
    # Archive::Tar returns file names with "/" path separator.
    # Passing it through catdir(splitdir()) will give us the
    # correct system path separator (e.g. "\" on Win32).
    my $count = grep { catdir(splitdir($_)) eq $extra_file } @contents;
    ok($count == 1, "Archive contains extra file $extra_file");
}