#!/usr/bin/perl
##########################################################################
# The test checks Log::Log4perl::Appender::Synchronized for correct semaphore
# destruction when using parameter "destroy".
# Based on: 042SyncApp.t
# Jens Berthold, 2009 (log4perl@jebecs.de)
##########################################################################
use warnings;
use strict;
BEGIN {
if($ENV{INTERNAL_DEBUG}) {
require Log::Log4perl::InternalDebug;
Log::Log4perl::InternalDebug->enable();
}
}
use Test::More;
use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($DEBUG);
use constant INTERNAL_DEBUG => 0;
our $INTERNAL_DEBUG = 0;
$| = 1;
BEGIN {
if(exists $ENV{"L4P_ALL_TESTS"}) {
plan tests => 1;
} else {
plan skip_all => "- only with L4P_ALL_TESTS";
}
}
use Log::Log4perl::Util::Semaphore;
use Log::Log4perl qw(get_logger);
use Log::Log4perl::Appender::Synchronized;
my $EG_DIR = "eg";
$EG_DIR = "../eg" unless -d $EG_DIR;
my $logfile = "$EG_DIR/fork.log";
our $lock;
unlink $logfile;
my $conf = qq(
log4perl.category.Bar.Twix = WARN, Syncer
log4perl.appender.Logfile = Log::Log4perl::Appender::TestFileCreeper
log4perl.appender.Logfile.autoflush = 1
log4perl.appender.Logfile.filename = $logfile
log4perl.appender.Logfile.layout = Log::Log4perl::Layout::PatternLayout
log4perl.appender.Logfile.layout.ConversionPattern = %F{1}%L> %m%n
log4perl.appender.Syncer = Log::Log4perl::Appender::Synchronized
log4perl.appender.Syncer.appender = Logfile
log4perl.appender.Syncer.key = blah
log4perl.appender.Syncer.destroy = 1
);
Log::Log4perl::init(\$conf);
my $pid = fork();
die "fork failed" unless defined $pid;
my $logger = get_logger("Bar::Twix");
if($pid) {
# parent
# no logging test here: if child erroneously deletes semaphore,
# any log output at this point would crash the test
} else {
# child
exit 0;
}
# Wait for child to finish
print "Waiting for pid $pid\n" if $INTERNAL_DEBUG;
waitpid($pid, 0);
print "Done waiting for pid $pid\n" if $INTERNAL_DEBUG;
unlink $logfile;
# Destroying appender (+semaphore) fails if child process already destroyed it
Log::Log4perl->appender_by_name('Syncer')->DESTROY();
ok(!$@, "Destroying appender");