use strict;
use constant NUM_ROUNDS => 2;
use Test::More tests => 8 + (7*NUM_ROUNDS);
use Win32;
BEGIN {
use_ok('Win32::EventLog');
use_ok('Log::Dispatch');
use_ok('Log::Dispatch::Win32EventLog');
}
$Win32::EventLog::GetMessageText = 1;
is($Win32::EventLog::GetMessageText, 1, "Set Win32::EventLog::GetMessageText");
my $hnd;
sub open_log {
$hnd = Win32::EventLog->new("Application", Win32::NodeName);
}
END {
if ($hnd) {
$hnd->Close;
$hnd = undef;
}
}
sub get_number {
my $cnt = -1;
$hnd->GetNumber($cnt);
return 0+$cnt;
}
sub get_last_event {
my $event = { };
if ($hnd->Read(
EVENTLOG_BACKWARDS_READ() |
EVENTLOG_SEQUENTIAL_READ(), 0, $event)) {
return $event;
} else {
diag("WARNING: Unable to read event log");
return;
}
}
open_log();
my $dispatch = Log::Dispatch->new;
ok( defined $dispatch, "new Log::Dispatch" );
is( ref($dispatch), 'Log::Dispatch', '... of the right type' );
$dispatch->add( Log::Dispatch::Win32EventLog->new(
source => 'Win32EventLog test',
min_level => 0, max_level => 7, name => 'test'
));
my %Events = ( ); # track events that we logged
my $time = sub {sprintf '%04d%02d%02d%02d%02d%02d',
$_[5]+1900, $_[4]+1, reverse(@_[0..3])}->(localtime);
# We run multiple rounds because we want to avoid checking passing the
# tests based on previous run of this script. That, combined with
# using the time to differentiate runs, should make sure that we test
# for each session.
foreach my $tag (1..NUM_ROUNDS) {
my $cnt1 = -1;
$hnd->GetNumber($cnt1);
$dispatch->log(level => 'emerg', message => "emergency,$tag,$time");
my $cnt2 = -1;
$hnd->GetNumber($cnt2);
isnt($cnt2, -1, "got an event number for emerg $tag");
cmp_ok( $cnt2, '>=', $cnt1, "emerg $tag" );
$Events{"emergency,$tag,$time"} = 1;
$dispatch->log(level => 'warning', message => "warning,$tag,$time");
$Events{"warning,$tag,$time"} = 1;
$cnt1 = -1;
$hnd->GetNumber($cnt1);
cmp_ok( $cnt2, '<=', $cnt1, "warning $tag" );
$dispatch->log(level =>'info', message => "info,$tag,$time");
$Events{"info,$tag,$time"} = 1;
$cnt2 = -1;
$hnd->GetNumber($cnt2);
cmp_ok( $cnt2, '>=', $cnt1, "info $tag" );
}
{
ok( (keys %Events) == (3*NUM_ROUNDS) );
# require YAML;
while ((keys %Events) && (my $event = get_last_event())) {
# print STDERR YAML->Dump($event);
my $string = $event->{Strings};
if ( ($string =~ /(\w+)\,(\d+),(\d+)/) &&
($event->{Source} eq 'Win32EventLog test') ) {
if( $3 == $time) {
my $key = "$1,$2,$3";
ok(delete $Events{$key}, "drained event $key");
}
}
}
is( (keys %Events), 0, "all events drained" );
}