summaryrefslogtreecommitdiff
path: root/t/017Watch.t
diff options
context:
space:
mode:
Diffstat (limited to 't/017Watch.t')
-rw-r--r--t/017Watch.t391
1 files changed, 391 insertions, 0 deletions
diff --git a/t/017Watch.t b/t/017Watch.t
new file mode 100644
index 0000000..beffdb3
--- /dev/null
+++ b/t/017Watch.t
@@ -0,0 +1,391 @@
+#testing init_and_watch
+
+BEGIN {
+ if($ENV{INTERNAL_DEBUG}) {
+ require Log::Log4perl::InternalDebug;
+ Log::Log4perl::InternalDebug->enable();
+ }
+}
+
+use Test::More;
+
+use warnings;
+use strict;
+
+use Log::Log4perl;
+use File::Spec;
+
+sub trunc {
+ open FILE, ">$_[0]" or die "Cannot open $_[0]";
+ close FILE;
+}
+
+sub is_like_windows {
+ if( $^O eq "MSWin32" or
+ $^O eq "cygwin" ) {
+ return 1;
+ }
+
+ return 0;
+}
+
+BEGIN {
+ if ($] < 5.006) {
+ plan skip_all => "Only with perl >= 5.006";
+ } else {
+ plan tests => 34;
+ }
+}
+
+my $WORK_DIR = "tmp";
+if(-d "t") {
+ $WORK_DIR = File::Spec->catfile(qw(t tmp));
+}
+
+unless (-e "$WORK_DIR"){
+ mkdir("$WORK_DIR", 0755) || die "can't create $WORK_DIR ($!)";
+}
+
+my $testfile = File::Spec->catfile($WORK_DIR, "test17.log");
+my $testfile2 = File::Spec->catfile($WORK_DIR, "test17b.log");
+my $testconf = File::Spec->catfile($WORK_DIR, "test17.conf");
+
+END {
+ unlink $testfile if (-e $testfile);
+ unlink $testfile2 if (-e $testfile2);
+ unlink $testconf if (-e $testconf);
+ rmdir $WORK_DIR;
+}
+
+trunc($testfile);
+trunc($testconf);
+
+my $conf1 = <<EOL;
+log4j.category.animal.dog = INFO, myAppender
+
+log4j.appender.myAppender = Log::Log4perl::Appender::File
+log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout
+log4j.appender.myAppender.filename = $testfile
+log4j.appender.myAppender.mode = append
+
+EOL
+open (CONF, ">$testconf") || die "can't open $testconf $!";
+print CONF $conf1;
+close CONF;
+
+Log::Log4perl->init_and_watch($testconf, 1);
+
+my $logger = Log::Log4perl::get_logger('animal.dog');
+
+$logger->debug('debug message');
+$logger->info('info message');
+
+ok(! $logger->is_debug(), "is_debug - true");
+ok( $logger->is_info(), "is_info - true");
+ok( $logger->is_warn(), "is_warn - true");
+ok( $logger->is_error(), "is_error - true");
+ok( $logger->is_fatal(), "is_fatal - true");
+
+# *********************************************************************
+# Check if we really dont re-read the conf file if nothing has changed
+# *********************************************************************
+
+my $how_many_reads = $Log::Log4perl::Config::CONFIG_FILE_READS;
+print "sleeping for 2 secs\n";
+sleep 2;
+$logger->is_debug();
+is($how_many_reads, $Log::Log4perl::Config::CONFIG_FILE_READS,
+ "no re-read until config has changed");
+
+ # Need to sleep for at least a sec, otherwise the watcher
+ # wont check
+print "sleeping for 2 secs\n";
+sleep 2;
+
+# *********************************************************************
+# Now, lets check what happens if the config changes
+# *********************************************************************
+
+my $conf2 = <<EOL;
+log4j.category.animal.dog = DEBUG, myAppender
+
+log4j.appender.myAppender = Log::Log4perl::Appender::File
+log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout
+log4j.appender.myAppender.layout.ConversionPattern=%-5p %c - %m%n
+
+log4j.appender.myAppender.filename = $testfile
+log4j.appender.myAppender.mode = append
+EOL
+
+open (CONF, ">$testconf") || die "can't open $testconf $!";
+print CONF $conf2;
+close CONF;
+
+$logger = Log::Log4perl::get_logger('animal.dog');
+
+$logger->debug('2nd debug message');
+is($Log::Log4perl::Config::CONFIG_FILE_READS,
+ $how_many_reads + 1,
+ "re-read if config has changed, even if no logger has fired");
+
+$logger->info('2nd info message');
+print "sleeping for 2 secs\n";
+sleep 2;
+$logger->info('2nd info message again');
+
+is($Log::Log4perl::Config::CONFIG_FILE_READS,
+ $how_many_reads + 1,
+ "no re-read unless config has changed");
+
+open (LOG, $testfile) or die "can't open $testfile $!";
+my @log = <LOG>;
+close LOG;
+my $log = join('',@log);
+
+is($log, "INFO - info message\nDEBUG animal.dog - 2nd debug message\nINFO animal.dog - 2nd info message\nINFO animal.dog - 2nd info message again\n", "1st init");
+ok( $logger->is_debug(), "is_debug - false");
+ok( $logger->is_info(), "is_info - true");
+ok( $logger->is_warn(), "is_warn - true");
+ok( $logger->is_error(), "is_error - true");
+ok( $logger->is_fatal(), "is_fatal - true");
+
+# ***************************************************************
+# do it 3rd time
+
+print "sleeping for 2 secs\n";
+sleep 2;
+
+$conf2 = <<EOL;
+log4j.category.animal.dog = INFO, myAppender
+
+log4j.appender.myAppender = Log::Log4perl::Appender::File
+log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout
+log4j.appender.myAppender.filename = $testfile
+log4j.appender.myAppender.mode = append
+EOL
+open (CONF, ">$testconf") || die "can't open $testconf $!";
+print CONF $conf2;
+close CONF;
+
+$logger = Log::Log4perl::get_logger('animal.dog');
+
+$logger->debug('2nd debug message');
+$logger->info('3rd info message');
+
+ok(! $logger->is_debug(), "is_debug - false");
+ok( $logger->is_info(), "is_info - true");
+ok( $logger->is_warn(), "is_warn - true");
+ok( $logger->is_error(), "is_error - true");
+ok( $logger->is_fatal(), "is_fatal - true");
+
+open (LOG, $testfile) or die "can't open $testfile $!";
+@log = <LOG>;
+close LOG;
+$log = join('',@log);
+
+is($log, "INFO - info message\nDEBUG animal.dog - 2nd debug message\nINFO animal.dog - 2nd info message\nINFO animal.dog - 2nd info message again\nINFO - 3rd info message\n", "after reload");
+
+SKIP: {
+ skip "Signal handling not supported on Win32", 2 if is_like_windows();
+ # ***************************************************************
+ # Check the 'recreate' feature
+
+ trunc($testfile);
+ my $conf4 = <<EOL;
+ log4j.category.animal.dog = INFO, myAppender
+
+ log4j.appender.myAppender = Log::Log4perl::Appender::File
+ log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout
+ log4j.appender.myAppender.filename = $testfile
+ log4j.appender.myAppender.recreate = 1
+ log4j.appender.myAppender.recreate_check_interval = 0
+ log4j.appender.myAppender.mode = append
+EOL
+
+ Log::Log4perl->init(\$conf4);
+
+ $logger = Log::Log4perl::get_logger('animal.dog');
+ $logger->info("test1");
+ open (LOG, $testfile) or die "can't open $testfile $!";
+ is(scalar <LOG>, "INFO - test1\n", "Before recreate");
+ close LOG;
+
+ unlink $testfile or die "Cannot unlink $testfile: $!";
+ $logger->info("test2");
+ open (LOG, $testfile) or die "can't open $testfile $!";
+ is(scalar <LOG>, "INFO - test2\n", "After recreate");
+ close LOG;
+
+ trunc($testfile);
+ trunc($testconf);
+};
+
+
+# ***************************************************************
+# Check the 'recreate' feature with signal handling
+
+SKIP: {
+ skip "File recreation not supported on Win32", 9 if is_like_windows();
+
+ # Use two appenders to confirm that both files are recreated when the
+ # signal is received, rather than just whichever watcher was created
+ # last.
+
+ my $conf5 = <<EOL;
+ log4j.category.animal.dog = INFO, myAppender1
+ log4j.category.animal.cat = INFO, myAppender2
+
+ log4j.appender.myAppender1 = Log::Log4perl::Appender::File
+ log4j.appender.myAppender1.layout = Log::Log4perl::Layout::SimpleLayout
+ log4j.appender.myAppender1.filename = $testfile
+ log4j.appender.myAppender1.recreate = 1
+ log4j.appender.myAppender1.recreate_check_signal = USR1
+
+ log4j.appender.myAppender2 = Log::Log4perl::Appender::File
+ log4j.appender.myAppender2.layout = Log::Log4perl::Layout::SimpleLayout
+ log4j.appender.myAppender2.filename = $testfile2
+ log4j.appender.myAppender2.recreate = 1
+ log4j.appender.myAppender2.recreate_check_signal = USR1
+EOL
+
+ Log::Log4perl->init(\$conf5);
+
+ my $logger = Log::Log4perl::get_logger('animal.dog');
+ $logger->info("test1");
+ ok(-f $testfile, "recreate_signal - testfile created");
+
+ my $logger2 = Log::Log4perl::get_logger('animal.cat');
+ $logger2->info("test1");
+ ok(-f $testfile2, "recreate_signal - testfile created");
+
+
+ unlink $testfile, $testfile2;
+ ok(!-f $testfile, "recreate_signal - testfile deleted");
+ ok(!-f $testfile2, "recreate_signal - testfile2 deleted");
+
+ $logger->info("test1");
+ $logger2->info("test1");
+ ok(!-f $testfile, "recreate_signal - testfile still missing");
+ ok(!-f $testfile2, "recreate_signal - testfile2 still missing");
+
+ ok(kill('USR1', $$), "sending signal");
+ $logger->info("test1");
+ $logger2->info("test1");
+ ok(-f $testfile, "recreate_signal - testfile reinstated");
+ ok(-f $testfile2, "recreate_signal - testfile2 reinstated");
+};
+
+
+SKIP: {
+ skip "Removing busy files not supported on Win32", 1 if is_like_windows();
+
+ # ***************************************************************
+ # Check the 'recreate' feature with check_interval
+
+ trunc($testfile);
+ my $conf3 = <<EOL;
+ log4j.category.animal.dog = INFO, myAppender
+
+ log4j.appender.myAppender = Log::Log4perl::Appender::File
+ log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout
+ log4j.appender.myAppender.filename = $testfile
+ log4j.appender.myAppender.recreate = 1
+ log4j.appender.myAppender.recreate_check_interval = 1
+ log4j.appender.myAppender.mode = append
+EOL
+
+ # Create logfile
+ Log::Log4perl->init(\$conf3);
+ # ... and immediately remove it
+ unlink $testfile or die "cannot remove file $testfile ($!)";
+
+ print "sleeping for 2 secs\n";
+ sleep(2);
+
+ $logger = Log::Log4perl::get_logger('animal.dog');
+ $logger->info("test1");
+ open (LOG, $testfile) or die "can't open $testfile $!";
+ is(scalar <LOG>, "INFO - test1\n", "recreate before first write");
+ close LOG;
+}
+
+# ***************************************************************
+# Check the 'recreate' feature with check_interval (2nd write)
+
+SKIP: {
+ skip "Signal handling not supported on Win32", 1 if is_like_windows();
+ trunc($testfile);
+ my $conf3 = <<EOL;
+ log4j.category.animal.dog = INFO, myAppender
+
+ log4j.appender.myAppender = Log::Log4perl::Appender::File
+ log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout
+ log4j.appender.myAppender.filename = $testfile
+ log4j.appender.myAppender.recreate = 1
+ log4j.appender.myAppender.recreate_check_interval = 1
+ log4j.appender.myAppender.mode = append
+EOL
+
+ # Create logfile
+ Log::Log4perl->init(\$conf3);
+
+ # Write to it
+ $logger = Log::Log4perl::get_logger('animal.dog');
+ $logger->info("test1");
+
+ # ... remove it (stupid windoze cannot remove an open file)
+ rename $testfile, "$testfile.old";
+ unlink $testfile;
+
+ print "sleeping for 2 secs\n";
+ sleep(2);
+
+ # ... write again
+ $logger->info("test2");
+
+ open (LOG, $testfile) or die "can't open $testfile $!";
+ is(scalar <LOG>, "INFO - test2\n", "recreate before 2nd write");
+ close LOG;
+ unlink "$testfile.old";
+};
+
+# ***************************************************************
+# Check the 'recreate' feature with moved/recreated file
+
+SKIP: {
+ skip "Moving busy files not supported on Win32", 1 if is_like_windows();
+
+ trunc($testfile);
+ my $conf3 = <<EOL;
+ log4j.category.animal.dog = INFO, myAppender
+
+ log4j.appender.myAppender = Log::Log4perl::Appender::File
+ log4j.appender.myAppender.layout = Log::Log4perl::Layout::SimpleLayout
+ log4j.appender.myAppender.filename = $testfile
+ log4j.appender.myAppender.recreate = 1
+ log4j.appender.myAppender.recreate_check_interval = 1
+ log4j.appender.myAppender.mode = append
+EOL
+
+ # Create logfile
+ Log::Log4perl->init(\$conf3);
+
+ # Get a logger, but dont write to it
+ $logger = Log::Log4perl::get_logger('animal.dog');
+
+ rename "$testfile", "$testfile.old" or die "Cannot rename ($!)";
+ # recreate it
+ trunc($testfile);
+
+ print "sleeping for 2 secs\n";
+ sleep(2);
+
+ # ... write to (hopefully) truncated file
+ $logger->info("test3");
+
+ open (LOG, $testfile) or die "can't open $testfile $!";
+ is(scalar <LOG>, "INFO - test3\n", "log to externally recreated file");
+ close LOG;
+
+ unlink "$testfile.old";
+};