Mercurial > hg > nginx-tests
comparison mail_error_log.t @ 564:a1c93746570d
Tests: mail error_log tests.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Mon, 27 Apr 2015 17:18:10 +0300 |
parents | |
children | adbb9b5108aa |
comparison
equal
deleted
inserted
replaced
563:ca74dc9abd1a | 564:a1c93746570d |
---|---|
1 #!/usr/bin/perl | |
2 | |
3 # (C) Sergey Kandaurov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Tests for nginx mail imap module, error_log directive. | |
7 | |
8 ############################################################################### | |
9 | |
10 use warnings; | |
11 use strict; | |
12 | |
13 use Test::More; | |
14 | |
15 BEGIN { use FindBin; chdir($FindBin::Bin); } | |
16 | |
17 use lib 'lib'; | |
18 use Test::Nginx; | |
19 use Test::Nginx::IMAP; | |
20 | |
21 ############################################################################### | |
22 | |
23 select STDERR; $| = 1; | |
24 select STDOUT; $| = 1; | |
25 | |
26 plan(skip_all => 'win32') if $^O eq 'MSWin32'; | |
27 | |
28 my $t = Test::Nginx->new()->has(qw/mail imap http rewrite/) | |
29 ->run_daemon(\&Test::Nginx::IMAP::imap_test_daemon); | |
30 | |
31 plan(skip_all => 'no error_log') unless $t->has_version('1.9.0'); | |
32 | |
33 $t->plan(29)->write_file_expand('nginx.conf', <<'EOF'); | |
34 | |
35 %%TEST_GLOBALS%% | |
36 | |
37 error_log %%TESTDIR%%/e_glob.log info; | |
38 error_log %%TESTDIR%%/e_glob2.log info; | |
39 error_log syslog:server=127.0.0.1:8081 info; | |
40 | |
41 daemon off; | |
42 | |
43 events { | |
44 } | |
45 | |
46 mail { | |
47 auth_http http://127.0.0.1:8080/mail/auth; | |
48 | |
49 server { | |
50 listen 127.0.0.1:8143; | |
51 protocol imap; | |
52 | |
53 error_log %%TESTDIR%%/e_debug.log debug; | |
54 error_log %%TESTDIR%%/e_info.log info; | |
55 error_log syslog:server=127.0.0.1:8082 info; | |
56 error_log stderr info; | |
57 } | |
58 } | |
59 | |
60 http { | |
61 %%TEST_GLOBALS_HTTP%% | |
62 | |
63 server { | |
64 listen 127.0.0.1:8080; | |
65 server_name localhost; | |
66 | |
67 location = /mail/auth { | |
68 add_header Auth-Status OK; | |
69 add_header Auth-Server 127.0.0.1; | |
70 add_header Auth-Port 8144; | |
71 add_header Auth-Wait 1; | |
72 return 204; | |
73 } | |
74 } | |
75 } | |
76 | |
77 EOF | |
78 | |
79 open OLDERR, ">&", \*STDERR; | |
80 open STDERR, '>', $t->testdir() . '/stderr' or die "Can't reopen STDERR: $!"; | |
81 open my $stderr, '<', $t->testdir() . '/stderr' | |
82 or die "Can't open stderr file: $!"; | |
83 | |
84 $t->run_daemon(\&syslog_daemon, 8081, $t, 's_glob.log'); | |
85 $t->run_daemon(\&syslog_daemon, 8082, $t, 's_info.log'); | |
86 | |
87 $t->waitforfile($t->testdir . '/s_glob.log'); | |
88 $t->waitforfile($t->testdir . '/s_info.log'); | |
89 | |
90 $t->run(); | |
91 | |
92 open STDERR, ">&", \*OLDERR; | |
93 | |
94 ############################################################################### | |
95 | |
96 my $s = Test::Nginx::IMAP->new(); | |
97 $s->ok('greeting'); | |
98 | |
99 # error_log levels | |
100 | |
101 SKIP: { | |
102 skip "no --with-debug", 1 unless $t->has_module('--with-debug'); | |
103 | |
104 isnt(lines($t, 'e_debug.log', '[debug]'), 0, 'file debug in debug'); | |
105 | |
106 } | |
107 | |
108 isnt(lines($t, 'e_info.log', '[info]'), 0, 'file info in info'); | |
109 is(lines($t, 'e_info.log', '[debug]'), 0, 'file debug in info'); | |
110 isnt(lines($t, 'stderr', '[info]'), 0, 'stderr info in info'); | |
111 is(lines($t, 'stderr', '[debug]'), 0, 'stderr debug in info'); | |
112 | |
113 # multiple error_log | |
114 | |
115 like($t->read_file('e_glob.log'), qr!nginx/[.0-9]+!, 'error global'); | |
116 like($t->read_file('e_glob2.log'), qr!nginx/[.0-9]+!, 'error global 2'); | |
117 is_deeply(levels($t, 'e_glob.log'), levels($t, 'e_glob2.log'), | |
118 'multiple error global'); | |
119 | |
120 # syslog | |
121 | |
122 parse_syslog_message('syslog', $t->read_file('s_info.log')); | |
123 | |
124 is_deeply(levels($t, 's_glob.log'), levels($t, 'e_glob.log'), | |
125 'global syslog messages'); | |
126 is_deeply(levels($t, 's_info.log'), levels($t, 'e_info.log'), | |
127 'mail syslog messages'); | |
128 | |
129 ############################################################################### | |
130 | |
131 sub lines { | |
132 my ($t, $file, $pattern) = @_; | |
133 | |
134 if ($file eq 'stderr') { | |
135 return map { $_ =~ /\Q$pattern\E/ } (<$stderr>); | |
136 } | |
137 | |
138 my $path = $t->testdir() . '/' . $file; | |
139 open my $fh, '<', $path or return "$!"; | |
140 my $value = map { $_ =~ /\Q$pattern\E/ } (<$fh>); | |
141 close $fh; | |
142 return $value; | |
143 } | |
144 | |
145 sub levels { | |
146 my ($t, $file) = @_; | |
147 my %levels_hash; | |
148 | |
149 map { $levels_hash{$_}++; } ($t->read_file($file) =~ /(\[\w+\])/g); | |
150 | |
151 return \%levels_hash; | |
152 } | |
153 | |
154 sub parse_syslog_message { | |
155 my ($desc, $line) = @_; | |
156 | |
157 my @months = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', | |
158 'Sep', 'Oct', 'Nov', 'Dec'); | |
159 | |
160 my ($pri, $mon, $mday, $hour, $minute, $sec, $host, $tag, $msg) = | |
161 $line =~ /^<(\d{1,3})> # PRI | |
162 ([A-Z][a-z]{2})\s # mon | |
163 ([ \d]\d)\s(\d{2}):(\d{2}):(\d{2})\s # date | |
164 ([\S]*)\s # host | |
165 (\w{1,32}):\s # tag | |
166 (.*)/x; # MSG | |
167 | |
168 my $sev = $pri & 0x07; | |
169 my $fac = ($pri & 0x03f8) >> 3; | |
170 | |
171 ok(defined($pri), "$desc has PRI"); | |
172 ok($sev >= 0 && $sev <= 7, "$desc valid severity"); | |
173 ok($fac >= 0 && $fac < 24, "$desc valid facility"); | |
174 | |
175 ok(defined($mon), "$desc has month"); | |
176 ok((grep $mon, @months), "$desc valid month"); | |
177 | |
178 ok(defined($mday), "$desc has day"); | |
179 ok($mday <= 31, "$desc valid day"); | |
180 | |
181 ok(defined($hour), "$desc has hour"); | |
182 ok($hour < 24, "$desc valid hour"); | |
183 | |
184 ok(defined($minute), "$desc has minutes"); | |
185 ok($minute < 60, "$desc valid minutes"); | |
186 | |
187 ok(defined($sec), "$desc has seconds"); | |
188 ok($sec < 60, "$desc valid seconds"); | |
189 | |
190 ok(defined($host), "$desc has host"); | |
191 chomp(my $hostname = lc `hostname`); | |
192 is($host , $hostname, "$desc valid host"); | |
193 | |
194 ok(defined($tag), "$desc has tag"); | |
195 like($tag, qr'\w+', "$desc valid tag"); | |
196 | |
197 ok(length($msg) > 0, "$desc valid CONTENT"); | |
198 } | |
199 | |
200 ############################################################################### | |
201 | |
202 sub syslog_daemon { | |
203 my ($port, $t, $file) = @_; | |
204 | |
205 my $s = IO::Socket::INET->new( | |
206 Proto => 'udp', | |
207 LocalAddr => "127.0.0.1:$port" | |
208 ); | |
209 | |
210 open my $fh, '>', $t->testdir() . '/' . $file; | |
211 select $fh; $| = 1; | |
212 | |
213 while (1) { | |
214 my $buffer; | |
215 $s->recv($buffer, 4096); | |
216 print $fh $buffer . "\n"; | |
217 } | |
218 } | |
219 | |
220 ############################################################################### |