37
55
%% {Mod, Fun, ExpectedRes, ActualRes}
38
56
%%----------------------------------------------------------------------
42
?d("t(~p) -> entry", [Case]),
43
Res = t(Case, default_config()),
46
t([Mod, Fun]) when atom(Mod), atom(Fun) ->
47
?d("t([~w,~w]:1) -> entry", [Mod, Fun]),
48
Res = t({Mod, Fun}, default_config()),
50
?d("t(~p,~p) -> Res:~n~p", [Mod, Fun, Res]),
58
run([Mod, Fun]) when is_atom(Mod) andalso is_atom(Fun) ->
59
Res = run({Mod, Fun}, default_config(Mod)),
62
run({Mod, _Fun} = Case) when is_atom(Mod) ->
64
Res = run(Case, default_config(Mod)),
67
run(Mod) when is_atom(Mod) ->
69
Res = run(Mod, default_config(Mod)),
72
run([Mod]) when is_atom(Mod) ->
74
Res = run(Mod, default_config(Mod)),
54
t({Mod, Fun}, Config) when atom(Mod), atom(Fun), list(Config) ->
55
?d("t(~p,~p) -> entry", [Mod, Fun]),
79
run({Mod, Fun}, Config) when is_atom(Mod) andalso
82
?d("run(~p,~p) -> entry", [Mod, Fun]),
56
83
case (catch apply(Mod, Fun, [suite])) of
58
85
io:format("~n~n*** Eval: ~p ***************~n",
67
Cases when list(Cases) ->
94
Cases when is_list(Cases) ->
68
95
io:format("~n*** Expand: ~p ...~n", [{Mod, Fun}]),
69
Map = fun(Case) when atom(Case)-> {Mod, Case};
96
Map = fun(Case) when is_atom(Case) -> {Mod, Case};
72
t(lists:map(Map, Cases), Config);
99
run(lists:map(Map, Cases), Config);
74
{req, _, SubCases} when list(SubCases) ->
101
{conf, InitSuite, Cases, FinishSuite} when is_atom(InitSuite) andalso
102
is_list(Cases) andalso
103
is_atom(FinishSuite) ->
107
"~n FinishSuite: ~p", [InitSuite, Cases, FinishSuite]),
108
do_suite(Mod, InitSuite, Cases, FinishSuite, Config);
110
{req, _, SubCases} when is_list(SubCases) ->
112
"~n SubCases: ~p", [SubCases]),
75
113
do_subcases(Mod, Fun, SubCases, Config, []);
117
"~n Conf: ~p", [Conf]),
78
118
do_subcases(Mod, Fun, [Conf], Config, []);
80
120
{'EXIT', {undef, _}} ->
85
125
io:format("~n*** Ignoring: ~p: ~p~n", [{Mod, Fun}, Error]),
86
126
[{failed, {Mod, Fun}, Error}]
88
t(Mod, Config) when atom(Mod), list(Config) ->
89
?d("t(~p) -> entry whith"
90
"~n Config: ~p", [Mod, Config]),
91
t({Mod, all}, Config);
92
t(Cases, Config) when list(Cases), list(Config) ->
95
"~n Config: ~p", [Cases, Config]),
96
Errors = [t(Case, Config) || Case <- Cases],
97
?d("t -> Errors: ~n~p", [Errors]),
129
run(Mod, Config) when is_atom(Mod) andalso is_list(Config) ->
130
run({Mod, all}, Config);
132
run(Cases, Config) when is_list(Cases) andalso is_list(Config) ->
133
Errors = [run(Case, Config) || Case <- Cases],
98
134
lists:append(Errors);
102
"~n Config: ~p", [Bad, Config]),
103
137
[{badarg, Bad, ok}].
107
io:format("~n~n*** Eval: ~p ***************~n", [{M, F}]),
108
case eval(M, F, C) of
140
do_suite(Mod, Init, Cases, Finish, Config0) ->
141
?d("do_suite -> entry with"
146
"~n Config0: ~p", [Mod, Init, Cases, Finish, Config0]),
147
case (catch apply(Mod, Init, [Config0])) of
148
Config when is_list(Config) ->
149
io:format("~n*** Expand: ~p ...~n", [Mod]),
150
Map = fun(Case) when is_atom(Case) -> {Mod, Case};
153
Res = run(lists:map(Map, Cases), Config),
154
(catch apply(Mod, Finish, [Config])),
157
{'EXIT', {skipped, Reason}} ->
158
io:format(" => skipping: ~p~n", [Reason]),
160
[{skipped, {Mod, Case}, suite_init_skipped} || Case <- Cases],
161
lists:flatten([[{skipped, {Mod, Init}, Reason}],
163
[{skipped, {Mod, Finish}, suite_init_skipped}]]);
166
io:format(" => init (~p) failed: ~n~p~n", [Init, Error]),
168
[{failed, {Mod, Init}, Error}],
170
[{skipped, {Mod, Case}, suite_init_failed} || Case <- Cases],
172
case (catch apply(Mod, Finish, [Config0])) of
175
FinConfig when is_list(FinConfig) ->
178
[{failed, {Mod, Finish}, FinError}]
180
lists:flatten([InitResult, SkippedCases, FinResult])
116
185
do_subcases(_Mod, _Fun, [], _Config, Acc) ->
117
?d("t -> do_subcases([]) -> entry with"
118
"~n Acc: ~p", [Acc]),
119
186
lists:flatten(lists:reverse(Acc));
120
do_subcases(Mod, Fun, [{conf, Init, Cases, Finish}|SubCases], Config, Acc) ->
121
?d("t -> do_subcases(conf) -> entry with"
124
"~n Finish: ~p", [Init, Cases, Finish]),
187
do_subcases(Mod, Fun, [{conf, Init, Cases, Finish}|SubCases], Config, Acc)
188
when is_atom(Init) andalso is_list(Cases) andalso is_atom(Finish) ->
125
189
R = case (catch apply(Mod, Init, [Config])) of
126
Conf when list(Conf) ->
190
Conf when is_list(Conf) ->
127
191
io:format("~n*** Expand: ~p ...~n", [{Mod, Fun}]),
128
Map = fun(Case) when atom(Case) -> {Mod, Case};
192
Map = fun(Case) when is_atom(Case) -> {Mod, Case};
131
Res = t(lists:map(Map, Cases), Conf),
195
Res = run(lists:map(Map, Cases), Conf),
132
196
(catch apply(Mod, Finish, [Conf])),
141
205
(catch apply(Mod, Finish, [Config])),
142
206
[{failed, {Mod, Fun}, Error}]
144
?d("t -> do_subcases(conf):"
146
208
do_subcases(Mod, Fun, SubCases, Config, [R|Acc]);
147
209
do_subcases(Mod, Fun, [SubCase|SubCases], Config, Acc) when atom(SubCase) ->
148
?d("t -> do_subcases(~p)", [SubCase]),
149
210
R = do_case(Mod, SubCase, Config),
150
211
do_subcases(Mod, Fun, SubCases,Config, [R|Acc]).
215
io:format("~n~n*** Eval: ~p ***************~n", [{M, F}]),
216
case eval(M, F, C) of
154
224
eval(Mod, Fun, Config) ->
155
?d("eval -> entry with"
157
"~n Fun: ~p", [Mod, Fun]),
158
global:register_name(inets_test_case_sup, self()),
159
Flag = process_flag(trap_exit, true),
225
Flag = process_flag(trap_exit, true),
226
global:register_name(?TEST_CASE_SUP, self()),
160
227
Config2 = Mod:init_per_testcase(Fun, Config),
161
Pid = spawn_link(?MODULE, do_eval, [self(), Mod, Fun, Config2]),
162
R = wait_for_evaluator(Pid, Mod, Fun, Config2, []),
229
Eval = fun() -> do_eval(Self, Mod, Fun, Config2) end,
230
Pid = spawn_link(Eval),
231
R = wait_for_evaluator(Pid, Mod, Fun, Config2, []),
163
232
Mod:fin_per_testcase(Fun, Config2),
164
global:unregister_name(inets_test_case_sup),
233
global:unregister_name(?TEST_CASE_SUP),
165
234
process_flag(trap_exit, Flag),
166
?d("eval -> exit with:"
170
237
wait_for_evaluator(Pid, Mod, Fun, Config, Errors) ->
173
240
{'EXIT', _Watchdog, watchdog_timeout} ->
174
241
io:format("*** ~s WATCHDOG TIMEOUT~n", [Pre]),
176
{failed, {Mod,Fun}, watchdog_timeout};
177
{done, Pid, ok} when Errors == [] ->
243
{failed, {Mod, Fun}, watchdog_timeout};
244
{done, Pid, ok} when Errors =:= [] ->
178
245
io:format("*** ~s OK~n", [Pre]),
179
246
{ok, {Mod, Fun}, Errors};
180
{done, Pid, {ok, _}} when Errors == [] ->
247
{done, Pid, {ok, _}} when Errors =:= [] ->
181
248
io:format("*** ~s OK~n", [Pre]),
182
249
{ok, {Mod, Fun}, Errors};
183
250
{done, Pid, Fail} ->
184
251
io:format("*** ~s FAILED~n~p~n", [Pre, Fail]),
185
{failed, {Mod,Fun}, Fail};
252
{failed, {Mod, Fun}, Fail};
186
253
{'EXIT', Pid, {skipped, Reason}} ->
187
254
io:format("*** ~s SKIPPED~n~p~n", [Pre, Reason]),
188
255
{skipped, {Mod, Fun}, Errors};
197
264
do_eval(ReplyTo, Mod, Fun, Config) ->
198
?d("do_eval -> entry with"
204
"~n ~p", [ReplyTo, Mod, Fun, Config, erlang:now()]),
205
265
case (catch apply(Mod, Fun, [Config])) of
206
266
{'EXIT', {skipped, Reason}} ->
207
267
ReplyTo ! {'EXIT', self(), {skipped, Reason}};
209
?d("do_eval -> entry with"
210
"~n Other: ~p", [Other]),
211
269
ReplyTo ! {done, self(), Other}
213
?d("do_eval -> case ~p completed at ~p", [Fun, erlang:now()]),
305
357
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
306
358
%% Test server callbacks
308
init_per_testcase(Case, Config) ->
309
?d("init_per_testcase(~p) -> entry", [Case]),
310
global:register_name(megaco_global_logger, group_leader()),
360
init_per_testcase(_Case, Config) ->
361
global:register_name(?GLOBAL_LOGGER, group_leader()),
313
fin_per_testcase(Case, Config) ->
314
?d("fin_per_testcase(~p) -> entry", [Case]),
315
global:unregister_name(megaco_global_logger),
364
fin_per_testcase(_Case, _Config) ->
365
global:unregister_name(?GLOBAL_LOGGER),
319
369
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
320
370
%% Internal utility functions
323
[{nodes, default_nodes()}].
328
mk_nodes(0, Nodes) ->
331
mk_nodes(N - 1, [node()]);
332
mk_nodes(N, Nodes) when N > 0 ->
334
[Name, Host] = node_to_name_and_host(Head),
335
Nodes ++ [mk_node(I, Name, Host) || I <- lists:seq(1, N)].
337
mk_node(N, Name, Host) ->
338
list_to_atom(lists:concat([Name ++ integer_to_list(N) ++ "@" ++ Host])).
340
%% Returns [Name, Host]
341
node_to_name_and_host(Node) ->
342
string:tokens(atom_to_list(Node), [$@]).
344
start_nodes([Node | Nodes], File, Line) ->
345
case net_adm:ping(Node) of
347
start_nodes(Nodes, File, Line);
349
[Name, Host] = node_to_name_and_host(Node),
352
case ?STARTL_NODE(Host, Name, Args) of
353
{ok, NewNode} when NewNode == Node ->
354
start_nodes(Nodes, File, Line);
356
fatal_skip({cannot_start_node, Node, Other}, File, Line)
359
start_nodes([], File, Line) ->
372
default_config(Mod) ->
373
PrivDir0 = ?snmp_priv_dir,
374
case filename:pathtype(PrivDir0) of
378
case file:make_dir(Mod) of
384
PrivDir = filename:join(Mod, PrivDir0),
385
case file:make_dir(PrivDir) of
391
?FAIL({failed_creating_subsuite_top_dir, Error})
393
[{priv_dir, PrivDir}]
363
397
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
367
d(get(dbg), F, A, L).
401
%% d(get(dbg), F, A, L).
369
403
d(true, F, A, L) ->
370
io:format("STS:~p:~p " ++ F ++ "~n", [self(),L|A]);
404
io:format("STS[~w] ~p " ++ F ++ "~n", [L,self()|A]);
409
{Date, Time} = calendar:now_to_datetime( now() ),
410
{YYYY, MM, DD} = Date,
411
{Hour, Min, Sec} = Time,
413
io_lib:format("~.4w-~.2.0w-~.2.0w_~.2.0w.~.2.0w.~.2.0w",
414
[YYYY,MM,DD,Hour,Min,Sec]),
415
lists:flatten(FormatDate).