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