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