package TestCommon::LogDiff; use strict; use warnings FATAL => 'all'; use POSIX (); sub new { my $class = shift; my $path = shift; open my $fh, "<$path" or die "Can't open $path: $!"; seek $fh, 0, POSIX::SEEK_END(); my $pos = tell $fh; my %self = ( path => $path, fh => $fh, pos => $pos, ); return bless \%self, $class; } sub DESTROY { my $self = shift; close $self->{fh}; } sub diff { my $self = shift; # XXX: is it possible that some system will be slow to flush the # buffers and we may need to wait a bit and retry if we see no new # logged data? my $fh = $self->{fh}; seek $fh, $self->{pos}, POSIX::SEEK_SET(); # not really needed local $/; # slurp mode my $diff = <$fh>; seek $fh, 0, POSIX::SEEK_END(); $self->{pos} = tell $fh; return defined $diff ? $diff : ''; } 1; __END__ =head1 NAME TestCommon::LogDiff - get log file diffs =head1 Synopsis use TestCommon::LogDiff; use Apache::Test; plan tests => 2; my $path = "/tmp/mylog"; open my $fh, ">>$path" or die "Can't open $path: $!"; my $logdiff = TestCommon::LogDiff->new($path); print $fh "foo 123\n"; my $expected = qr/^foo/; ok t_cmp $logdiff->diff, $expected; print $fh "bar\n"; my $expected = 'bar'; ok t_cmp $logdiff->diff, $expected; =head1 Description Useful for testing the warning, error and other messages going into the log file. =head1 API =head2 new open the log file and point the filehandle pointer to its end. =head2 diff extract any newly logged information since the last check and move the filehandle to the end of the file. =cut