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:                   ]}].