20
20
-module(match_spec_SUITE).
22
-export([all/1, not_run/1]).
22
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
23
init_per_group/2,end_per_group/2, not_run/1]).
23
24
-export([test_1/1, test_2/1, test_3/1, bad_match_spec_bin/1,
24
25
trace_control_word/1, silent/1, silent_no_ms/1,
25
26
ms_trace2/1, ms_trace3/1, boxed_and_small/1,
26
27
destructive_in_test_bif/1, guard_exceptions/1,
27
28
unary_plus/1, unary_minus/1, moving_labels/1]).
30
-export([otp_9422/1]).
32
-export([runner/2, loop_runner/3]).
31
33
-export([f1/1, f2/2, f3/2, fn/1, fn/2, fn/3]).
32
34
-export([do_boxed_and_small/0]).
34
36
% This test suite assumes that tracing in general works. What we test is
35
37
% the match spec functionality.
37
-include("test_server.hrl").
39
-include_lib("test_server/include/test_server.hrl").
39
-export([init_per_testcase/2, fin_per_testcase/2]).
41
-export([init_per_testcase/2, end_per_testcase/2]).
41
43
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
42
44
Dog=?t:timetrap(?t:seconds(10)),
43
45
[{watchdog, Dog}|Config].
45
fin_per_testcase(_Func, Config) ->
47
end_per_testcase(_Func, Config) ->
46
48
Dog=?config(watchdog, Config),
47
49
?t:timetrap_cancel(Dog).
51
case test_server:is_native(?MODULE) of
52
false -> [test_1, test_2, test_3, bad_match_spec_bin,
53
trace_control_word, silent, silent_no_ms,
54
ms_trace2, ms_trace3, boxed_and_small,
55
destructive_in_test_bif, guard_exceptions,
56
unary_plus, unary_minus, fpe, moving_labels];
52
suite() -> [{ct_hooks,[ts_install_cth]}].
55
case test_server:is_native(match_spec_SUITE) of
57
[test_1, test_2, test_3, bad_match_spec_bin,
58
trace_control_word, silent, silent_no_ms, ms_trace2,
59
ms_trace3, boxed_and_small, destructive_in_test_bif,
60
guard_exceptions, unary_plus, unary_minus, fpe,
69
init_per_suite(Config) ->
72
end_per_suite(_Config) ->
75
init_per_group(_GroupName, Config) ->
78
end_per_group(_GroupName, Config) ->
60
82
not_run(Config) when is_list(Config) ->
61
83
{skipped, "Native Code"}.
188
210
?line collect(P1, [{trace, P1, call, {?MODULE, f2, [a, b]}, [true]}]),
214
otp_9422(Config) when is_list(Config) ->
216
?line Fun1 = fun() -> otp_9422_tracee() end,
217
?line P1 = spawn_link(?MODULE, loop_runner, [self(), Fun1, Laps]),
218
io:format("spawned ~p as tracee\n", [P1]),
220
?line erlang:trace(P1, true, [call, silent]),
222
?line Fun2 = fun() -> otp_9422_trace_changer() end,
223
?line P2 = spawn_link(?MODULE, loop_runner, [self(), Fun2, Laps]),
224
io:format("spawned ~p as trace_changer\n", [P2]),
229
%%receive after 10*1000 -> ok end,
240
otp_9422_trace_changer() ->
241
Pat1 = [{[a], [], [{enable_trace, arity}]}],
242
?line erlang:trace_pattern({?MODULE, f1, 1}, Pat1),
243
Pat2 = [{[b], [], [{disable_trace, arity}]}],
244
?line erlang:trace_pattern({?MODULE, f1, 1}, Pat2).
191
250
bad_match_spec_bin(Config) when is_list(Config) ->
192
251
{'EXIT',{badarg,_}} = (catch ets:match_spec_run([1], <<>>)),
457
516
?MODULE:f2(b, c),
458
erlang:integer_to_list(id(1)),
517
_ = erlang:integer_to_list(id(1)),
459
518
?MODULE:f3(d, e),
460
519
fn([all], [call,return_to,{tracer,Tracer}]),
464
erlang:integer_to_list(id(2)),
523
_ = erlang:integer_to_list(id(2)),
465
524
?MODULE:f3(j, k),
466
525
fn([call,return_to], []),
468
527
?MODULE:f2(m, n),
469
erlang:integer_to_list(id(3)),
528
_ = erlang:integer_to_list(id(3)),
551
610
register(TraceeName, self()),
553
612
?MODULE:f2(b, c),
554
erlang:integer_to_list(id(1)),
613
_ = erlang:integer_to_list(id(1)),
555
614
?MODULE:f3(d, e),
556
615
Controller ! {self(),Tag,start},
557
616
receive {Controller,Tag,started} -> ok end,
561
erlang:integer_to_list(id(2)),
620
_ = erlang:integer_to_list(id(2)),
562
621
?MODULE:f3(j, k),
563
622
Controller ! {self(),Tag,stop_1},
564
623
receive {Controller,Tag,stopped_1} -> ok end,
566
625
?MODULE:f2(m, n),
567
erlang:integer_to_list(id(3)),
626
_ = erlang:integer_to_list(id(3)),
568
627
?MODULE:f3(o, p),
569
628
Controller ! {self(),Tag,stop_2},
570
629
receive {Controller,Tag,stopped_2} -> ok end,
572
631
?MODULE:f2(r, s),
573
erlang:integer_to_list(id(4)),
632
_ = erlang:integer_to_list(id(4)),
912
971
Collector ! {gone, self()}
974
loop_runner(Collector, Fun, Laps) ->
979
loop_runner_cont(Collector, Fun, 0, Laps).
981
loop_runner_cont(_Collector, _Fun, Laps, Laps) ->
984
io:format("loop_runner ~p exit after ~p laps\n", [self(), Laps]),
985
Collector ! {gone, self()}
987
loop_runner_cont(Collector, Fun, N, Laps) ->
989
loop_runner_cont(Collector, Fun, N+1, Laps).