~ubuntu-branches/ubuntu/trusty/erlang/trusty

« back to all changes in this revision

Viewing changes to lib/inets/test/httpd_block.erl

  • Committer: Bazaar Package Importer
  • Author(s): Clint Byrum
  • Date: 2011-05-05 15:48:43 UTC
  • mfrom: (3.5.13 sid)
  • Revision ID: james.westby@ubuntu.com-20110505154843-0om6ekzg6m7ugj27
Tags: 1:14.b.2-dfsg-3ubuntu1
* Merge from debian unstable.  Remaining changes:
  - Drop libwxgtk2.8-dev build dependency. Wx isn't in main, and not
    supposed to.
  - Drop erlang-wx binary.
  - Drop erlang-wx dependency from -megaco, -common-test, and -reltool, they
    do not really need wx. Also drop it from -debugger; the GUI needs wx,
    but it apparently has CLI bits as well, and is also needed by -megaco,
    so let's keep the package for now.
  - debian/patches/series: Do what I meant, and enable build-options.patch
    instead.
* Additional changes:
  - Drop erlang-wx from -et
* Dropped Changes:
  - patches/pcre-crash.patch: CVE-2008-2371: outer level option with
    alternatives caused crash. (Applied Upstream)
  - fix for ssl certificate verification in newSSL: 
    ssl_cacertfile_fix.patch (Applied Upstream)
  - debian/patches/series: Enable native.patch again, to get stripped beam
    files and reduce the package size again. (build-options is what
    actually accomplished this)
  - Remove build-options.patch on advice from upstream and because it caused
    odd build failures.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
%%
 
2
%% %CopyrightBegin%
 
3
%%
 
4
%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
 
5
%%
 
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/.
 
11
%%
 
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
 
15
%% under the License.
 
16
%%
 
17
%% %CopyrightEnd%
 
18
%%
 
19
%%
 
20
-module(httpd_block).
 
21
 
 
22
-include("test_server.hrl").
 
23
-include("test_server_line.hrl").
 
24
 
 
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
 
36
        ]).
 
37
 
 
38
%% Help functions 
 
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]).
 
41
 
 
42
-define(report(Label, Content), 
 
43
        inets:report_event(20, Label, test_case, 
 
44
                           [{module, ?MODULE}, {line, ?LINE} | Content])).
 
45
 
 
46
 
 
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", []),
 
58
    ok.
 
59
 
 
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),
 
67
    ok.
 
68
 
 
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, 
 
74
                                  [{statuscode, 200},
 
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,  
 
79
                                  [{statuscode, 503},
 
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, 
 
84
                                  [{statuscode, 200},
 
85
                                   {version, "HTTP/1.0"}]).
 
86
 
 
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,
 
94
                                    connection_closed),
 
95
    blocked = get_admin_state(Node, Host, Port),
 
96
    process_flag(trap_exit, false),
 
97
    ok.
 
98
 
 
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),
 
108
    ok.
 
109
 
 
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),
 
120
    ok.
 
121
 
 
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, 
 
130
                                          connection_closed),
 
131
    blocked = get_admin_state(Node, Host, Port),
 
132
    process_flag(trap_exit, false),
 
133
    ok.
 
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),
 
143
    ok.
 
144
 
 
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),
 
155
    ok.
 
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),
 
167
    ok.
 
168
 
 
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),
 
180
    ok.
 
181
%%--------------------------------------------------------------------
 
182
restart_no_block(_, Port, Host, Node) ->
 
183
    {error,_Reason} = restart_server(Node, Host, Port).
 
184
 
 
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).
 
197
 
 
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).
 
210
 
 
211
%%--------------------------------------------------------------------
 
212
%% Internal functions
 
213
%%--------------------------------------------------------------------
 
214
blocker(Node, Host, Port, Timeout) ->
 
215
    spawn_link(?MODULE, do_block_server,[Node, Host, Port,Timeout]).
 
216
 
 
217
do_block_server(Node, Host, Port, Timeout) ->
 
218
    ok = block_server(Node, Host, Port, Timeout),
 
219
    exit(normal).
 
220
 
 
221
blocker_nd(Node, Host, Port, Timeout, Reply) ->
 
222
    spawn_link(?MODULE, do_block_nd_server,
 
223
               [Node, Host, Port, Timeout, Reply]).
 
224
 
 
225
do_block_nd_server(Node, Host, Port, Timeout, Reply) ->
 
226
    Reply = block_nd_server(Node, Host, Port, Timeout),
 
227
    exit(normal).
 
228
 
 
229
restart_server(Node, _Host, Port) ->
 
230
    Addr = undefined, 
 
231
    rpc:call(Node, ?MODULE, httpd_restart, [Addr, Port]).
 
232
 
 
233
 
 
234
block_server(Node, _Host,  Port) ->
 
235
    io:format("block_server -> entry~n", []),    
 
236
    Addr = undefined, 
 
237
    rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, disturbing]).
 
238
 
 
239
 
 
240
block_server(Node, _Host, Port, Timeout) ->
 
241
    Addr = undefined, 
 
242
    rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, disturbing, Timeout]).
 
243
 
 
244
 
 
245
block_nd_server(Node, _Host, Port) ->
 
246
    Addr = undefined, 
 
247
    rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, non_disturbing]).
 
248
 
 
249
block_nd_server(Node, _Host, Port, Timeout) ->
 
250
    Addr = undefined, 
 
251
    rpc:call(Node, ?MODULE, httpd_block, [Addr, Port, non_disturbing, Timeout]).
 
252
 
 
253
unblock_server(Node, _Host, Port) ->
 
254
    io:format("~p:~p:block_server -> entry~n", [node(),self()]),    
 
255
    Addr = undefined, 
 
256
    rpc:call(Node, ?MODULE, httpd_unblock, [Addr, Port]).
 
257
 
 
258
 
 
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);
 
265
        _ ->
 
266
            {error, not_started}
 
267
    end.
 
268
    
 
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);
 
274
        _ ->
 
275
            {error, not_started}
 
276
    end.
 
277
    
 
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);
 
284
        _ ->
 
285
            {error, not_started}
 
286
    end.
 
287
    
 
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);
 
293
        _ ->
 
294
            {error, not_started}
 
295
    end.
 
296
    
 
297
make_name(Addr, Port) ->
 
298
    httpd_util:make_name("httpd", Addr, Port).
 
299
 
 
300
get_admin_state(Node, _Host, Port) ->
 
301
    Addr = undefined, 
 
302
    rpc:call(Node, httpd, get_admin_state, [Addr, Port]).
 
303
 
 
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
 
307
        Expect ->
 
308
            ok;
 
309
        Unexpected ->
 
310
            io:format("failed validating server admin state: ~p~n", 
 
311
                      [Unexpected]),
 
312
            exit({unexpected_admin_state, Unexpected, Expect})
 
313
    end.
 
314
 
 
315
 
 
316
await_normal_process_exit(Pid, Name, Timeout) ->
 
317
    receive
 
318
        {'EXIT', Pid, normal} ->
 
319
            ok;
 
320
        {'EXIT', Pid, Reason} ->
 
321
            Err = 
 
322
                lists:flatten(
 
323
                  io_lib:format("expected normal exit, "
 
324
                                "unexpected exit of ~s process: ~p",
 
325
                                [Name, Reason])),
 
326
            test_server:fail(Err)
 
327
    after Timeout ->
 
328
           test_server:fail("timeout while waiting for " ++ Name)
 
329
    end.
 
330
 
 
331
 
 
332
await_suite_failed_process_exit(Pid, Name, Timeout, Why) ->
 
333
    receive 
 
334
        {'EXIT', Pid, {suite_failed, Why}} ->
 
335
            ok;
 
336
        {'EXIT', Pid, Reason} ->
 
337
            Err = 
 
338
                lists:flatten(
 
339
                  io_lib:format("expected connection_closed, "
 
340
                                "unexpected exit of ~s process: ~p",
 
341
                                [Name, Reason])),
 
342
            test_server:fail(Err)
 
343
    after Timeout ->
 
344
            test_server:fail("timeout while waiting for " ++ Name)
 
345
    end.
 
346
          
 
347
long_poll(Type, Host, Port, Node, StatusCode, Timeout) ->
 
348
    spawn_link(?MODULE, do_long_poll, [Type, Host, Port, Node, 
 
349
                                       StatusCode, Timeout]).
 
350
 
 
351
do_long_poll(Type, Host, Port, Node, StatusCode, Timeout) ->
 
352
    Mod  = "httpd_example",
 
353
    Func = "delay",
 
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
 
359
        ok ->
 
360
            exit(normal);
 
361
        Reason ->
 
362
            test_server:fail(Reason)
 
363
    end.
 
364
 
 
365
 
 
366
 
 
367
 
 
368