OSDN Git Service

4695f005682d673cf150e6735ce2ac60098e2f8e
[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 => 12;
9 use IO::Socket::INET;
10
11 L7lib::chdir();
12 L7lib::comment_out();
13 require './l7directord';
14 override();
15
16 #...............................................
17 # test start
18 #   - check_http
19 SKIP: {
20     my $port = 63334;
21     my $sock = create_sock($port);
22     skip 'cannot create socket', 1 if !$sock;
23     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
24     set_default();
25     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'GET'};
26     my $r = {url => "http://localhost:$port/", fail_counts => 0,
27              server => {ip => '127.0.0.1', port => $port }};
28     my $got = check_http($v, $r);
29     is $got, $main::SERVICE_UP, 'check_http - GET ok';
30     close_child($pid);
31     close $sock;
32 }
33 SKIP: {
34     my $port = 63334;
35     my $sock = create_sock($port);
36     skip 'cannot create socket', 1 if !$sock;
37     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
38     set_default();
39     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
40     my $r = {url => "http://localhost:$port/", fail_counts => 0,
41              server => {ip => '127.0.0.1', port => $port }};
42     my $got = check_http($v, $r);
43     is $got, $main::SERVICE_UP, 'check_http - HEAD ok';
44     close_child($pid);
45     close $sock;
46 }
47 {
48     set_default();
49     my $port = 63334;
50     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
51     my $r = {url => "http//localhost:$port/", fail_counts => 0,
52              server => {ip => '127.0.0.1', port => $port }};
53     my $got = check_http($v, $r);
54     is $got, $main::SERVICE_DOWN, 'check_http - URL error';
55 }
56 {
57     set_default();
58     my $port = 63334;
59     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
60     my $r = {url => "http://localhost:$port/", fail_counts => 0,
61              server => {ip => '127.0.0.1', port => $port }};
62     my $got = check_http($v, $r);
63     is $got, $main::SERVICE_DOWN, 'check_http - cannot connect';
64 }
65 SKIP: {
66     my $port = 63334;
67     my $sock = create_sock($port);
68     skip 'cannot create socket', 1 if !$sock;
69     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n", 2);
70     set_default();
71     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
72     my $r = {url => "http://localhost:$port/", fail_counts => 0,
73              server => {ip => '127.0.0.1', port => $port }};
74     my $got = check_http($v, $r);
75     is $got, $main::SERVICE_DOWN, 'check_http - timeout';
76     close_child($pid);
77     close $sock;
78 }
79 SKIP: {
80     my $port = 63334;
81     my $sock = create_sock($port);
82     skip 'cannot create socket', 1 if !$sock;
83     my $pid = prepare_child($sock, "HTTP/1.0 500 Internal Server Error\r\n\r\n");
84     set_default();
85     my $v = {negotiatetimeout => 1, service => 'http', httpmethod => 'HEAD'};
86     my $r = {url => "http://localhost:$port/", fail_counts => 0,
87              server => {ip => '127.0.0.1', port => $port }};
88     my $got = check_http($v, $r);
89     is $got, $main::SERVICE_DOWN, 'check_http - error response';
90     close_child($pid);
91     close $sock;
92 }
93 # https
94 TODO: {
95 #SKIP: {
96     todo_skip 'not ready https response', 1;
97     my $port = 63334;
98     my $sock = create_sock($port);
99     skip 'cannot create socket', 1 if !$sock;
100     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
101     set_default();
102     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'GET'};
103     my $r = {url => "https://localhost:$port/", fail_counts => 0,
104              server => {ip => '127.0.0.1', port => $port }};
105     my $got = check_http($v, $r);
106     is $got, $main::SERVICE_UP, 'check_http - GET ok (https)';
107     close_child($pid);
108     close $sock;
109 }
110 TODO: {
111 #SKIP: {
112     todo_skip 'not ready https response', 1;
113     my $port = 63334;
114     my $sock = create_sock($port);
115     skip 'cannot create socket', 1 if !$sock;
116     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n");
117     set_default();
118     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
119     my $r = {url => "https://localhost:$port/", fail_counts => 0,
120              server => {ip => '127.0.0.1', port => $port }};
121     my $got = check_http($v, $r);
122     is $got, $main::SERVICE_UP, 'check_http - HEAD ok (https)';
123     close_child($pid);
124     close $sock;
125 }
126 {
127     set_default();
128     my $port = 63334;
129     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
130     my $r = {url => "https//localhost:$port/", fail_counts => 0,
131              server => {ip => '127.0.0.1', port => $port }};
132     my $got = check_http($v, $r);
133     is $got, $main::SERVICE_DOWN, 'check_http - URL error (https)';
134 }
135 {
136     set_default();
137     my $port = 63334;
138     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
139     my $r = {url => "https://localhost:$port/", fail_counts => 0,
140              server => {ip => '127.0.0.1', port => $port }};
141     my $got = check_http($v, $r);
142     is $got, $main::SERVICE_DOWN, 'check_http - cannot connect (https)';
143 }
144 TODO: {
145 #SKIP: {
146     todo_skip 'not ready https response', 1;
147     my $port = 63334;
148     my $sock = create_sock($port);
149     skip 'cannot create socket', 1 if !$sock;
150     my $pid = prepare_child($sock, "HTTP/1.0 200 OK\r\n\r\n", 2);
151     set_default();
152     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
153     my $r = {url => "https://localhost:$port/", fail_counts => 0,
154              server => {ip => '127.0.0.1', port => $port }};
155     my $got = check_http($v, $r);
156     is $got, $main::SERVICE_DOWN, 'check_http - timeout (https)';
157     close_child($pid);
158     close $sock;
159 }
160 TODO: {
161 #SKIP: {
162     todo_skip 'not ready https response', 1;
163     my $port = 63334;
164     my $sock = create_sock($port);
165     skip 'cannot create socket', 1 if !$sock;
166     my $pid = prepare_child($sock, "HTTP/1.0 500 Internal Server Error\r\n\r\n");
167     set_default();
168     my $v = {negotiatetimeout => 1, service => 'https', httpmethod => 'HEAD'};
169     my $r = {url => "https://localhost:$port/", fail_counts => 0,
170              server => {ip => '127.0.0.1', port => $port }};
171     my $got = check_http($v, $r);
172     is $got, $main::SERVICE_DOWN, 'check_http - error response (https)';
173     close_child($pid);
174     close $sock;
175 }
176 # test end
177 #...............................................
178
179 L7lib::comment_in();
180
181 sub create_sock {
182     my $port = shift;
183     my $sock = IO::Socket::INET->new(
184         Listen => 5,
185         LocalAddr => 'localhost',
186         LocalPort => $port,
187         ReuseAddr => 1,
188         Proto => 'tcp');
189     return $sock;
190 }
191 sub prepare_child {
192     my $sock = shift;
193     my $res = shift;
194     my $sleep = shift;
195     my $pid = fork();
196     if ($pid == 0) {
197         my $s = $sock->accept;
198         <$s>;
199         if ($sleep) { sleep $sleep; }
200         print $s $res;
201         close $s;
202         exit;
203     }
204     return $pid;
205 }
206 sub close_child {
207     my $pid = shift;
208     kill 15, $pid;
209     waitpid $pid, 0;
210 }
211 sub set_default {
212 }
213 sub override {
214     *ld_log = \&__ld_log;
215     *get_status = \&__get_status;
216 }
217 sub __get_status {
218     return $main::SERVICE_UP;
219 }
220 sub __ld_log {
221 }