1: -module(local_iq_SUITE).
    2: 
    3: -include_lib("common_test/include/ct.hrl").
    4: -include_lib("eunit/include/eunit.hrl").
    5: -include_lib("exml/include/exml.hrl").
    6: 
    7: -compile([export_all, nowarn_export_all]).
    8: -import(distributed_helper, [mim/0, mim2/0, require_rpc_nodes/1, rpc/4, subhost_pattern/1]).
    9: -import(domain_helper, [host_type/0, secondary_host_type/0]).
   10: 
   11: suite() ->
   12:     require_rpc_nodes([mim, mim2]).
   13: 
   14: all() ->
   15:     [{group, iq_group}].
   16: 
   17: groups() ->
   18:     [{iq_group, [], cases()}].
   19: 
   20: cases() ->
   21:     [process_iq_works_across_multiple_nodes,
   22:      process_iq_timeout].
   23: 
   24: %%--------------------------------------------------------------------
   25: %% Init & teardown
   26: %%--------------------------------------------------------------------
   27: 
   28: init_per_suite(Config) ->
   29:     distributed_helper:add_node_to_cluster(mim2(), Config),
   30:     mongoose_helper:inject_module(mim(), ?MODULE, reload),
   31:     mongoose_helper:inject_module(mim2(), ?MODULE, reload),
   32:     escalus:init_per_suite(Config).
   33: 
   34: end_per_suite(Config) ->
   35:     escalus:end_per_suite(Config).
   36: 
   37: init_per_group(iq_group, Config) ->
   38:     Config.
   39: 
   40: end_per_group(iq_group, Config) ->
   41:     escalus_fresh:clean(),
   42:     Config.
   43: 
   44: init_per_testcase(Testcase, Config) ->
   45:     escalus:init_per_testcase(Testcase, Config).
   46: 
   47: end_per_testcase(Testcase, Config) ->
   48:     escalus:end_per_testcase(Testcase, Config).
   49: 
   50: %%--------------------------------------------------------------------
   51: %% Tests
   52: %%--------------------------------------------------------------------
   53: 
   54: process_iq_works_across_multiple_nodes(Config) ->
   55:     %% Alice connects to node1
   56:     F = fun(Alice) ->
   57:           route_iq(Alice, undefined),
   58:           Stanza = escalus:wait_for_stanza(Alice),
   59:           escalus:assert(is_iq_get, [], Stanza),
   60:           escalus_client:send(Alice, escalus_stanza:iq_result(Stanza)),
   61:           receive
   62:               {result, _CbFrom, _CbTo, _CbAcc, _CbIQ} -> ok
   63:           after 5000 -> ct:fail(timeout_waiting_for_result)
   64:           end
   65:         end,
   66:     escalus:fresh_story(Config, [{alice, 1}], F).
   67: 
   68: process_iq_timeout(Config) ->
   69:     F = fun(Alice) ->
   70:           route_iq(Alice, 1),
   71:           Stanza = escalus:wait_for_stanza(Alice),
   72:           escalus:assert(is_iq_get, [], Stanza),
   73:           receive
   74:               {result, _CbFrom, _CbTo, _CbAcc, CbIQ} -> timeout = CbIQ
   75:           after 5000 -> ct:fail(timeout_waiting_for_result)
   76:           end
   77:         end,
   78:     escalus:fresh_story(Config, [{alice, 1}], F).
   79: 
   80: %%--------------------------------------------------------------------
   81: %% Helpers
   82: %%--------------------------------------------------------------------
   83: 
   84: route_iq(Alice, Timeout) ->
   85:     Jid = escalus_client:full_jid(Alice),
   86:     Server = escalus_client:server(Alice),
   87:     To = jid:from_binary(Jid),
   88:     From = jid:from_binary(Server),
   89:     Query = #xmlel{name = <<"query">>,
   90:                    attrs = [{<<"xmlns">>, <<"cooltestns">>}]},
   91:     Xml = #xmlel{name = <<"iq">>,
   92:                  attrs = [{<<"type">>, <<"get">>},
   93:                           {<<"from">>, Server}, {<<"to">>, Jid}],
   94:                  children = [Query]},
   95:     Acc = rpc(mim(), mongoose_acc, new,
   96:               [#{location => #{}, lserver => Server, element => Xml}]),
   97:     IQ = rpc(mim(), jlib, iq_query_info, [Xml]),
   98:     Self = self(),
   99:     Callback = fun(CbFrom, CbTo, CbAcc, CbIQ) ->
  100:                        Self ! {result, CbFrom, CbTo, CbAcc, CbIQ}, CbAcc end,
  101:     Args = [From, To, Acc, IQ, Callback, Timeout],
  102:     rpc(mim2(), ejabberd_local, route_iq, Args).