1: %%%=================================================================== 2: %%% @copyright (C) 2015, Erlang Solutions Ltd. 3: %%% @doc Suite for testing pubsub features over s2s 4: %%% @end 5: %%%=================================================================== 6: 7: -module(pubsub_s2s_SUITE). 8: 9: -include_lib("escalus/include/escalus.hrl"). 10: -include_lib("common_test/include/ct.hrl"). 11: -include_lib("escalus/include/escalus_xmlns.hrl"). 12: -include_lib("exml/include/exml.hrl"). 13: -include_lib("exml/include/exml_stream.hrl"). 14: 15: -export([suite/0, all/0, groups/0]). 16: -export([init_per_suite/1, end_per_suite/1, 17: init_per_group/2, end_per_group/2, 18: init_per_testcase/2, end_per_testcase/2]). 19: 20: -export([ 21: publish_test/1, 22: publish_without_node_attr_test/1 23: ]). 24: 25: -import(distributed_helper, [require_rpc_nodes/1, 26: subhost_pattern/1]). 27: -import(pubsub_tools, [ 28: domain/0, 29: encode_group_name/2, 30: decode_group_name/1]). 31: 32: %%-------------------------------------------------------------------- 33: %% Suite configuration 34: %%-------------------------------------------------------------------- 35: 36: suite() -> 37: require_rpc_nodes([mim, fed]) ++ escalus:suite(). 38: 39: all() -> 40: [{group, GN} || {GN, _, _} <- groups()]. 41: 42: groups() -> 43: [{encode_group_name(BaseGroup, NodeTree), Opts, Cases} || {BaseGroup, Opts, Cases} <- base_groups(), 44: NodeTree <- [<<"dag">>, <<"tree">>]]. 45: 46: base_groups() -> 47: G = [ 48: {basic, [parallel], basic_tests()} 49: ], 50: ct_helper:repeat_all_until_all_ok(G). 51: 52: basic_tests() -> 53: [ 54: publish_test, 55: publish_without_node_attr_test 56: ]. 57: 58: %%-------------------------------------------------------------------- 59: %% Init & teardown 60: %%-------------------------------------------------------------------- 61: init_per_suite(Config) -> 62: Config1 = s2s_helper:init_s2s(escalus:init_per_suite(Config)), 63: escalus:create_users(Config1, escalus:get_users(users())). 64: 65: end_per_suite(Config) -> 66: escalus_fresh:clean(), 67: s2s_helper:end_s2s(Config), 68: escalus:delete_users(Config, escalus:get_users(users())), 69: escalus:end_per_suite(Config). 70: 71: init_per_group(ComplexName, Config) -> 72: DecodedGroupName = decode_group_name(ComplexName), 73: ExtraOptions = extra_options_by_group_name(DecodedGroupName), 74: Config2 = dynamic_modules:save_modules(domain(), Config), 75: dynamic_modules:ensure_modules(domain(), required_modules(ExtraOptions)), 76: s2s_helper:configure_s2s(both_plain, Config2). 77: 78: extra_options_by_group_name(#{ node_tree := NodeTree }) -> 79: [{nodetree, NodeTree}, 80: {plugins, [plugin_by_nodetree(NodeTree)]}]. 81: 82: plugin_by_nodetree(<<"dag">>) -> <<"dag">>; 83: plugin_by_nodetree(<<"tree">>) -> <<"flat">>. 84: 85: end_per_group(_GroupName, Config) -> 86: dynamic_modules:restore_modules(Config). 87: 88: init_per_testcase(_TestName, Config) -> 89: escalus:init_per_testcase(_TestName, Config). 90: 91: end_per_testcase(TestName, Config) -> 92: escalus:end_per_testcase(TestName, Config). 93: 94: users() -> 95: [alice2, alice]. 96: 97: %%-------------------------------------------------------------------- 98: %% Test cases for XEP-0060 99: %% Comments in test cases refer to sections is the XEP 100: %%-------------------------------------------------------------------- 101: 102: %%-------------------------------------------------------------------- 103: %% Main PubSub cases 104: %%-------------------------------------------------------------------- 105: publish_test(Config) -> 106: escalus:fresh_story( 107: Config, 108: [{alice, 1}, {alice2, 1}], 109: fun(Alice, Alice2) -> 110: Node = pubsub_tools:pubsub_node(), 111: pubsub_tools:create_node(Alice, Node, []), 112: pubsub_tools:publish(Alice, <<"item1">>, Node, []), 113: pubsub_tools:publish(Alice2, <<"item2">>, Node, [{expected_error_type, <<"auth">>}]), 114: pubsub_tools:delete_node(Alice, Node, []) 115: end). 116: 117: publish_without_node_attr_test(Config) -> 118: escalus:fresh_story( 119: Config, 120: [{alice, 1}, {alice2, 1}], 121: fun(Alice, Alice2) -> 122: Node = pubsub_tools:pubsub_node(), 123: pubsub_tools:create_node(Alice, Node, []), 124: pubsub_tools:publish(Alice, <<"item1">>, Node, []), 125: pubsub_tools:publish_without_node_attr(Alice2, <<"item2">>, Node, [{expected_error_type, <<"modify">>}]), 126: pubsub_tools:delete_node(Alice, Node, []) 127: end). 128: 129: required_modules(ExtraOpts) -> 130: [{mod_pubsub, [ 131: {backend, mongoose_helper:mnesia_or_rdbms_backend()}, 132: {host, subhost_pattern("pubsub.@HOST@")} 133: | ExtraOpts 134: ]}].