OSDN Git Service

2009/12/13 一時更新
[ultramonkey-l7/ultramonkey-l7-v3.git] / l7directord / t / 17_http.t
1 use strict;
2 use warnings;
3 no warnings qw(redefine once);
4 use lib qw(t/lib lib);
5 use subs qw(print);
6 use Cwd;
7 use L7lib;
8 use Test::More tests => 23;
9 use IO::Socket::INET;
10 use Socket;
11 use Socket6;
12
13 L7lib::chdir();
14 L7lib::comment_out();
15 require './l7directord';
16 override();
17
18 #...............................................
19 # test start
20 #   - check_http
21 SKIP: {
22     my $port = 63334;
23     my $sock = create_sock($port);
24     skip 'cannot create socket', 1 if !$sock;
25     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
26     set_default();
27     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'GET'};
28     my $r = {url => "http://localhost:$port/", fail_counts => 0,
29              server => {ip => '127.0.0.1', port => $port }};
30     my $got = check_http($v, $r);
31     is $got, $main::SERVICE_UP, 'check_http - GET ok';
32     close_child($pid);
33     close $sock;
34 }
35 SKIP: {
36     my $port = 63334;
37     my $sock = create_sock($port);
38     skip 'cannot create socket', 1 if !$sock;
39     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
40     set_default();
41     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
42     my $r = {url => "http://localhost:$port/", fail_counts => 0,
43              server => {ip => '127.0.0.1', port => $port }};
44     my $got = check_http($v, $r);
45     is $got, $main::SERVICE_UP, 'check_http - HEAD ok';
46     close_child($pid);
47     close $sock;
48 }
49 {
50     set_default();
51     my $port = 63334;
52     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
53     my $r = {url => "http//localhost:$port/", fail_counts => 0,
54              server => {ip => '127.0.0.1', port => $port }};
55     my $got = check_http($v, $r);
56     is $got, $main::SERVICE_DOWN, 'check_http - URL error';
57 }
58 {
59     set_default();
60     my $port = 63334;
61     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
62     my $r = {url => "http://localhost:$port/", fail_counts => 0,
63              server => {ip => '127.0.0.1', port => $port }};
64     my $got = check_http($v, $r);
65     is $got, $main::SERVICE_DOWN, 'check_http - cannot connect';
66 }
67 SKIP: {
68     my $port = 63334;
69     my $sock = create_sock($port);
70     skip 'cannot create socket', 1 if !$sock;
71     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n", 2);
72     set_default();
73     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
74     my $r = {url => "http://localhost:$port/", fail_counts => 0,
75              server => {ip => '127.0.0.1', port => $port }};
76     my $got = check_http($v, $r);
77     is $got, $main::SERVICE_DOWN, 'check_http - timeout';
78     close_child($pid);
79     close $sock;
80 }
81 SKIP: {
82     my $port = 63334;
83     my $sock = create_sock($port);
84     skip 'cannot create socket', 1 if !$sock;
85     my $pid = prepare_child($sock, "HTTP/1.0 500 Internal Server Error\r\n\r\n");
86     set_default();
87     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
88     my $r = {url => "http://localhost:$port/", fail_counts => 0,
89              server => {ip => '127.0.0.1', port => $port }};
90     my $got = check_http($v, $r);
91     is $got, $main::SERVICE_DOWN, 'check_http - error response';
92     close_child($pid);
93     close $sock;
94 }
95 # https
96 TODO: {
97 #SKIP: {
98     todo_skip 'not ready https response', 1;
99     my $port = 63334;
100     my $sock = create_sock($port);
101     skip 'cannot create socket', 1 if !$sock;
102     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
103     set_default();
104     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'GET'};
105     my $r = {url => "https://localhost:$port/", fail_counts => 0,
106              server => {ip => '127.0.0.1', port => $port }};
107     my $got = check_http($v, $r);
108     is $got, $main::SERVICE_UP, 'check_http - GET ok (https)';
109     close_child($pid);
110     close $sock;
111 }
112 TODO: {
113 #SKIP: {
114     todo_skip 'not ready https response', 1;
115     my $port = 63334;
116     my $sock = create_sock($port);
117     skip 'cannot create socket', 1 if !$sock;
118     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
119     set_default();
120     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
121     my $r = {url => "https://localhost:$port/", fail_counts => 0,
122              server => {ip => '127.0.0.1', port => $port }};
123     my $got = check_http($v, $r);
124     is $got, $main::SERVICE_UP, 'check_http - HEAD ok (https)';
125     close_child($pid);
126     close $sock;
127 }
128 {
129     set_default();
130     my $port = 63334;
131     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
132     my $r = {url => "https//localhost:$port/", fail_counts => 0,
133              server => {ip => '127.0.0.1', port => $port }};
134     my $got = check_http($v, $r);
135     is $got, $main::SERVICE_DOWN, 'check_http - URL error (https)';
136 }
137 {
138     set_default();
139     my $port = 63334;
140     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
141     my $r = {url => "https://localhost:$port/", fail_counts => 0,
142              server => {ip => '127.0.0.1', port => $port }};
143     my $got = check_http($v, $r);
144     is $got, $main::SERVICE_DOWN, 'check_http - cannot connect (https)';
145 }
146 TODO: {
147 #SKIP: {
148     todo_skip 'not ready https response', 1;
149     my $port = 63334;
150     my $sock = create_sock($port);
151     skip 'cannot create socket', 1 if !$sock;
152     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n", 2);
153     set_default();
154     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
155     my $r = {url => "https://localhost:$port/", fail_counts => 0,
156              server => {ip => '127.0.0.1', port => $port }};
157     my $got = check_http($v, $r);
158     is $got, $main::SERVICE_DOWN, 'check_http - timeout (https)';
159     close_child($pid);
160     close $sock;
161 }
162 TODO: {
163 #SKIP: {
164     todo_skip 'not ready https response', 1;
165     my $port = 63334;
166     my $sock = create_sock($port);
167     skip 'cannot create socket', 1 if !$sock;
168     my $pid = prepare_child($sock, "HTTP/1.0 500 Internal Server Error\r\n\r\n");
169     set_default();
170     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
171     my $r = {url => "https://localhost:$port/", fail_counts => 0,
172              server => {ip => '127.0.0.1', port => $port }};
173     my $got = check_http($v, $r);
174     is $got, $main::SERVICE_DOWN, 'check_http - error response (https)';
175     close_child($pid);
176     close $sock;
177 }
178 #############################################################################
179 ### IPv6 Test
180 SKIP: {
181     my $port = 63334;
182     my $sock = create_sock6($port);
183     skip 'cannot create socket6', 1 if !$sock;
184     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
185     set_default();
186     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'GET'};
187     my $r = {url => "http://localhost:$port/", fail_counts => 0,
188              server => {ip => '[::1]', port => $port }};
189     my $got = check_http($v, $r);
190     is $got, $main::SERVICE_UP, 'check_http IPv6 - GET ok';
191     close_child($pid);
192     close $sock;
193 }
194 SKIP: {
195     my $port = 63334;
196     my $sock = create_sock6($port);
197     skip 'cannot create socket6', 1 if !$sock;
198     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
199     set_default();
200     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
201     my $r = {url => "http://localhost:$port/", fail_counts => 0,
202              server => {ip => '[::1]', port => $port }};
203     my $got = check_http($v, $r);
204     is $got, $main::SERVICE_UP, 'check_http IPv6 - HEAD ok';
205     close_child($pid);
206     close $sock;
207 }
208 {
209     set_default();
210     my $port = 63334;
211     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
212     my $r = {url => "http//localhost:$port/", fail_counts => 0,
213              server => {ip => '[::1]', port => $port }};
214     my $got = check_http($v, $r);
215     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - URL error';
216 }
217 {
218     set_default();
219     my $port = 63334;
220     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
221     my $r = {url => "http://localhost:$port/", fail_counts => 0,
222              server => {ip => '[::1]', port => $port }};
223     my $got = check_http($v, $r);
224     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - cannot connect';
225 }
226 SKIP: {
227     my $port = 63334;
228     my $sock = create_sock6($port);
229     skip 'cannot create socket6', 1 if !$sock;
230     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n", 2);
231     set_default();
232     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
233     my $r = {url => "http://localhost:$port/", fail_counts => 0,
234              server => {ip => '[::1]', port => $port }};
235     my $got = check_http($v, $r);
236     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - timeout';
237     close_child($pid);
238     close $sock;
239 }
240 SKIP: {
241     my $port = 63334;
242     my $sock = create_sock6($port);
243     skip 'cannot create socket6', 1 if !$sock;
244     my $pid = prepare_child($sock, "HTTP/1.0 500 Internal Server Error\r\n\r\n");
245     set_default();
246     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
247     my $r = {url => "http://localhost:$port/", fail_counts => 0,
248              server => {ip => '[::1]', port => $port }};
249     my $got = check_http($v, $r);
250     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - error response';
251     close_child($pid);
252     close $sock;
253 }
254 # https
255 TODO: {
256 #SKIP: {
257     todo_skip 'not ready https response', 1;
258     my $port = 63334;
259     my $sock = create_sock6($port);
260     skip 'cannot create socket6', 1 if !$sock;
261     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
262     set_default();
263     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'GET'};
264     my $r = {url => "https://localhost:$port/", fail_counts => 0,
265              server => {ip => '[::1]', port => $port }};
266     my $got = check_http($v, $r);
267     is $got, $main::SERVICE_UP, 'check_http IPv6 - GET ok (https)';
268     close_child($pid);
269     close $sock;
270 }
271 TODO: {
272 #SKIP: {
273     todo_skip 'not ready https response', 1;
274     my $port = 63334;
275     my $sock = create_sock6($port);
276     skip 'cannot create socket6', 1 if !$sock;
277     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
278     set_default();
279     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
280     my $r = {url => "https://localhost:$port/", fail_counts => 0,
281              server => {ip => '[::1]', port => $port }};
282     my $got = check_http($v, $r);
283     is $got, $main::SERVICE_UP, 'check_http IPv6 - HEAD ok (https)';
284     close_child($pid);
285     close $sock;
286 }
287 {
288     set_default();
289     my $port = 63334;
290     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
291     my $r = {url => "https//localhost:$port/", fail_counts => 0,
292              server => {ip => '[::1]', port => $port }};
293     my $got = check_http($v, $r);
294     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - URL error (https)';
295 }
296 {
297     set_default();
298     my $port = 63334;
299     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
300     my $r = {url => "https://localhost:$port/", fail_counts => 0,
301              server => {ip => '[::1]', port => $port }};
302     my $got = check_http($v, $r);
303     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - cannot connect (https)';
304 }
305 TODO: {
306 #SKIP: {
307     todo_skip 'not ready https response', 1;
308     my $port = 63334;
309     my $sock = create_sock6($port);
310     skip 'cannot create socket6', 1 if !$sock;
311     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n", 2);
312     set_default();
313     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
314     my $r = {url => "https://localhost:$port/", fail_counts => 0,
315              server => {ip => '127.0.0.1', port => $port }};
316     my $got = check_http($v, $r);
317     is $got, $main::SERVICE_DOWN, 'check_http IPv6 - timeout (https)';
318     close_child($pid);
319     close $sock;
320 }
321
322 # test end
323 #...............................................
324
325 L7lib::comment_in();
326
327 sub create_sock {
328     my $port = shift;
329     my $sock = IO::Socket::INET->new(
330         Listen => 5,
331         LocalAddr => 'localhost',
332         LocalPort => $port,
333         ReuseAddr => 1,
334         Proto => 'tcp');
335     return $sock;
336 }
337 sub create_sock6 {
338     my $port = shift;
339     my $sock = IO::Socket::INET->new(
340         Listen => 5,
341         LocalAddr => '::1',
342         LocalPort => $port,
343         ReuseAddr => 1,
344         Proto => 'tcp');
345     return $sock;
346 }
347 sub prepare_child {
348     my $sock = shift;
349     my $res = shift;
350     my $sleep = shift;
351     my $pid = fork();
352     if ($pid == 0) {
353         my $s = $sock->accept;
354         <$s>;
355         if ($sleep) { sleep $sleep; }
356         print $s $res;
357         close $s;
358         exit;
359     }
360     return $pid;
361 }
362 sub close_child {
363     my $pid = shift;
364     kill 15, $pid;
365     waitpid $pid, 0;
366 }
367 sub set_default {
368 }
369 sub override {
370     *ld_log = \&__ld_log;
371     *get_status = \&__get_status;
372 }
373 sub __get_status {
374     return $main::SERVICE_UP;
375 }
376 sub __ld_log {
377 }