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