Skip to content

Commit

Permalink
Added load_rexfile() test
Browse files Browse the repository at this point in the history
  • Loading branch information
uralm1 committed Jun 22, 2022
1 parent 5b75741 commit 34badd2
Showing 1 changed file with 175 additions and 0 deletions.
175 changes: 175 additions & 0 deletions t/load_rexfile.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
use strict;
use warnings;

use Test::More;
use Test::Output;
use File::Temp;
use File::Spec;

use Rex::CLI;

#diag 'create some rexfiles to test...';
my $fh = undef;
my $testdir = File::Temp->newdir('rextest.XXXX', TMPDIR => 1, CLEANUP => 1);
while (<DATA>) {
last if /^__END__$/;
if (/^@@ *(\S+)$/) {
#diag "prepare file $1";
close($fh) if $fh;
open($fh, '>', File::Spec->catfile($testdir, $1)) or die $!;
next;
}
print $fh $_ if $fh;
}
close($fh) if $fh;

our $exit_was_called = undef;

# we must disable Rex::CLI::exit() sub imported from Rex::Commands
no warnings 'redefine';
local *Rex::CLI::exit = sub { $exit_was_called = 1 };
use warnings 'redefine';

#
# enable this to debug!
#
$::QUIET = 1;

#$Rex::Logger::no_color = 1;
my $logfile = File::Spec->catfile($testdir, 'log');
Rex::Config->set_log_filename($logfile);


# NOW TEST

# No Rexfile warning (via Rex::Logger)
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'no_Rexfile'));
my $content = _get_log();
like($content, qr/WARN - No Rexfile found/, 'No Rexfile warning (via logger)');

# Valid Rexfile
_reset_test();
output_like {
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'Rexfile_noerror'));
} qr/^$/, qr/^$/, 'No stdout/stderr messages on valid Rexfile';
$content = _get_log();
is($content, '', 'No warnings on valid Rexfile (via logger)');

# Rexfile with warnings
_reset_test();
output_like {
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'Rexfile_warnings'));
} qr/^$/, qr/^$/, 'No stdout/stderr messages on Rexfile with warnings';
$content = _get_log();
ok(!$exit_was_called, 'sub load_rexfile() not exit');
like($content, qr/WARN - You have some code warnings/, 'Code warnings via logger');
like($content, qr/This is warning/, 'warn() warning via logger');
like($content, qr/Use of uninitialized value \$undef/, 'perl warning via logger');
unlike($content, qr#at /loader/0x#, 'loader prefix is filtered in warnings report');

# Rexfile with fatal errors
_reset_test();
output_like {
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'Rexfile_fatal'));
} qr/^$/, qr/^$/, 'No stdout/stderr messages on Rexfile with errors';
$content = _get_log();
ok($exit_was_called, 'sub load_rexfile() aborts');
like($content, qr/ERROR - Compile time errors/, 'Fatal errors via logger');
like($content, qr/syntax error at/, 'syntax error is fatal error via logger');
unlike($content, qr#at /loader/0x#, 'loader prefix is filtered in errors report');

# Now print messages to STDERR/STDOUT
# Valid Rexfile
_reset_test();
output_like {
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'Rexfile_noerror_print'));
} qr/^This is STDOUT message$/, qr/^This is STDERR message$/, 'Correct stdout/stderr messages printed from valid Rexfile';
$content = _get_log();
is($content, '', 'No warnings via logger on valid Rexfile that print messages');

# Rexfile with warnings
_reset_test();
output_like {
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'Rexfile_warnings_print'));
} qr/^This is STDOUT message$/, qr/^This is STDERR message$/, 'Correct stdout/stderr messages printed from Rexfile with warnings';
$content = _get_log();
like($content, qr/WARN - You have some code warnings/, 'Code warnings exist via logger');

# Rexfile with fatal errors
_reset_test();
output_like {
Rex::CLI::load_rexfile(File::Spec->catfile($testdir, 'Rexfile_fatal_print'));
} qr/^$/, qr/^$/, 'No stdout/stderr messages printed from Rexfile that has errors';
$content = _get_log();
ok($exit_was_called, 'sub load_rexfile() aborts');
like($content, qr/ERROR - Compile time errors/, 'Fatal errors exist via logger');


done_testing;


# from logger.t
sub _get_log {
local $/;

open my $fh, '<', $logfile or die $!;
my $loglines = <$fh>;
close $fh;

return $loglines;
}

sub _reset_test {
$exit_was_called = undef;
# reset log
open my $fh, '>', $logfile or die $!;
close $fh;
# reset require
delete $INC{'__Rexfile__.pm'};
}

__DATA__
@@ Rexfile_noerror
use Rex;
user 'testuser';
task test => sub { say "test1" };
@@ Rexfile_warnings
use Rex;
use warnings;
warn 'This is warning';
my $undef; my $warn = 'warn'.$undef;
user 'testuser';
task test => sub { say "test2" };
@@ Rexfile_fatal
use Rex;
aaaabbbbcccc
task test => sub { say "test3" };
@@ Rexfile_noerror_print
use Rex;
user 'testuser';
print STDERR 'This is STDERR message';
print STDOUT 'This is STDOUT message';
task test2 => sub { say "test4" };
@@ Rexfile_warnings_print
use Rex;
use warnings;
warn 'This is warning';
my $undef; my $warn = 'warn'.$undef;
print STDERR 'This is STDERR message';
print STDOUT 'This is STDOUT message';
user 'testuser';
task test2 => sub { say "test5" };
@@ Rexfile_fatal_print
use Rex;
print STDERR 'This is STDERR message';
print STDOUT 'This is STDOUT message';
aaaabbbbcccc
print STDERR 'This is STDERR message';
print STDOUT 'This is STDOUT message';
task test2 => sub { say "test6" };

0 comments on commit 34badd2

Please sign in to comment.