diff options
Diffstat (limited to 't/056SyncApp2.t')
-rw-r--r-- | t/056SyncApp2.t | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/t/056SyncApp2.t b/t/056SyncApp2.t new file mode 100644 index 0000000..6c0841c --- /dev/null +++ b/t/056SyncApp2.t @@ -0,0 +1,88 @@ +#!/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"); + |