xref: /openbsd-src/gnu/usr.bin/perl/cpan/Sys-Syslog/t/syslog-inet-udp.t (revision de8cc8edbc71bd3e3bc7fbffa27ba0e564c37d8b)
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