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).