54
58
t() -> megaco_test_lib:t(?MODULE).
55
59
t(Case) -> megaco_test_lib:t({?MODULE, Case}).
61
min(M) -> timer:minutes(M).
58
63
%% Test server callbacks
64
init_per_testcase(single_user_medium_load = Case, Config) ->
65
C = lists:keydelete(tc_timeout, 1, Config),
66
do_init_per_testcase(Case, [{tc_timeout, min(5)}|C]);
59
67
init_per_testcase(single_user_heavy_load = Case, Config) ->
60
process_flag(trap_exit, true),
61
68
C = lists:keydelete(tc_timeout, 1, Config),
62
megaco_test_lib:init_per_testcase(Case, [{tc_timeout,timer:minutes(10)}|C]);
69
do_init_per_testcase(Case, [{tc_timeout, min(10)}|C]);
63
70
init_per_testcase(single_user_extreme_load = Case, Config) ->
64
process_flag(trap_exit, true),
65
C = lists:keydelete(tc_timeout, 1, Config),
66
megaco_test_lib:init_per_testcase(Case, [{tc_timeout,timer:minutes(20)}|C]);
71
C = lists:keydelete(tc_timeout, 1, Config),
72
do_init_per_testcase(Case, [{tc_timeout, min(20)}|C]);
73
init_per_testcase(multi_user_medium_load = Case, Config) ->
74
C = lists:keydelete(tc_timeout, 1, Config),
75
do_init_per_testcase(Case, [{tc_timeout, min(5)}|C]);
76
init_per_testcase(multi_user_heavy_load = Case, Config) ->
77
C = lists:keydelete(tc_timeout, 1, Config),
78
do_init_per_testcase(Case, [{tc_timeout, min(10)}|C]);
79
init_per_testcase(multi_user_extreme_load = Case, Config) ->
80
C = lists:keydelete(tc_timeout, 1, Config),
81
do_init_per_testcase(Case, [{tc_timeout, min(20)}|C]);
67
82
init_per_testcase(Case, Config) ->
83
do_init_per_testcase(Case, Config).
85
do_init_per_testcase(Case, Config) ->
68
86
process_flag(trap_exit, true),
69
87
megaco_test_lib:init_per_testcase(Case, Config).
71
89
fin_per_testcase(Case, Config) ->
72
90
process_flag(trap_exit, false),
73
91
megaco_test_lib:fin_per_testcase(Case, Config).
75
94
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80
single_user_light_load,
81
single_user_medium_load,
82
single_user_heavy_load,
83
single_user_extreme_load,
84
multi_user_light_load,
85
multi_user_medium_load,
86
multi_user_heavy_load,
87
multi_user_extreme_load
99
single_user_light_load,
100
single_user_medium_load,
101
single_user_heavy_load,
102
single_user_extreme_load,
103
multi_user_light_load,
104
multi_user_medium_load,
105
multi_user_heavy_load,
106
multi_user_extreme_load
91
111
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
337
do_multi_load(Pids, NumLoaders, NumReqs) ->
338
Fun = fun(P) -> P ! {apply_multi_load, self()} end,
381
do_multi_load(Pids, _NumLoaders, _NumReqs) ->
382
Fun = fun({P,_}) -> P ! {apply_multi_load, self()} end,
339
383
lists:foreach(Fun, Pids),
340
384
await_multi_load_collectors(Pids, [], []).
342
386
multi_load_collector_start([], _NumLoaders, _NumReqs, Pids) ->
344
388
multi_load_collector_start([{Mid, Node}|MGs], NumLoaders, NumReqs, Pids) ->
345
390
Pid = spawn_link(?MODULE, multi_load_collector,
346
[self(), Node, Mid, NumLoaders, NumReqs]),
347
multi_load_collector_start(MGs, NumLoaders, NumReqs, [Pid|Pids]).
350
multi_load_collector(Parent, Node, Mid, NumLoaders, NumReqs) ->
391
[self(), Node, Mid, NumLoaders, NumReqs, Env]),
392
multi_load_collector_start(MGs, NumLoaders, NumReqs, [{Pid,Mid}|Pids]).
395
case lists:keysearch(Key, 1, Env) of
396
{value, {Key, Val}} ->
402
multi_load_collector(Parent, Node, Mid, NumLoaders, NumReqs, Env) ->
403
put(verbosity, get_env(verbosity, Env)),
404
put(tc, get_env(tc, Env)),
405
put(sname, get_env(sname, Env) ++ "-loader"),
351
406
case ?MG_START(Node, Mid, text, tcp, [], ?MG_VERBOSITY) of
353
408
d("MG ~p user info: ~n~p", [Mid, ?MG_USER_INFO(Pid,all)]),
354
409
ServChRes = ?MG_SERV_CHANGE(Pid),
355
410
d("service change result: ~p", [ServChRes]),
411
megaco_test_mg:update_conn_info(Pid,reply_timer,1000),
356
412
d("MG ~p conn info: ~p", [Mid, ?MG_CONN_INFO(Pid,all)]),
357
413
multi_load_collector_loop(Parent, Pid, Mid, NumLoaders, NumReqs);
359
415
Parent ! {load_start_failed, self(), Mid, Else}
362
multi_load_collector_loop(Perent, Pid, Mid, NumLoaders, NumReqs) ->
418
multi_load_collector_loop(Parent, Pid, Mid, NumLoaders, NumReqs) ->
364
420
{apply_multi_load, Parent} ->
365
421
Res = ?MG_LOAD(Pid, NumLoaders, NumReqs),
366
422
Parent ! {load_complete, self(), Mid, Res},
423
?MG_SET_VERBOSITY(Pid, debug),
372
429
await_multi_load_collectors([], Oks, Errs) ->
430
i("await_multi_load_collectors -> done"),
374
432
await_multi_load_collectors(Pids, Oks, Errs) ->
376
434
{load_complete, Pid, Mg, {ok, Ok, Err}} ->
377
Pids2 = lists:delete(Pid, Pids),
435
i("await_multi_load_collectors -> "
436
"received ok complete from "
437
"~n ~p [~p]", [Pid, Mg]),
438
Pids2 = lists:keydelete(Pid, 1, Pids),
378
439
Oks2 = [{Mg, Ok, Err}|Oks],
379
440
await_multi_load_collectors(Pids2, Oks2, Errs);
380
441
{load_complete, Pid, Mg, Error} ->
381
Pids2 = lists:delete(Pid, Pids),
442
i("await_multi_load_collectors -> "
443
"received error complete from "
445
"~n ~p", [Pid, Mg, Error]),
446
Pids2 = lists:keydelete(Pid, 1, Pids),
382
447
Errs2 = [{Mg, Error}|Errs],
383
448
await_multi_load_collectors(Pids2, Oks, Errs2);
450
{'EXIT', Pid, normal} ->
451
%% This is assumed to be one of the collectors
452
i("await_multi_load_collectors -> "
453
"received (normal) exit signal from ~p", [Pid]),
454
await_multi_load_collectors(Pids, Oks, Errs);
456
{'EXIT', Pid, Reason} ->
457
i("await_multi_load_collectors -> "
458
"received unexpected exit from ~p:"
459
"~n ~p", [Pid, Reason]),
460
case lists:keydelete(Pid, 1, Pids) of
462
%% Not one of my procs, or a proc I have already
463
%% received a complete from.
464
await_multi_load_collectors(Pids, Oks, Errs);
466
[{Pid,Mg}] = Pids -- Pids2,
467
Errs2 = [{Mg, {unexpected_exit, Reason}}|Errs],
468
await_multi_load_collectors(Pids, Oks, Errs2)
386
472
i("await_multi_load_collectors -> received unexpected message:"
388
474
await_multi_load_collectors(Pids, Oks, Errs)
392
{error, {timeout, Pids, Oks, Errs}}
477
i("await_multi_load_collectors -> still awaiting reply from:"
479
await_multi_load_collectors(Pids, Oks, Errs)