1#testing init_and_watch
2
3BEGIN { 
4    if($ENV{INTERNAL_DEBUG}) {
5        require Log::Log4perl::InternalDebug;
6        Log::Log4perl::InternalDebug->enable();
7    }
8}
9
10use Test::More;
11
12use warnings;
13use strict;
14
15use Log::Log4perl;
16use File::Spec;
17
18sub trunc {
19    open FILE, ">$_[0]" or die "Cannot open $_[0]";
20    close FILE;
21}
22
23sub is_like_windows {
24    if( $^O eq "MSWin32" or
25        $^O eq "cygwin" ) {
26        return 1;
27    }
28
29    return 0;
30}
31
32BEGIN {
33    if ($] < 5.006) {
34        plan skip_all => "Only with perl >= 5.006";
35    } else {
36        plan tests => 34;
37    }
38}
39
40my $WORK_DIR = "tmp";
41if(-d "t") {
42    $WORK_DIR = File::Spec->catfile(qw(t tmp));
43}
44
45unless (-e "$WORK_DIR"){
46    mkdir("$WORK_DIR", 0755) || die "can't create $WORK_DIR ($!)";
47}
48
49my $testfile = File::Spec->catfile($WORK_DIR, "test17.log");
50my $testfile2 = File::Spec->catfile($WORK_DIR, "test17b.log");
51my $testconf = File::Spec->catfile($WORK_DIR, "test17.conf");
52
53END { 
54    unlink $testfile if (-e $testfile);
55    unlink $testfile2 if (-e $testfile2);
56    unlink $testconf if (-e $testconf);
57    rmdir $WORK_DIR;
58}
59
60trunc($testfile);
61trunc($testconf);
62
63my $conf1 = <<EOL;
64log4j.category.animal.dog   = INFO, myAppender
65
66log4j.appender.myAppender          = Log::Log4perl::Appender::File
67log4j.appender.myAppender.layout   = Log::Log4perl::Layout::SimpleLayout
68log4j.appender.myAppender.filename = $testfile
69log4j.appender.myAppender.mode     = append
70
71EOL
72open (CONF, ">$testconf") || die "can't open $testconf $!";
73print CONF $conf1;
74close CONF;
75
76Log::Log4perl->init_and_watch($testconf, 1);
77
78my $logger = Log::Log4perl::get_logger('animal.dog');
79
80$logger->debug('debug message');
81$logger->info('info message');
82
83ok(! $logger->is_debug(), "is_debug - true");
84ok(  $logger->is_info(),  "is_info - true");
85ok(  $logger->is_warn(),  "is_warn - true");
86ok(  $logger->is_error(), "is_error - true");
87ok(  $logger->is_fatal(), "is_fatal - true");
88
89# *********************************************************************
90# Check if we really dont re-read the conf file if nothing has changed
91# *********************************************************************
92
93my $how_many_reads = $Log::Log4perl::Config::CONFIG_FILE_READS;
94print "sleeping for 2 secs\n";
95sleep 2;
96$logger->is_debug();
97is($how_many_reads, $Log::Log4perl::Config::CONFIG_FILE_READS,
98   "no re-read until config has changed");
99
100    # Need to sleep for at least a sec, otherwise the watcher
101    # wont check
102print "sleeping for 2 secs\n";
103sleep 2;
104
105# *********************************************************************
106# Now, lets check what happens if the config changes
107# *********************************************************************
108
109my $conf2 = <<EOL;
110log4j.category.animal.dog   = DEBUG, myAppender
111
112log4j.appender.myAppender          = Log::Log4perl::Appender::File
113log4j.appender.myAppender.layout = org.apache.log4j.PatternLayout
114log4j.appender.myAppender.layout.ConversionPattern=%-5p %c - %m%n
115
116log4j.appender.myAppender.filename = $testfile
117log4j.appender.myAppender.mode     = append
118EOL
119
120open (CONF, ">$testconf") || die "can't open $testconf $!";
121print CONF $conf2;
122close CONF;
123
124$logger = Log::Log4perl::get_logger('animal.dog');
125
126$logger->debug('2nd debug message');
127is($Log::Log4perl::Config::CONFIG_FILE_READS, 
128   $how_many_reads + 1,
129   "re-read if config has changed, even if no logger has fired");
130
131$logger->info('2nd info message');
132print "sleeping for 2 secs\n";
133sleep 2;
134$logger->info('2nd info message again');
135
136is($Log::Log4perl::Config::CONFIG_FILE_READS, 
137   $how_many_reads + 1,
138   "no re-read unless config has changed");
139
140open (LOG, $testfile) or die "can't open $testfile $!";
141my @log = <LOG>;
142close LOG;
143my $log = join('',@log);
144
145is($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");
146ok(  $logger->is_debug(), "is_debug - false");
147ok(  $logger->is_info(),  "is_info - true");
148ok(  $logger->is_warn(),  "is_warn - true");
149ok(  $logger->is_error(), "is_error - true");
150ok(  $logger->is_fatal(), "is_fatal - true");
151
152# ***************************************************************
153# do it 3rd time
154
155print "sleeping for 2 secs\n";
156sleep 2;
157
158$conf2 = <<EOL;
159log4j.category.animal.dog   = INFO, myAppender
160
161log4j.appender.myAppender          = Log::Log4perl::Appender::File
162log4j.appender.myAppender.layout   = Log::Log4perl::Layout::SimpleLayout
163log4j.appender.myAppender.filename = $testfile
164log4j.appender.myAppender.mode     = append
165EOL
166open (CONF, ">$testconf") || die "can't open $testconf $!";
167print CONF $conf2;
168close CONF;
169
170$logger = Log::Log4perl::get_logger('animal.dog');
171
172$logger->debug('2nd debug message');
173$logger->info('3rd info message');
174
175ok(! $logger->is_debug(), "is_debug - false");
176ok(  $logger->is_info(),  "is_info - true");
177ok(  $logger->is_warn(),  "is_warn - true");
178ok(  $logger->is_error(), "is_error - true");
179ok(  $logger->is_fatal(), "is_fatal - true");
180
181open (LOG, $testfile) or die "can't open $testfile $!";
182@log = <LOG>;
183close LOG;
184$log = join('',@log);
185
186is($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");
187
188SKIP: {
189  skip "Signal handling not supported on Win32", 2 if is_like_windows();
190   # ***************************************************************
191   # Check the 'recreate' feature
192   
193   trunc($testfile);
194   my $conf4 = <<EOL;
195   log4j.category.animal.dog   = INFO, myAppender
196   
197   log4j.appender.myAppender          = Log::Log4perl::Appender::File
198   log4j.appender.myAppender.layout   = Log::Log4perl::Layout::SimpleLayout
199   log4j.appender.myAppender.filename = $testfile
200   log4j.appender.myAppender.recreate = 1
201   log4j.appender.myAppender.recreate_check_interval = 0
202   log4j.appender.myAppender.mode     = append
203EOL
204   
205   Log::Log4perl->init(\$conf4);
206   
207   $logger = Log::Log4perl::get_logger('animal.dog');
208   $logger->info("test1");
209   open (LOG, $testfile) or die "can't open $testfile $!";
210   is(scalar <LOG>, "INFO - test1\n", "Before recreate");
211   close LOG;
212   
213   unlink $testfile or die "Cannot unlink $testfile: $!";
214   $logger->info("test2");
215   open (LOG, $testfile) or die "can't open $testfile $!";
216   is(scalar <LOG>, "INFO - test2\n", "After recreate");
217   close LOG;
218   
219   trunc($testfile);
220   trunc($testconf);
221};
222
223
224# ***************************************************************
225# Check the 'recreate' feature with signal handling
226
227SKIP: {
228  skip "File recreation not supported on Win32", 9 if is_like_windows();
229
230  # Use two appenders to confirm that both files are recreated when the
231  # signal is received, rather than just whichever watcher was created
232  # last.
233
234  my $conf5 = <<EOL;
235    log4j.category.animal.dog   = INFO, myAppender1
236    log4j.category.animal.cat   = INFO, myAppender2
237
238    log4j.appender.myAppender1          = Log::Log4perl::Appender::File
239    log4j.appender.myAppender1.layout   = Log::Log4perl::Layout::SimpleLayout
240    log4j.appender.myAppender1.filename = $testfile
241    log4j.appender.myAppender1.recreate = 1
242    log4j.appender.myAppender1.recreate_check_signal = USR1
243
244    log4j.appender.myAppender2          = Log::Log4perl::Appender::File
245    log4j.appender.myAppender2.layout   = Log::Log4perl::Layout::SimpleLayout
246    log4j.appender.myAppender2.filename = $testfile2
247    log4j.appender.myAppender2.recreate = 1
248    log4j.appender.myAppender2.recreate_check_signal = USR1
249EOL
250
251  Log::Log4perl->init(\$conf5);
252  
253  my $logger = Log::Log4perl::get_logger('animal.dog');
254  $logger->info("test1");
255  ok(-f $testfile, "recreate_signal - testfile created");
256
257  my $logger2 = Log::Log4perl::get_logger('animal.cat');
258  $logger2->info("test1");
259  ok(-f $testfile2, "recreate_signal - testfile created");
260
261  
262  unlink $testfile, $testfile2;
263  ok(!-f $testfile, "recreate_signal - testfile deleted");
264  ok(!-f $testfile2, "recreate_signal - testfile2 deleted");
265  
266  $logger->info("test1");
267  $logger2->info("test1");
268  ok(!-f $testfile, "recreate_signal - testfile still missing");
269  ok(!-f $testfile2, "recreate_signal - testfile2 still missing");
270  
271  ok(kill('USR1', $$), "sending signal");
272  $logger->info("test1");
273  $logger2->info("test1");
274  ok(-f $testfile, "recreate_signal - testfile reinstated");
275  ok(-f $testfile2, "recreate_signal - testfile2 reinstated");
276};
277
278
279SKIP: {
280  skip "Removing busy files not supported on Win32", 1 if is_like_windows();
281
282    # ***************************************************************
283    # Check the 'recreate' feature with check_interval
284    
285    trunc($testfile);
286    my $conf3 = <<EOL;
287    log4j.category.animal.dog   = INFO, myAppender
288    
289    log4j.appender.myAppender          = Log::Log4perl::Appender::File
290    log4j.appender.myAppender.layout   = Log::Log4perl::Layout::SimpleLayout
291    log4j.appender.myAppender.filename = $testfile
292    log4j.appender.myAppender.recreate = 1
293    log4j.appender.myAppender.recreate_check_interval = 1
294    log4j.appender.myAppender.mode     = append
295EOL
296    
297      # Create logfile
298    Log::Log4perl->init(\$conf3);
299      # ... and immediately remove it
300    unlink $testfile or die "cannot remove file $testfile ($!)";
301    
302    print "sleeping for 2 secs\n";
303    sleep(2);
304    
305    $logger = Log::Log4perl::get_logger('animal.dog');
306    $logger->info("test1");
307    open (LOG, $testfile) or die "can't open $testfile $!";
308    is(scalar <LOG>, "INFO - test1\n", "recreate before first write");
309    close LOG;
310}
311
312# ***************************************************************
313# Check the 'recreate' feature with check_interval (2nd write)
314
315SKIP: {
316  skip "Signal handling not supported on Win32", 1 if is_like_windows();
317    trunc($testfile);
318    my $conf3 = <<EOL;
319    log4j.category.animal.dog   = INFO, myAppender
320
321    log4j.appender.myAppender          = Log::Log4perl::Appender::File
322    log4j.appender.myAppender.layout   = Log::Log4perl::Layout::SimpleLayout
323    log4j.appender.myAppender.filename = $testfile
324    log4j.appender.myAppender.recreate = 1
325    log4j.appender.myAppender.recreate_check_interval = 1
326    log4j.appender.myAppender.mode     = append
327EOL
328
329      # Create logfile
330    Log::Log4perl->init(\$conf3);
331
332      # Write to it
333    $logger = Log::Log4perl::get_logger('animal.dog');
334    $logger->info("test1");
335
336      # ... remove it (stupid windoze cannot remove an open file)
337    rename $testfile, "$testfile.old";
338    unlink $testfile;
339
340    print "sleeping for 2 secs\n";
341    sleep(2);
342
343      # ... write again
344    $logger->info("test2");
345
346    open (LOG, $testfile) or die "can't open $testfile $!";
347    is(scalar <LOG>, "INFO - test2\n", "recreate before 2nd write");
348    close LOG;
349    unlink "$testfile.old";
350};
351
352# ***************************************************************
353# Check the 'recreate' feature with moved/recreated file
354
355SKIP: {
356  skip "Moving busy files not supported on Win32", 1 if is_like_windows();
357
358    trunc($testfile);
359    my $conf3 = <<EOL;
360    log4j.category.animal.dog   = INFO, myAppender
361
362    log4j.appender.myAppender          = Log::Log4perl::Appender::File
363    log4j.appender.myAppender.layout   = Log::Log4perl::Layout::SimpleLayout
364    log4j.appender.myAppender.filename = $testfile
365    log4j.appender.myAppender.recreate = 1
366    log4j.appender.myAppender.recreate_check_interval = 1
367    log4j.appender.myAppender.mode     = append
368EOL
369
370      # Create logfile
371    Log::Log4perl->init(\$conf3);
372
373      # Get a logger, but dont write to it
374    $logger = Log::Log4perl::get_logger('animal.dog');
375
376    rename "$testfile", "$testfile.old" or die "Cannot rename ($!)";
377      # recreate it
378    trunc($testfile);
379
380    print "sleeping for 2 secs\n";
381    sleep(2);
382
383      # ... write to (hopefully) truncated file
384    $logger->info("test3");
385
386    open (LOG, $testfile) or die "can't open $testfile $!";
387    is(scalar <LOG>, "INFO - test3\n", "log to externally recreated file");
388    close LOG;
389
390    unlink "$testfile.old";
391};
392