1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
use Test::More;
use Test::Fatal;
use File::Slurp;
BEGIN {
use_ok( 'Zonemaster::Engine::Logger' );
use_ok( 'Zonemaster::Engine::Logger::Entry' );
use_ok( 'Zonemaster::Engine::Exception' );
}
use Zonemaster::Engine::Util;
my $log = Zonemaster::Engine->logger;
isa_ok( $log, 'Zonemaster::Engine::Logger' );
$log->add( 'TAG', { seventeen => 17 } );
# Make sure all our "policy" comes from our "policy" file.
my $json = read_file( "t/profiles/policy.json" );
my $profile_test = Zonemaster::Engine::Profile->from_json( $json );
my $profile = Zonemaster::Engine::Profile->default;
$profile->merge( $profile_test );
Zonemaster::Engine::Profile->effective->merge( $profile );
my $e = $log->entries->[-1];
isa_ok( $e, 'Zonemaster::Engine::Logger::Entry' );
is( $e->module, 'System', 'module ok' );
is( $e->tag, 'TAG', 'tag ok' );
is_deeply( $e->args, { seventeen => 17 }, 'args ok' );
my $entry = info( 'TEST', { an => 'argument' } );
isa_ok( $entry, 'Zonemaster::Engine::Logger::Entry' );
ok( scalar( @{ Zonemaster::Engine->logger->entries } ) >= 2, 'expected number of entries' );
like( "$entry", qr/System:Unspecified:TEST an=argument/, 'stringification overload' );
is( $entry->level, 'DEBUG', 'right level' );
my $example = Zonemaster::Engine::Logger::Entry->new({ module => 'Basic', tag => 'B02_NS_BROKEN', testcase => 'Basic02' } );
is( $example->level, 'ERROR', 'expected level' );
is( $example->numeric_level, 4, 'expected numeric level' );
my $canary = 0;
$log->callback(
sub {
my ( $e ) = @_;
isa_ok( $e, 'Zonemaster::Engine::Logger::Entry' );
is( $e->tag, 'CALLBACK', 'expected tag in callback' );
$canary = $e->args->{canary};
}
);
$log->add( CALLBACK => { canary => 1 } );
ok( $canary, 'canary set' );
$log->callback( sub { die "in callback" } );
$log->add( DO_CRASH => {} );
my %res = map { $_->tag => 1 } @{ $log->entries };
ok( $res{LOGGER_CALLBACK_ERROR}, 'Callback crash logged' );
ok( $res{DO_CRASH}, 'DO_CRASH got logged anyway' );
ok( !$log->callback, 'Callback got removed' );
$log->callback( sub { die Zonemaster::Engine::Exception->new( { message => 'canary' } ) } );
eval { $log->add( DO_NOT_CRASH => {} ) };
my $err = $@;
%res = map { $_->tag => 1 } @{ $log->entries };
ok( $res{DO_NOT_CRASH}, 'DO_NOT_CRASH got logged' );
ok( $log->callback, 'Callback still there' );
isa_ok( $err, 'Zonemaster::Engine::Exception' );
is( "$err", 'canary' );
$log->callback( undef );
Zonemaster::Engine::Logger->reset_config();
$json = read_file( "t/profiles/profile.json" );
$profile_test = Zonemaster::Engine::Profile->from_json( $json );
ok( Zonemaster::Engine::Profile->effective->merge( $profile_test ), 'profile loaded' );
$log->add( FILTER_THIS => { when => 1, and => 'this' } );
my $filtered = $log->entries->[-1];
$log->add( FILTER_THIS => { when => 1, and => 'or' } );
my $also_filtered = $log->entries->[-1];
$log->add( FILTER_THIS => { when => 2, and => 'that' } );
my $not_filtered = $log->entries->[-1];
is( $not_filtered->level, 'DEBUG', 'Unfiltered level' );
is( $filtered->level, 'INFO', 'Filtered level' );
is( $also_filtered->level, 'INFO', 'Filtered level' );
my %levels = Zonemaster::Engine::Logger::Entry->levels;
is( $levels{CRITICAL}, 5, 'CRITICAL is level 5' );
is( $levels{INFO}, 1, 'INFO is level 1' );
ok( @{ $log->entries } > 0, 'There are log entries' );
my $all_json = $log->json;
my $some_json = $log->json( 'ERROR' );
ok( length( $all_json ) > length( $some_json ), 'All longer than some' );
like(
$some_json,
qr[[{"args":{"exception":"in callback at t/logger.t line 47, <DATA> line 1.\n"},"level":"ERROR","module":"SYSTEM","tag":"LOGGER_CALLBACK_ERROR","timestamp":0.\d+}]],
'JSON looks OK'
);
Zonemaster::Engine::Logger->reset_config();
Zonemaster::Engine::Profile->effective->set( q{test_levels}, {"BASIC" => {"B02_NS_BROKEN" => "GURKSALLAD" }});
my $fail = Zonemaster::Engine::Logger::Entry->new( { module => 'Basic', tag => 'B02_NS_BROKEN', testcase => 'Basic02' } );
like( exception { $fail->level }, qr/Unknown level string: GURKSALLAD/, 'Dies on unknown level string' );
done_testing;
|