The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/env perl
use v5.12.5;
our $VERSION = '9999.99.99_99'; # VERSION
use English qw(-no_match_vars);
use if $OSNAME ne 'MSWin32' || $PERL_VERSION gt 'v5.20.0', 'Test::Warnings';
use Module::Load::Conditional qw(check_install);
$::QUIET = 1;
my @distributors = ('Base');
if ( check_install( module => 'Parallel::ForkManager' ) ) {
push @distributors, 'Parallel_ForkManager';
}
my $extra_test_count = defined $Test::Warnings::VERSION ? 1 : 0;
plan tests => scalar @distributors * 2 + $extra_test_count;
for my $distributor (@distributors) {
Rex::Config->set_distributor($distributor);
subtest "$distributor distributor with exec_autodie => 0" => sub {
Rex::Config->set_exec_autodie(0);
test_summary(
task0 => { server => '<local>', task => 'task0', exit_code => 1 },
task1 => { server => '<local>', task => 'task1', exit_code => 0 },
task2 => { server => '<local>', task => 'task2', exit_code => 0 },
task3 => { server => '<local>', task => 'task3', exit_code => 1 },
);
};
subtest "$distributor distributor with exec_autodie => 1" => sub {
Rex::Config->set_exec_autodie(1);
test_summary(
task0 => { server => '<local>', task => 'task0', exit_code => 1 },
task1 => { server => '<local>', task => 'task1', exit_code => 1 },
task2 => { server => '<local>', task => 'task2', exit_code => 0 },
task3 => { server => '<local>', task => 'task3', exit_code => 1 },
);
};
}
sub create_tasks {
desc "desc 0";
task "task0" => sub {
die "bork0";
};
desc "desc 1";
task "task1" => sub {
my $cmd = $^O =~ /MSWin32/ ? "type" : "cat";
run "$cmd asdfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
};
desc "desc 2";
task "task2" => sub {
my $cmd = $^O =~ /MSWin32/ ? "dir" : "ls";
run $cmd;
};
desc "desc 3";
task "task3" => sub {
transaction {
do_task qw/task0/;
};
};
}
sub test_summary {
my (%expected) = @_;
my @expected_summary;
$Rex::TaskList::task_list = undef;
create_tasks();
for my $task_name ( Rex::TaskList->create->get_tasks ) {
Rex::TaskList->run($task_name);
my @summary = Rex::TaskList->create->get_summary;
# for the tests we remove the error message.
for (@summary) {
delete $_->{error_message};
}
push @expected_summary, $expected{$task_name};
my $test_description =
$expected{$task_name}->{exit_code} == 0
? "$task_name succeeded"
: "$task_name failed";
cmp_deeply \@summary, \@expected_summary, $test_description;
}
my $distributor = Rex::Config->get_distributor;
no warnings;
@Rex::TaskList::Base::SUMMARY = ();
}