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: [{basic, [parallel], basic_tests()}]. 48: 49: basic_tests() -> 50: [ 51: publish_test, 52: publish_without_node_attr_test 53: ]. 54: 55: %%-------------------------------------------------------------------- 56: %% Init & teardown 57: %%-------------------------------------------------------------------- 58: init_per_suite(Config) -> 59: Config1 = s2s_helper:init_s2s(escalus:init_per_suite(Config)), 60: escalus:create_users(Config1, escalus:get_users(users())). 61: 62: end_per_suite(Config) -> 63: escalus_fresh:clean(), 64: s2s_helper:end_s2s(Config), 65: escalus:delete_users(Config, escalus:get_users(users())), 66: escalus:end_per_suite(Config). 67: 68: init_per_group(ComplexName, Config) -> 69: DecodedGroupName = decode_group_name(ComplexName), 70: ExtraOptions = extra_options_by_group_name(DecodedGroupName), 71: Config2 = dynamic_modules:save_modules(domain(), Config), 72: dynamic_modules:ensure_modules(domain(), required_modules(ExtraOptions)), 73: s2s_helper:configure_s2s(both_plain, Config2). 74: 75: extra_options_by_group_name(#{ node_tree := NodeTree }) -> 76: [{nodetree, NodeTree}, 77: {plugins, [plugin_by_nodetree(NodeTree)]}]. 78: 79: plugin_by_nodetree(<<"dag">>) -> <<"dag">>; 80: plugin_by_nodetree(<<"tree">>) -> <<"flat">>. 81: 82: end_per_group(_GroupName, Config) -> 83: dynamic_modules:restore_modules(Config). 84: 85: init_per_testcase(_TestName, Config) -> 86: escalus:init_per_testcase(_TestName, Config). 87: 88: end_per_testcase(TestName, Config) -> 89: escalus:end_per_testcase(TestName, Config). 90: 91: users() -> 92: [alice2, alice]. 93: 94: %%-------------------------------------------------------------------- 95: %% Test cases for XEP-0060 96: %% Comments in test cases refer to sections is the XEP 97: %%-------------------------------------------------------------------- 98: 99: %%-------------------------------------------------------------------- 100: %% Main PubSub cases 101: %%-------------------------------------------------------------------- 102: publish_test(Config) -> 103: escalus:fresh_story( 104: Config, 105: [{alice, 1}, {alice2, 1}], 106: fun(Alice, Alice2) -> 107: Node = pubsub_tools:pubsub_node(), 108: pubsub_tools:create_node(Alice, Node, []), 109: pubsub_tools:publish(Alice, <<"item1">>, Node, []), 110: pubsub_tools:publish(Alice2, <<"item2">>, Node, [{expected_error_type, <<"auth">>}]), 111: pubsub_tools:delete_node(Alice, Node, []) 112: end). 113: 114: publish_without_node_attr_test(Config) -> 115: escalus:fresh_story( 116: Config, 117: [{alice, 1}, {alice2, 1}], 118: fun(Alice, Alice2) -> 119: Node = pubsub_tools:pubsub_node(), 120: pubsub_tools:create_node(Alice, Node, []), 121: pubsub_tools:publish(Alice, <<"item1">>, Node, []), 122: pubsub_tools:publish_without_node_attr(Alice2, <<"item2">>, Node, [{expected_error_type, <<"modify">>}]), 123: pubsub_tools:delete_node(Alice, Node, []) 124: end). 125: 126: required_modules(ExtraOpts) -> 127: [{mod_pubsub, [ 128: {backend, mongoose_helper:mnesia_or_rdbms_backend()}, 129: {host, subhost_pattern("pubsub.@HOST@")} 130: | ExtraOpts 131: ]}].