#!perl

BEGIN {
    unless ( $ENV{RELEASE_TESTING} ) {
        require Test::More;
        Test::More::plan(
            skip_all => 'these tests are for release candidate testing' );
    }
}

use strict;
use warnings;

use FindBin;
use File::Copy qw(copy);
use File::Spec;
use File::Temp;
use Test::More;

sub copy_log_file {
    my ($home) = @_;
    my $log_file = File::Spec->catfile( $home, '.cpanm', 'build.log' );
    my $tempfile = File::Temp->new(
        SUFFIX => '.log',
        UNLINK => 0,
    );
    copy( $log_file, $tempfile->filename );
    diag("For details, please consult $tempfile");
}

sub is_dist_root {
    my (@path) = @_;

    return -e File::Spec->catfile( @path, 'Makefile.PL' )
        || -e File::Spec->catfile( @path, 'Build.PL' );
}

delete @ENV{qw/AUTHOR_TESTING RELEASE_TESTING PERL5LIB/};

unless ( $ENV{'PERLBREW_ROOT'} ) {
    plan skip_all => "Environment variable 'PERLBREW_ROOT' not found";
    exit;
}

my $brew = q[perl-5.12.5-TEST];

my $cpanm_path = qx(which cpanm 2>/dev/null);
unless ($cpanm_path) {
    plan skip_all => "The 'cpanm' program is required to run this test";
    exit;
}
chomp $cpanm_path;

my $perlbrew_bin
    = File::Spec->catdir( $ENV{'PERLBREW_ROOT'}, 'perls', $brew, 'bin' );

my $perlbrew_path = $ENV{'PATH'};
if ( my $local_lib_root = $ENV{'PERL_LOCAL_LIB_ROOT'} ) {
    my @path = File::Spec->path;

    while ( @path && $path[0] =~ /^$local_lib_root/ ) {
        shift @path;
    }

    if ( $^O eq 'MSWin32' ) {
        $perlbrew_path = join( ';', @path );
    }
    else {
        $perlbrew_path = join( ':', @path );
    }
}

my ( $env, $status ) = do {
    local $ENV{'PATH'}  = $perlbrew_path;
    local $ENV{'SHELL'} = '/bin/bash';      # fool perlbrew
    ( scalar(qx(perlbrew env $brew)), $? );
};

unless ( $status == 0 ) {
    plan skip_all => "No such perlbrew environment '$brew'";
    exit;
}

my @lines = split /\n/, $env;

foreach my $line (@lines) {
    if ( $line =~ /^\s*export\s+([0-9a-zA-Z_]+)=(.*)$/ ) {
        my ( $k, $v ) = ( $1, $2 );
        if ( $v =~ /^("|')(.*)\1$/ ) {
            $v = $2;
            $v =~ s!\\(.)!$1!ge;
        }
        $ENV{$k} = $v;
    }
    elsif ( $line =~ /^unset\s+([0-9a-zA-Z_]+)/ ) {
        delete $ENV{$1};
    }
}

my $pristine_path = do {
    local $ENV{'PATH'} = $perlbrew_path;
    qx(perlbrew display-pristine-path);
};
chomp $pristine_path;
$ENV{'PATH'} = join( ':', $ENV{'PERLBREW_PATH'}, $pristine_path );

plan tests => 1;

my $tmpdir  = File::Temp->newdir;
my $tmphome = File::Temp->newdir;

my $pid = fork;
if ( !defined $pid ) {
    fail "Forking failed!";
    exit 1;
}
elsif ($pid) {
    waitpid $pid, 0;
    ok !$?, "cpanm should successfully install your dist with no issues"
        or copy_log_file( $tmphome->dirname );
}
else {
    open STDIN,  '<', File::Spec->devnull;
    open STDOUT, '>', File::Spec->devnull;
    open STDERR, '>', File::Spec->devnull;

    my @path = File::Spec->splitdir($FindBin::Bin);

    while ( @path && !is_dist_root(@path) ) {
        pop @path;
    }
    unless (@path) {
        die "Unable to find dist root\n";
    }
    chdir File::Spec->catdir(@path);    # exit test directory

    # override where cpanm puts its log file
    $ENV{'HOME'} = $tmphome->dirname;

    # We use system here instead of exec so that $tmpdir gets cleaned up
    # after cpanm finishes
    system 'perl', $cpanm_path, '-L', $tmpdir->dirname, '.';
    exit( $? >> 8 );
}
