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