1*de8cc8edSafresh1#!perl -T 2*de8cc8edSafresh1 3*de8cc8edSafresh1use strict; 4*de8cc8edSafresh1use Config; 5*de8cc8edSafresh1use FileHandle; 6*de8cc8edSafresh1use File::Spec; 7*de8cc8edSafresh1use Test::More; 8*de8cc8edSafresh1 9*de8cc8edSafresh1# we enable all Perl warnings, but we don't "use warnings 'all'" because 10*de8cc8edSafresh1# we want to disable the warnings generated by Sys::Syslog 11*de8cc8edSafresh1no warnings; 12*de8cc8edSafresh1use warnings qw(closure deprecated exiting glob io misc numeric once overflow 13*de8cc8edSafresh1 pack portable recursion redefine regexp severe signal substr 14*de8cc8edSafresh1 syntax taint uninitialized unpack untie utf8 void); 15*de8cc8edSafresh1 16*de8cc8edSafresh1# if someone is using warnings::compat, the previous trick won't work, so we 17*de8cc8edSafresh1# must manually disable warnings 18*de8cc8edSafresh1$^W = 0 if $] < 5.006; 19*de8cc8edSafresh1 20*de8cc8edSafresh1my $is_Win32 = $^O =~ /win32/i; 21*de8cc8edSafresh1my $is_Cygwin = $^O =~ /cygwin/i; 22*de8cc8edSafresh1 23*de8cc8edSafresh1# if testing in core, check that the module is at least available 24*de8cc8edSafresh1if ($ENV{PERL_CORE}) { 25*de8cc8edSafresh1 plan skip_all => "Sys::Syslog was not build" 26*de8cc8edSafresh1 unless $Config{'extensions'} =~ /\bSyslog\b/; 27*de8cc8edSafresh1} 28*de8cc8edSafresh1 29*de8cc8edSafresh1# we also need Socket 30*de8cc8edSafresh1plan skip_all => "Socket was not build" 31*de8cc8edSafresh1 unless $Config{'extensions'} =~ /\bSocket\b/; 32*de8cc8edSafresh1 33*de8cc8edSafresh1my $tests; 34*de8cc8edSafresh1plan tests => $tests; 35*de8cc8edSafresh1 36*de8cc8edSafresh1# any remaining warning should be severly punished 37*de8cc8edSafresh1BEGIN { eval "use Test::NoWarnings"; $tests = $@ ? 0 : 1; } 38*de8cc8edSafresh1 39*de8cc8edSafresh1BEGIN { $tests += 1 } 40*de8cc8edSafresh1# ok, now loads them 41*de8cc8edSafresh1eval 'use Socket'; 42*de8cc8edSafresh1use_ok('Sys::Syslog', ':standard', ':extended', ':macros'); 43*de8cc8edSafresh1 44*de8cc8edSafresh1BEGIN { $tests += 1 } 45*de8cc8edSafresh1# check that the documented functions are correctly provided 46*de8cc8edSafresh1can_ok( 'Sys::Syslog' => qw(openlog syslog syslog setlogmask setlogsock closelog) ); 47*de8cc8edSafresh1 48*de8cc8edSafresh1 49*de8cc8edSafresh1BEGIN { $tests += 4 } 50*de8cc8edSafresh1# check the diagnostics 51*de8cc8edSafresh1# setlogsock() 52*de8cc8edSafresh1eval { setlogsock() }; 53*de8cc8edSafresh1like( $@, qr/^setlogsock\(\): Invalid number of arguments/, 54*de8cc8edSafresh1 "calling setlogsock() with no argument" ); 55*de8cc8edSafresh1 56*de8cc8edSafresh1eval { setlogsock(undef) }; 57*de8cc8edSafresh1like( $@, qr/^setlogsock\(\): Invalid type; must be one of /, 58*de8cc8edSafresh1 "calling setlogsock() with undef" ); 59*de8cc8edSafresh1 60*de8cc8edSafresh1eval { setlogsock(\"") }; 61*de8cc8edSafresh1like( $@, qr/^setlogsock\(\): Unexpected scalar reference/, 62*de8cc8edSafresh1 "calling setlogsock() with a scalar reference" ); 63*de8cc8edSafresh1 64*de8cc8edSafresh1eval { setlogsock({}) }; 65*de8cc8edSafresh1like( $@, qr/^setlogsock\(\): No argument given/, 66*de8cc8edSafresh1 "calling setlogsock() with an empty hash reference" ); 67*de8cc8edSafresh1 68*de8cc8edSafresh1BEGIN { $tests += 3 } 69*de8cc8edSafresh1# syslog() 70*de8cc8edSafresh1eval { syslog() }; 71*de8cc8edSafresh1like( $@, qr/^syslog: expecting argument \$priority/, 72*de8cc8edSafresh1 "calling syslog() with no argument" ); 73*de8cc8edSafresh1 74*de8cc8edSafresh1eval { syslog(undef) }; 75*de8cc8edSafresh1like( $@, qr/^syslog: expecting argument \$priority/, 76*de8cc8edSafresh1 "calling syslog() with one undef argument" ); 77*de8cc8edSafresh1 78*de8cc8edSafresh1eval { syslog('') }; 79*de8cc8edSafresh1like( $@, qr/^syslog: expecting argument \$format/, 80*de8cc8edSafresh1 "calling syslog() with one empty argument" ); 81*de8cc8edSafresh1 82*de8cc8edSafresh1 83*de8cc8edSafresh1my $test_string = "uid $< is testing Perl $] syslog(3) capabilities"; 84*de8cc8edSafresh1my $r = 0; 85*de8cc8edSafresh1 86*de8cc8edSafresh1BEGIN { $tests += 8 } 87*de8cc8edSafresh1# try to open a syslog using a Unix or stream socket 88*de8cc8edSafresh1SKIP: { 89*de8cc8edSafresh1 skip "can't connect to Unix socket: _PATH_LOG unavailable", 8 90*de8cc8edSafresh1 unless -e Sys::Syslog::_PATH_LOG(); 91*de8cc8edSafresh1 92*de8cc8edSafresh1 # The only known $^O eq 'svr4' that needs this is NCR MP-RAS, 93*de8cc8edSafresh1 # but assuming 'stream' in SVR4 is probably not that bad. 94*de8cc8edSafresh1 my $sock_type = $^O =~ /^(solaris|irix|svr4|powerux)$/ ? 'stream' : 'unix'; 95*de8cc8edSafresh1 96*de8cc8edSafresh1 eval { setlogsock($sock_type) }; 97*de8cc8edSafresh1 is( $@, '', "setlogsock() called with '$sock_type'" ); 98*de8cc8edSafresh1 TODO: { 99*de8cc8edSafresh1 local $TODO = "minor bug"; 100*de8cc8edSafresh1 SKIP: { skip "TODO $TODO", 1 if $] < 5.006002; 101*de8cc8edSafresh1 ok( $r, "setlogsock() should return true: '$r'" ); 102*de8cc8edSafresh1 } 103*de8cc8edSafresh1 } 104*de8cc8edSafresh1 105*de8cc8edSafresh1 106*de8cc8edSafresh1 # open syslog with a "local0" facility 107*de8cc8edSafresh1 SKIP: { 108*de8cc8edSafresh1 # openlog() 109*de8cc8edSafresh1 $r = eval { openlog('perl', 'ndelay', 'local0') } || 0; 110*de8cc8edSafresh1 skip "can't connect to syslog", 6 if $@ =~ /^no connection to syslog available/; 111*de8cc8edSafresh1 is( $@, '', "openlog() called with facility 'local0'" ); 112*de8cc8edSafresh1 ok( $r, "openlog() should return true: '$r'" ); 113*de8cc8edSafresh1 114*de8cc8edSafresh1 # syslog() 115*de8cc8edSafresh1 $r = eval { syslog('info', "$test_string by connecting to a $sock_type socket") } || 0; 116*de8cc8edSafresh1 is( $@, '', "syslog() called with level 'info'" ); 117*de8cc8edSafresh1 ok( $r, "syslog() should return true: '$r'" ); 118*de8cc8edSafresh1 119*de8cc8edSafresh1 # closelog() 120*de8cc8edSafresh1 $r = eval { closelog() } || 0; 121*de8cc8edSafresh1 is( $@, '', "closelog()" ); 122*de8cc8edSafresh1 ok( $r, "closelog() should return true: '$r'" ); 123*de8cc8edSafresh1 } 124*de8cc8edSafresh1} 125*de8cc8edSafresh1 126*de8cc8edSafresh1# try to open a syslog using all the available connection methods 127*de8cc8edSafresh1# handle other connections in t/syslog.t 128*de8cc8edSafresh1 129*de8cc8edSafresh1my @passed = (); 130*de8cc8edSafresh1 131*de8cc8edSafresh1BEGIN { $tests += 22 * 2 } 132*de8cc8edSafresh1for my $sock_type (qw(inet udp)) { 133*de8cc8edSafresh1 SKIP: { 134*de8cc8edSafresh1 skip "the 'stream' mechanism because a previous mechanism with similar interface succeeded", 22 135*de8cc8edSafresh1 if $sock_type eq 'stream' and grep {/pipe|unix/} @passed; 136*de8cc8edSafresh1 # setlogsock() called with an arrayref 137*de8cc8edSafresh1 $r = eval { setlogsock([$sock_type]) } || 0; 138*de8cc8edSafresh1 skip "can't use '$sock_type' socket", 22 unless $r; 139*de8cc8edSafresh1 is( $@, '', "[$sock_type] setlogsock() called with ['$sock_type']" ); 140*de8cc8edSafresh1 ok( $r, "[$sock_type] setlogsock() should return true: '$r'" ); 141*de8cc8edSafresh1 142*de8cc8edSafresh1 # setlogsock() called with a single argument 143*de8cc8edSafresh1 $r = eval { setlogsock($sock_type) } || 0; 144*de8cc8edSafresh1 skip "can't use '$sock_type' socket", 20 unless $r; 145*de8cc8edSafresh1 is( $@, '', "[$sock_type] setlogsock() called with '$sock_type'" ); 146*de8cc8edSafresh1 ok( $r, "[$sock_type] setlogsock() should return true: '$r'" ); 147*de8cc8edSafresh1 148*de8cc8edSafresh1 # openlog() without option NDELAY 149*de8cc8edSafresh1 $r = eval { openlog('perl', '', 'local0') } || 0; 150*de8cc8edSafresh1 skip "can't connect to syslog", 18 if $@ =~ /^no connection to syslog available/; 151*de8cc8edSafresh1 is( $@, '', "[$sock_type] openlog() called with facility 'local0' and without option 'ndelay'" ); 152*de8cc8edSafresh1 ok( $r, "[$sock_type] openlog() should return true: '$r'" ); 153*de8cc8edSafresh1 154*de8cc8edSafresh1 # openlog() with the option NDELAY 155*de8cc8edSafresh1 $r = eval { openlog('perl', 'ndelay', 'local0') } || 0; 156*de8cc8edSafresh1 skip "can't connect to syslog", 16 if $@ =~ /^no connection to syslog available/; 157*de8cc8edSafresh1 is( $@, '', "[$sock_type] openlog() called with facility 'local0' with option 'ndelay'" ); 158*de8cc8edSafresh1 ok( $r, "[$sock_type] openlog() should return true: '$r'" ); 159*de8cc8edSafresh1 160*de8cc8edSafresh1 # syslog() with negative level, should fail 161*de8cc8edSafresh1 $r = eval { syslog(-1, "$test_string by connecting to a $sock_type socket") } || 0; 162*de8cc8edSafresh1 like( $@, '/^syslog: invalid level\/facility: /', "[$sock_type] syslog() called with level -1" ); 163*de8cc8edSafresh1 ok( !$r, "[$sock_type] syslog() should return false: '$r'" ); 164*de8cc8edSafresh1 165*de8cc8edSafresh1 # syslog() with invalid level, should fail 166*de8cc8edSafresh1 $r = eval { syslog("plonk", "$test_string by connecting to a $sock_type socket") } || 0; 167*de8cc8edSafresh1 like( $@, '/^syslog: invalid level\/facility: /', "[$sock_type] syslog() called with level plonk" ); 168*de8cc8edSafresh1 ok( !$r, "[$sock_type] syslog() should return false: '$r'" ); 169*de8cc8edSafresh1 170*de8cc8edSafresh1 # syslog() with levels "info" and "notice" (as a strings), should fail 171*de8cc8edSafresh1 $r = eval { syslog('info,notice', "$test_string by connecting to a $sock_type socket") } || 0; 172*de8cc8edSafresh1 like( $@, '/^syslog: too many levels given: notice/', "[$sock_type] syslog() called with level 'info,notice'" ); 173*de8cc8edSafresh1 ok( !$r, "[$sock_type] syslog() should return false: '$r'" ); 174*de8cc8edSafresh1 175*de8cc8edSafresh1 # syslog() with facilities "local0" and "local1" (as a strings), should fail 176*de8cc8edSafresh1 $r = eval { syslog('local0,local1', "$test_string by connecting to a $sock_type socket") } || 0; 177*de8cc8edSafresh1 like( $@, '/^syslog: too many facilities given: local1/', "[$sock_type] syslog() called with level 'local0,local1'" ); 178*de8cc8edSafresh1 ok( !$r, "[$sock_type] syslog() should return false: '$r'" ); 179*de8cc8edSafresh1 180*de8cc8edSafresh1 # syslog() with level "info" (as a string), should pass 181*de8cc8edSafresh1 $r = eval { syslog('info', "$test_string by connecting to a $sock_type socket") } || 0; 182*de8cc8edSafresh1 is( $@, '', "[$sock_type] syslog() called with level 'info' (string)" ); 183*de8cc8edSafresh1 ok( $r, "[$sock_type] syslog() should return true: '$r'" ); 184*de8cc8edSafresh1 185*de8cc8edSafresh1 # syslog() with level "info" (as a macro), should pass 186*de8cc8edSafresh1 { local $! = 1; 187*de8cc8edSafresh1 $r = eval { syslog(LOG_INFO(), "$test_string by connecting to a $sock_type socket, setting a fake errno: %m") } || 0; 188*de8cc8edSafresh1 } 189*de8cc8edSafresh1 is( $@, '', "[$sock_type] syslog() called with level 'info' (macro)" ); 190*de8cc8edSafresh1 ok( $r, "[$sock_type] syslog() should return true: '$r'" ); 191*de8cc8edSafresh1 192*de8cc8edSafresh1 push @passed, $sock_type; 193*de8cc8edSafresh1 194*de8cc8edSafresh1 SKIP: { 195*de8cc8edSafresh1 skip "skipping closelog() tests for 'console'", 2 if $sock_type eq 'console'; 196*de8cc8edSafresh1 # closelog() 197*de8cc8edSafresh1 $r = eval { closelog() } || 0; 198*de8cc8edSafresh1 is( $@, '', "[$sock_type] closelog()" ); 199*de8cc8edSafresh1 ok( $r, "[$sock_type] closelog() should return true: '$r'" ); 200*de8cc8edSafresh1 } 201*de8cc8edSafresh1 } 202*de8cc8edSafresh1} 203*de8cc8edSafresh1 204*de8cc8edSafresh1 205*de8cc8edSafresh1 206