1: -module(tr_util_SUITE).
    2: -compile([export_all, nowarn_export_all]).
    3: 
    4: -import(distributed_helper, [rpc/4, mim/0]).
    5: 
    6: -include_lib("eunit/include/eunit.hrl").
    7: 
    8: all() ->
    9:     [c2s_hooks, c2s_elements].
   10: 
   11: suite() ->
   12:     escalus:suite().
   13: 
   14: init_per_suite(Config) ->
   15:     rpc(mim(), tr, start, []),
   16:     escalus:init_per_suite(Config).
   17: 
   18: end_per_suite(Config) ->
   19:     escalus_fresh:clean(),
   20:     escalus:end_per_suite(Config),
   21:     rpc(mim(), tr, stop, []).
   22: 
   23: init_per_testcase(CaseName, Config) ->
   24:     escalus:init_per_testcase(CaseName, Config).
   25: 
   26: end_per_testcase(_CaseName, _Config) ->
   27:     rpc(mim(), tr, stop_tracing, []),
   28:     rpc(mim(), tr, clean, []).
   29: 
   30: %% Test Cases
   31: 
   32: c2s_hooks(Config) ->
   33:     rpc(mim(), tr, trace, [[mongoose_c2s_hooks, gen_hook]]),
   34:     [] = rpc(mim(), tr_util, c2s_hooks, []), % nothing collected yet
   35:     escalus:fresh_story(Config, [{alice, 1}], fun c2s_hooks_story/1).
   36: 
   37: c2s_hooks_story(Alice) ->
   38:     C2SHooks = rpc(mim(), tr_util, c2s_hooks, []),
   39:     AliceJid = escalus_utils:get_jid(Alice),
   40: 
   41:     %% Get c2s hooks, and check the first few
   42:     ?assertMatch([{AliceJid, user_send_packet, #{mongoose_acc := true}},
   43:                   {AliceJid, user_send_iq, #{mongoose_acc := true}},
   44:                   {AliceJid, user_open_session, #{mongoose_acc := true}} | _], C2SHooks),
   45: 
   46:     %% Get generic hook statistics, and check one hook
   47:     HookStat = rpc(mim(), tr, call_stat, [fun tr_util:tr_to_hook_name_and_tag/1]),
   48:     HT = domain_helper:host_type(),
   49:     ?assertMatch(#{{user_open_session, HT} := {1, _, _}}, HookStat).
   50: 
   51: c2s_elements(Config) ->
   52:     rpc(mim(), tr, trace, [[mongoose_c2s_hooks]]),
   53:     [] = rpc(mim(), tr_util, c2s_elements, []), % nothing collected yet
   54:     escalus:fresh_story(Config, [{alice, 1}, {bob, 1}], fun c2s_elements_story/2).
   55: 
   56: c2s_elements_story(Alice, Bob) ->
   57:     escalus_client:send(Alice, escalus_stanza:chat_to(Bob, <<"Hello">>)),
   58:     escalus:wait_for_stanza(Bob),
   59:     AliceBareJid = escalus_utils:get_short_jid(Alice),
   60:     BobBareJid = escalus_utils:get_short_jid(Bob),
   61:     AliceJid = escalus_utils:get_jid(Alice),
   62:     BobJid = escalus_utils:get_jid(Bob),
   63: 
   64:     %% Get elements exchanged between bare JIDs
   65:     [Sent, Recv] = rpc(mim(), tr_util, c2s_elements_between_jids, [[AliceBareJid, BobBareJid]]),
   66:     ?assertMatch(#{name := <<"message">>, type := <<"chat">>,
   67:                    jid := AliceJid, from_jid := AliceJid, to_jid := BobJid}, Sent),
   68:     ?assertMatch(#{name := <<"message">>, type := <<"chat">>,
   69:                    jid := BobJid, from_jid := AliceJid, to_jid := BobJid}, Recv),
   70: 
   71:     %% Get elements exchanged between full JIDs
   72:     ?assertEqual([Sent, Recv],
   73:                  rpc(mim(), tr_util, c2s_elements_between_jids, [[AliceJid, BobJid]])),
   74: 
   75:     %% Get all elements
   76:     AllElements = rpc(mim(), tr_util, c2s_elements, []),
   77:     ?assert(lists:member(Sent, AllElements)),
   78:     ?assert(lists:member(Recv, AllElements)).