Mercurial > hg > nginx-tests
annotate userid.t @ 605:a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Tests might behave incorrectly due to the delay in writing to log.
Made tests stricter for different endianness. While here, improved style.
author | Andrey Zelenkov <zelenkov@nginx.com> |
---|---|
date | Thu, 11 Jun 2015 20:56:19 +0300 |
parents | b96c4739ca85 |
children | 0597ca82c26a |
rev | line source |
---|---|
604 | 1 #!/usr/bin/perl |
2 | |
3 # (C) Andrey Zelenkov | |
4 # (C) Nginx, Inc. | |
5 | |
6 # Tests for userid filter module. | |
7 | |
8 ############################################################################### | |
9 | |
10 use warnings; | |
11 use strict; | |
12 | |
13 use Test::More; | |
14 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
15 use Config; |
604 | 16 use MIME::Base64; |
17 use Time::Local; | |
18 | |
19 BEGIN { use FindBin; chdir($FindBin::Bin); } | |
20 | |
21 use lib 'lib'; | |
22 use Test::Nginx; | |
23 | |
24 ############################################################################### | |
25 | |
26 select STDERR; $| = 1; | |
27 select STDOUT; $| = 1; | |
28 | |
29 my $t = Test::Nginx->new()->has(qw/http userid map/)->plan(33); | |
30 | |
31 $t->write_file_expand('nginx.conf', <<'EOF'); | |
32 | |
33 %%TEST_GLOBALS%% | |
34 | |
35 daemon off; | |
36 | |
37 events { | |
38 } | |
39 | |
40 http { | |
41 %%TEST_GLOBALS_HTTP%% | |
42 | |
43 map $args $uid_reset { | |
44 default 0; | |
45 value 1; | |
46 log log; | |
47 } | |
48 | |
49 server { | |
50 listen 127.0.0.1:8080; | |
51 server_name localhost; | |
52 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
53 add_header X-Got $uid_got; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
54 add_header X-Reset $uid_reset; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
55 add_header X-Set $uid_set; |
604 | 56 userid on; |
57 | |
58 location / { | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
59 error_log %%TESTDIR%%/error_reset.log info; |
604 | 60 } |
61 | |
62 location /name { | |
63 userid_name test; | |
64 } | |
65 | |
66 location /path { | |
67 userid_path /0123456789; | |
68 | |
69 location /path/r { | |
70 userid_path /9876543210; | |
71 } | |
72 } | |
73 | |
74 location /domain { | |
75 userid_domain test.domain; | |
76 } | |
77 | |
78 location /mark_off { | |
79 userid_mark off; | |
80 } | |
81 location /mark_eq { | |
82 userid_mark =; | |
83 } | |
84 location /mark_let { | |
85 userid_mark t; | |
86 } | |
87 location /mark_num { | |
88 userid_mark 9; | |
89 } | |
90 | |
91 location /expires_time { | |
92 add_header X-Msec $msec; | |
93 userid_expires 100; | |
94 } | |
95 location /expires_max { | |
96 userid_expires max; | |
97 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
98 location /expires_max/off { |
604 | 99 userid_expires off; |
100 } | |
101 } | |
102 location /expires_off { | |
103 userid_expires off; | |
104 } | |
105 | |
106 location /p3p { | |
107 userid_p3p policyref="/w3c/p3p.xml"; | |
108 } | |
109 | |
110 location /service { | |
111 userid_service 65534; | |
112 } | |
113 | |
114 location /cv1 { | |
115 userid v1; | |
116 userid_mark t; | |
117 } | |
118 | |
119 location /clog { | |
120 userid log; | |
121 } | |
122 | |
123 location /coff { | |
124 userid off; | |
125 } | |
126 } | |
127 } | |
128 | |
129 EOF | |
130 | |
131 $t->write_file('index.html', ''); | |
132 $t->write_file('expires_time', ''); | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
133 $t->write_file('service', ''); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
134 $t->write_file('cv1', ''); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
135 $t->write_file('clog', ''); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
136 $t->write_file('coff', ''); |
604 | 137 $t->run(); |
138 | |
139 ############################################################################### | |
140 | |
141 # userid | |
142 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
143 like(http_get('/'), qr/Set-Cookie:/, 'cookie on'); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
144 like(http_get('/cv1'), qr/Set-Cookie:/, 'cookie v1'); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
145 unlike(http_get('/clog'), qr/Set-Cookie:/, 'cookie log'); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
146 unlike(http_get('/coff'), qr/Set-Cookie:/, 'cookie off'); |
604 | 147 |
148 # default | |
149 | |
150 my %cookie = get_cookie('/'); | |
151 isnt($cookie{'uid'}, undef, 'name default'); | |
152 is($cookie{'path'}, '/', 'path default'); | |
153 is($cookie{'domain'}, undef, 'domain default'); | |
154 is($cookie{'expires'}, undef, 'expires default'); | |
155 like($cookie{'uid'}, '/\w+={0,2}$/', 'mark default'); | |
156 unlike(http_get('/'), qr/P3P/, 'p3p default'); | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
157 like(http_get('/'), qr/X-Reset: 0/, 'uid reset variable default'); |
604 | 158 |
159 # name, path, domain and p3p | |
160 | |
161 isnt(get_cookie('/name', 'test'), undef, 'name'); | |
162 is(get_cookie('/path', 'path'), '/0123456789', 'path'); | |
163 is(get_cookie('/domain', 'domain'), 'test.domain', 'domain'); | |
164 like(http_get('/p3p'), qr!P3P: policyref="/w3c/p3p.xml"!, 'p3p'); | |
165 | |
166 # mark | |
167 | |
168 like(get_cookie('/mark_off', 'uid'), '/\w+={0,2}$/', 'mark off'); | |
169 like(get_cookie('/mark_eq', 'uid'), '/==$/', 'mark equal'); | |
170 like(get_cookie('/mark_let', 'uid'), '/t=$/', 'mark letter'); | |
171 like(get_cookie('/mark_num', 'uid'), '/9=$/', 'mark number'); | |
172 | |
173 # expires | |
174 | |
175 my $r = http_get('/expires_time'); | |
176 my ($t1) = $r =~ /X-Msec: (\d+)/; | |
177 is(expires2timegm(cookie($r, 'expires')), $t1 + 100, 'expires time'); | |
178 is(get_cookie('/expires_max', 'expires'), 'Thu, 31-Dec-37 23:55:55 GMT', | |
179 'expires max'); | |
180 is(get_cookie('/expires_off', 'expires'), undef, 'expires off'); | |
181 | |
182 # redefinition | |
183 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
184 unlike(http_get('/expires_max/off'), qr/expires/, 'redefine expires'); |
604 | 185 like(http_get('/path/r'), qr!/9876543210!, 'redefine path'); |
186 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
187 # requests |
604 | 188 |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
189 $r = http_get('/'); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
190 my ($uid) = uid_set($r); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
191 isnt($uid, undef, 'uid set variable'); |
604 | 192 |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
193 $r = send_uid('/', cookie($r, 'uid')); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
194 is(uid_got($r), $uid, 'uid got variable'); |
604 | 195 unlike($r, qr/Set-Cookie:/, 'same path request'); |
196 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
197 $r = send_uid('/coff', $uid); |
604 | 198 unlike($r, qr/Set-Cookie:/, 'other path request'); |
199 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
200 $r = send_uid('/?value', $uid); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
201 like($r, qr/Set-Cookie:/, 'uid reset variable value'); |
604 | 202 |
203 # service | |
204 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
205 is(substr(uid_set(http_get('/cv1')), 0, 8), '00000000', 'service default v1'); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
206 |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
207 my $bigendian = $Config{byteorder} eq '12345678' ? 0 : 1; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
208 my $addr = $bigendian ? "7F000001" : "0100007F"; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
209 is(substr(uid_set(http_get('/')), 0, 8), $addr, 'service default v2'); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
210 |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
211 $addr = $bigendian ? "0000FFFE" : "FEFF0000"; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
212 is(substr(uid_set(http_get('/service')), 0, 8), $addr, 'service custom'); |
604 | 213 |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
214 # reset log |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
215 |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
216 send_uid('/?log', cookie($r, 'uid')); |
604 | 217 |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
218 $t->stop(); |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
219 |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
220 like($t->read_file('error_reset.log'), |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
221 '/userid cookie "uid=\w+" was reset/m', 'uid reset variable log'); |
604 | 222 |
223 ############################################################################### | |
224 | |
225 sub cookie { | |
226 my ($r, $key) = @_; | |
227 my %cookie; | |
228 | |
229 $r =~ /(Set-Cookie:[^\x0d]*).*\x0d\x0a?\x0d/ms; | |
230 if ($1) { | |
231 %cookie = $1 =~ /(\w+)=([^;]+)/g; | |
232 } | |
233 | |
234 return $cookie{$key} if defined $key; | |
235 return %cookie; | |
236 } | |
237 | |
238 sub get_cookie { | |
239 my ($url, $key) = @_; | |
240 return cookie(http_get($url), $key); | |
241 } | |
242 | |
243 sub expires2timegm { | |
244 my ($e) = @_; | |
245 my %months = (Jan => 0, Feb => 1, Mar => 2, Apr => 3, May =>4, Jun => 5, | |
246 Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11); | |
247 | |
248 my ($w, $date, $time) = split(" ", $e); | |
249 my ($day, $month, $year) = split("-", $date); | |
250 my ($hour, $min, $sec) = split(":", $time); | |
251 | |
252 return timegm($sec, $min, $hour, $day, $months{$month}, $year); | |
253 } | |
254 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
255 sub uid_set { |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
256 my ($r) = @_; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
257 my ($uid) = $r =~ /X-Set: uid=(.*)\n/m; |
604 | 258 return $uid; |
259 } | |
260 | |
605
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
261 sub uid_got { |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
262 my ($r) = @_; |
a77f19282f63
Tests: switched to using headers to test variables in userid.t.
Andrey Zelenkov <zelenkov@nginx.com>
parents:
604
diff
changeset
|
263 my ($uid) = $r =~ /X-Got: uid=(.*)\n/m; |
604 | 264 return $uid; |
265 } | |
266 | |
267 sub send_uid { | |
268 my ($url, $uid) = @_; | |
269 return http(<<EOF); | |
270 GET $url HTTP/1.0 | |
271 Host: localhost | |
272 Cookie: uid=$uid | |
273 | |
274 EOF | |
275 } | |
276 | |
277 ############################################################################### |