1-module(ttb_helper). %%Nodes control
2-compile(export_all).
3
4%%API
5%%get() -> client:get()
6%%put(X) -> client:put(X)
7%%msgs(N) -> N times client:put(test_msg)
8%%clear() -> restart server
9%%ensure_running() / stop() -> start/stop nodes
10%%get_node(atom) -> return atom@hostname
11
12-define(NODE_CMD(Name),
13	"erl -sname " ++ atom_to_list(Name) ++
14	" -pa .. -pa . -detached -run ttb_helper send_ok").
15-define(REG_NAME, nc_testing).
16
17new_fun() ->
18    fun(_, end_of_trace, _, Dict) -> io:format("~p~n", [dict:to_list(Dict)]);
19       (_, T, _, Dict) -> case element(2, T) of
20                              {Pid, _, _} ->
21                                  dict:update_counter(Pid, 1, Dict);
22                              Pid ->
23                                  dict:update_counter(Pid, 1, Dict)
24                          end
25    end.
26
27new_fun_2() ->
28    fun(_, end_of_trace, _, Dict) -> io:format("~p~n", [dict:to_list(Dict)]);
29       (_, T, _, Dict) ->  case element(2, T) of
30                               {_, Name, _} when is_atom(Name)->
31                                  dict:update_counter(Name, 1, Dict);
32                              Pid ->
33                                  dict:update_counter(Pid, 1, Dict)
34                          end
35
36    end.
37
38
39ensure_running() ->
40    try_start_node(server),
41    try_start_node(client),
42    clear().
43
44try_start_node(Node) ->
45    global:unregister_name(?REG_NAME),
46    global:register_name(?REG_NAME, self()),
47    global:sync(),
48    N = get_node(Node),
49    case net_adm:ping(N) of
50	pong ->
51	    io:format("Node ~p already running~n", [N]);
52	_ ->
53	    io:format("Starting node ~p... ~p ", [Node, os:cmd(?NODE_CMD(Node))]),
54	    recv()
55    end.
56
57clear() ->
58    s(server, stop, []),
59    init().
60
61stop() ->
62    s(init, stop, []),
63    c(init, stop, []).
64
65msgs(N) ->
66    [c(client, put, [test_msg]) || _ <- lists:seq(1, N)],
67    s(server, received, [a,b]),
68    [dbg:flush_trace_port(Node) || Node <- [get_node(client), get_node(server)]].
69
70msgs_ip(N) ->
71    [c(client, put, [test_msg]) || _ <- lists:seq(1, N)],
72    s(server, received, [a,b]),
73    timer:sleep(500). %% allow trace messages to arrive over tcp/ip
74
75run() ->
76    ttb({local, "A"}),
77    msgs(2),
78    c(erlang, whereis, [ttbt]).
79
80get() -> c(client, get, []).
81put(Thing) -> c(client, put, [Thing]).
82
83get_node(Node) ->
84    {ok, Host} = inet:gethostname(),
85    list_to_atom(atom_to_list(Node) ++ "@" ++ Host).
86
87trace_setup() ->
88    ttb:p(all, call),
89    ttb:tp(server, received, []),
90    ttb:tp(client, put, []),
91    ttb:tp(client, get, []).
92
93ttb() -> ttb("A").
94ttb(File) ->
95    ttb:tracer([get_node(client), get_node(server)], [{file, File}, resume]),
96    ttb:p(all, [call, timestamp]),
97    ttb:tp(client, put, []),
98    ttb:tp(client, get, []),
99    ttb:tp(server, received, []).
100
101tc() ->
102    TC = example_config_gen:create_trace_case("dummy comment"),
103    Patterns = example_config_gen:create_pattern(client, put, 1, return),
104    Flags = example_config_gen:create_flags(all, call),
105    Merge = example_config_gen:create_merge_conf(show_handler(), "dummy merge comment"),
106    Merge2 = example_config_gen:create_merge_conf(undefined, "dummy merge comment"),
107    TC2 = example_config_gen:add_pattern(Patterns, TC),
108    TC3 = example_config_gen:add_flags(Flags, TC2),
109    TC4 = example_config_gen:add_merge_conf(Merge, TC3),
110    TC5 = example_config_gen:add_merge_conf(Merge2, TC4),
111    example_config_gen:add_nodes([get_node(client), get_node(server)], TC5).
112
113
114show(X) ->
115    io:format(user, "Showing: ~p~n", [X]).
116
117state_handler() ->
118    {fun(_,_,I,S) -> io:format(user, "Got from ~p: ~p~n", [I,S]), S+1 end, 0}.
119
120show_handler() ->
121    {fun(A,B,_,_) -> io:format(A, "~p~n", [B]) end, []}.
122
123opts() ->
124    [[get_node(client), get_node(server)],
125     [{server, received, '_', []},
126      {client, put, '_', []},
127      {client, get, '_', []}],
128     {all, call},
129     [{file, "TEST"}]].
130
131overload_check(check) ->
132    true;
133overload_check(_) ->
134    ok.
135%%%Internal
136s(M, F, A) -> rpc:call(get_node(server), M, F, A).
137c(M, F, A) -> rpc:call(get_node(client), M, F, A).
138
139send_ok() ->
140    pong = net_adm:ping(get_node(test)),
141    global:sync(),
142    global:send(?REG_NAME, node()).
143
144init() ->
145    True = s(server, start, []),
146    io:format("ok1: ~p~n", [True]),
147    true = c(client, init, [get_node(server)]).
148
149recv() ->
150    receive
151	Node ->
152	    io:format("Node ~p ready.~n", [Node]),
153            ok
154    after 5000 ->
155	    io:format("Startup failed~n",[]),
156	    throw(startup_failed)
157    end.
158