4
%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
6
%% The contents of this file are subject to the Erlang Public License,
7
%% Version 1.1, (the "License"); you may not use this file except in
8
%% compliance with the License. You should have received a copy of the
9
%% Erlang Public License along with this software. If not, it can be
10
%% retrieved online at http://www.erlang.org/.
12
%% Software distributed under the License is distributed on an "AS IS"
13
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
%% the License for the specific language governing rights and limitations
22
-include("test_server.hrl").
23
-include("test_server_line.hrl").
25
%% General testcases bodies called from httpd_SUITE
26
-export([block_disturbing_idle/4, block_non_disturbing_idle/4,
27
block_503/4, block_disturbing_active/4,
28
block_non_disturbing_active/4,
29
block_disturbing_active_timeout_not_released/4,
30
block_disturbing_active_timeout_released/4,
31
block_non_disturbing_active_timeout_not_released/4,
32
block_non_disturbing_active_timeout_released/4,
33
disturbing_blocker_dies/4,
34
non_disturbing_blocker_dies/4, restart_no_block/4,
35
restart_disturbing_block/4, restart_non_disturbing_block/4
39
-export([httpd_block/3, httpd_block/4, httpd_unblock/2, httpd_restart/2]).
40
-export([do_block_server/4, do_block_nd_server/5, do_long_poll/6]).
42
-define(report(Label, Content),
43
inets:report_event(20, Label, test_case,
44
[{module, ?MODULE}, {line, ?LINE} | Content])).
47
%%-------------------------------------------------------------------------
48
%% Test cases starts here.
49
%%-------------------------------------------------------------------------
50
block_disturbing_idle(_Type, Port, Host, Node) ->
51
io:format("block_disturbing_idle -> entry~n", []),
52
validate_admin_state(Node, Host, Port, unblocked),
53
block_server(Node, Host, Port),
54
validate_admin_state(Node, Host, Port, blocked),
55
unblock_server(Node, Host, Port),
56
validate_admin_state(Node, Host, Port, unblocked),
57
io:format("block_disturbing_idle -> done~n", []),
60
%%--------------------------------------------------------------------
61
block_non_disturbing_idle(_Type, Port, Host, Node) ->
62
unblocked = get_admin_state(Node, Host, Port),
63
block_nd_server(Node, Host, Port),
64
blocked = get_admin_state(Node, Host, Port),
65
unblock_server(Node, Host, Port),
66
unblocked = get_admin_state(Node, Host, Port),
69
%%--------------------------------------------------------------------
70
block_503(Type, Port, Host, Node) ->
71
Req = "GET / HTTP/1.0\r\ndummy-host.ericsson.se:\r\n\r\n",
72
unblocked = get_admin_state(Node, Host, Port),
73
ok = httpd_test_lib:verify_request(Type, Host, Port, Node, Req,
75
{version, "HTTP/1.0"}]),
76
ok = block_server(Node, Host, Port),
77
blocked = get_admin_state(Node, Host, Port),
78
ok = httpd_test_lib:verify_request(Type, Host, Port, Node, Req,
80
{version, "HTTP/1.0"}]),
81
ok = unblock_server(Node, Host, Port),
82
unblocked = get_admin_state(Node, Host, Port),
83
ok = httpd_test_lib:verify_request(Type, Host, Port, Node, Req,
85
{version, "HTTP/1.0"}]).
87
%%--------------------------------------------------------------------
88
block_disturbing_active(Type, Port, Host, Node) ->
89
process_flag(trap_exit, true),
90
Pid = long_poll(Type, Host, Port, Node, 200, 60000),
91
test_server:sleep(15000),
92
block_server(Node, Host, Port),
93
await_suite_failed_process_exit(Pid, "poller", 60000,
95
blocked = get_admin_state(Node, Host, Port),
96
process_flag(trap_exit, false),
99
%%--------------------------------------------------------------------
100
block_non_disturbing_active(Type, Port, Host, Node) ->
101
process_flag(trap_exit, true),
102
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
103
test_server:sleep(15000),
104
ok = block_nd_server(Node, Host, Port),
105
await_normal_process_exit(Poller, "poller", 60000),
106
blocked = get_admin_state(Node, Host, Port),
107
process_flag(trap_exit, false),
110
%%--------------------------------------------------------------------
111
block_disturbing_active_timeout_not_released(Type, Port, Host, Node) ->
112
process_flag(trap_exit, true),
113
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
114
test_server:sleep(15000),
115
Blocker = blocker(Node, Host, Port, 50000),
116
await_normal_process_exit(Blocker, "blocker", 50000),
117
await_normal_process_exit(Poller, "poller", 30000),
118
blocked = get_admin_state(Node, Host, Port),
119
process_flag(trap_exit, false),
122
%%--------------------------------------------------------------------
123
block_disturbing_active_timeout_released(Type, Port, Host, Node) ->
124
process_flag(trap_exit, true),
125
Poller = long_poll(Type, Host, Port, Node, 200, 40000),
126
test_server:sleep(5000),
127
Blocker = blocker(Node, Host, Port, 10000),
128
await_normal_process_exit(Blocker, "blocker", 15000),
129
await_suite_failed_process_exit(Poller, "poller", 40000,
131
blocked = get_admin_state(Node, Host, Port),
132
process_flag(trap_exit, false),
134
%%--------------------------------------------------------------------
135
block_non_disturbing_active_timeout_not_released(Type, Port, Host, Node) ->
136
process_flag(trap_exit, true),
137
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
138
test_server:sleep(5000),
139
ok = block_nd_server(Node, Host, Port, 40000),
140
await_normal_process_exit(Poller, "poller", 60000),
141
blocked = get_admin_state(Node, Host, Port),
142
process_flag(trap_exit, false),
145
%%--------------------------------------------------------------------
146
block_non_disturbing_active_timeout_released(Type, Port, Host, Node) ->
147
process_flag(trap_exit, true),
148
Poller = long_poll(Type, Host, Port, Node, 200, 45000),
149
test_server:sleep(5000),
150
Blocker = blocker_nd(Node, Host, Port ,10000, {error,timeout}),
151
await_normal_process_exit(Blocker, "blocker", 15000),
152
await_normal_process_exit(Poller, "poller", 50000),
153
unblocked = get_admin_state(Node, Host, Port),
154
process_flag(trap_exit, false),
156
%%--------------------------------------------------------------------
157
disturbing_blocker_dies(Type, Port, Host, Node) ->
158
process_flag(trap_exit, true),
159
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
160
test_server:sleep(5000),
161
Blocker = blocker(Node, Host, Port, 10000),
162
test_server:sleep(5000),
163
exit(Blocker,simulate_blocker_crash),
164
await_normal_process_exit(Poller, "poller", 60000),
165
unblocked = get_admin_state(Node, Host, Port),
166
process_flag(trap_exit, false),
169
%%--------------------------------------------------------------------
170
non_disturbing_blocker_dies(Type, Port, Host, Node) ->
171
process_flag(trap_exit, true),
172
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
173
test_server:sleep(5000),
174
Blocker = blocker_nd(Node, Host, Port, 10000, ok),
175
test_server:sleep(5000),
176
exit(Blocker, simulate_blocker_crash),
177
await_normal_process_exit(Poller, "poller", 60000),
178
unblocked = get_admin_state(Node, Host, Port),
179
process_flag(trap_exit, false),
181
%%--------------------------------------------------------------------
182
restart_no_block(_, Port, Host, Node) ->
183
{error,_Reason} = restart_server(Node, Host, Port).
185
%%--------------------------------------------------------------------
186
restart_disturbing_block(_, Port, Host, Node) ->
187
?report("restart_disturbing_block - get_admin_state (unblocked)", []),
188
unblocked = get_admin_state(Node, Host, Port),
189
?report("restart_disturbing_block - block_server", []),
190
ok = block_server(Node, Host, Port),
191
?report("restart_disturbing_block - restart_server", []),
192
ok = restart_server(Node, Host, Port),
193
?report("restart_disturbing_block - unblock_server", []),
194
ok = unblock_server(Node, Host, Port),
195
?report("restart_disturbing_block - get_admin_state (unblocked)", []),
196
unblocked = get_admin_state(Node, Host, Port).
198
%%--------------------------------------------------------------------
199
restart_non_disturbing_block(_, Port, Host, Node) ->
200
?report("restart_non_disturbing_block - get_admin_state (unblocked)", []),
201
unblocked = get_admin_state(Node, Host, Port),
202
?report("restart_non_disturbing_block - block_nd_server", []),
203
ok = block_nd_server(Node, Host, Port),
204
?report("restart_non_disturbing_block - restart_server", []),
205
ok = restart_server(Node, Host, Port),
206
?report("restart_non_disturbing_block - unblock_server", []),
207
ok = unblock_server(Node, Host, Port),
208
?report("restart_non_disturbing_block - get_admin_state (unblocked)", []),
209
unblocked = get_admin_state(Node, Host, Port).
211
%%--------------------------------------------------------------------
212
%% Internal functions
213
%%--------------------------------------------------------------------
214
blocker(Node, Host, Port, Timeout) ->
215
spawn_link(?MODULE, do_block_server,[Node, Host, Port,Timeout]).
217
do_block_server(Node, Host, Port, Timeout) ->
218
ok = block_server(Node, Host, Port, Timeout),
221
blocker_nd(Node, Host, Port, Timeout, Reply) ->
222
spawn_link(?MODULE, do_block_nd_server,
223
[Node, Host, Port, Timeout, Reply]).
225
do_block_nd_server(Node, Host, Port, Timeout, Reply) ->
226
Reply = block_nd_server(Node, Host, Port, Timeout),
229
restart_server(Node, _Host, Port) ->
231
rpc:call(Node, ?MODULE, httpd_restart, [Addr, Port]).
234
block_server(Node, _Host, Port) ->
235
io:format("block_server -> entry~n", []),
237
rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, disturbing]).
240
block_server(Node, _Host, Port, Timeout) ->
242
rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, disturbing, Timeout]).
245
block_nd_server(Node, _Host, Port) ->
247
rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, non_disturbing]).
249
block_nd_server(Node, _Host, Port, Timeout) ->
251
rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, non_disturbing, Timeout]).
253
unblock_server(Node, _Host, Port) ->
254
io:format("~p:~p:block_server -> entry~n", [node(),self()]),
256
rpc:call(Node, ?MODULE, httpd_unblock, [Addr, Port]).
259
httpd_block(Addr, Port, Mode) ->
260
io:format("~p:~p:httpd_block -> entry~n", [node(),self()]),
261
Name = make_name(Addr, Port),
262
case whereis(Name) of
263
Pid when is_pid(Pid) ->
264
httpd_manager:block(Pid, Mode);
269
httpd_block(Addr, Port, Mode, Timeout) ->
270
Name = make_name(Addr, Port),
271
case whereis(Name) of
272
Pid when is_pid(Pid) ->
273
httpd_manager:block(Pid, Mode, Timeout);
278
httpd_unblock(Addr, Port) ->
279
io:format("~p:~p:httpd_unblock -> entry~n", [node(),self()]),
280
Name = make_name(Addr, Port),
281
case whereis(Name) of
282
Pid when is_pid(Pid) ->
283
httpd_manager:unblock(Pid);
288
httpd_restart(Addr, Port) ->
289
Name = make_name(Addr, Port),
290
case whereis(Name) of
291
Pid when is_pid(Pid) ->
292
httpd_manager:reload(Pid, undefined);
297
make_name(Addr, Port) ->
298
httpd_util:make_name("httpd", Addr, Port).
300
get_admin_state(Node, _Host, Port) ->
302
rpc:call(Node, httpd, get_admin_state, [Addr, Port]).
304
validate_admin_state(Node, Host, Port, Expect) ->
305
io:format("try validating server admin state: ~p~n", [Expect]),
306
case get_admin_state(Node, Host, Port) of
310
io:format("failed validating server admin state: ~p~n",
312
exit({unexpected_admin_state, Unexpected, Expect})
316
await_normal_process_exit(Pid, Name, Timeout) ->
318
{'EXIT', Pid, normal} ->
320
{'EXIT', Pid, Reason} ->
323
io_lib:format("expected normal exit, "
324
"unexpected exit of ~s process: ~p",
326
test_server:fail(Err)
328
test_server:fail("timeout while waiting for " ++ Name)
332
await_suite_failed_process_exit(Pid, Name, Timeout, Why) ->
334
{'EXIT', Pid, {suite_failed, Why}} ->
336
{'EXIT', Pid, Reason} ->
339
io_lib:format("expected connection_closed, "
340
"unexpected exit of ~s process: ~p",
342
test_server:fail(Err)
344
test_server:fail("timeout while waiting for " ++ Name)
347
long_poll(Type, Host, Port, Node, StatusCode, Timeout) ->
348
spawn_link(?MODULE, do_long_poll, [Type, Host, Port, Node,
349
StatusCode, Timeout]).
351
do_long_poll(Type, Host, Port, Node, StatusCode, Timeout) ->
352
Mod = "httpd_example",
354
Req = lists:flatten(io_lib:format("GET /eval?" ++ Mod ++ ":" ++ Func ++
355
"(~p) HTTP/1.0\r\n\r\n",[30000])),
356
case httpd_test_lib:verify_request(Type, Host, Port, Node, Req,
357
[{statuscode, StatusCode},
358
{version, "HTTP/1.0"}], Timeout) of
362
test_server:fail(Reason)