1: -module(mam_send_message_SUITE).
    2: 
    3: %% API
    4: -export([all/0,
    5:          groups/0,
    6:          init_per_suite/1,
    7:          end_per_suite/1,
    8:          init_per_group/2,
    9:          end_per_group/2,
   10:          init_per_testcase/2,
   11:          end_per_testcase/2]).
   12: 
   13: -export([mam_muc_send_message/1,
   14:          mam_pm_send_message/1]).
   15: 
   16: -import(mam_helper,
   17:         [stanza_archive_request/2,
   18:          wait_archive_respond/1,
   19:          assert_respond_size/2,
   20:          respond_messages/1,
   21:          parse_forwarded_message/1]).
   22: 
   23: -import(distributed_helper, [mim/0,
   24:                              require_rpc_nodes/1,
   25:                              subhost_pattern/1,
   26:                              rpc/4]).
   27: -import(domain_helper, [host_type/0]).
   28: -import(config_parser_helper, [mod_config/2]).
   29: 
   30: -include_lib("common_test/include/ct.hrl").
   31: 
   32: all() ->
   33:     [{group, send_message}].
   34: 
   35: groups() ->
   36:     [
   37:      {send_message, [], [mam_pm_send_message,
   38:                          mam_muc_send_message]}
   39:     ].
   40: 
   41: %%%===================================================================
   42: %%% Overall setup/teardown
   43: %%%===================================================================
   44: init_per_suite(Config) ->
   45:     escalus:init_per_suite(Config).
   46: 
   47: end_per_suite(Config) ->
   48:     escalus_fresh:clean(),
   49:     escalus:end_per_suite(Config).
   50: 
   51: %%%===================================================================
   52: %%% Group specific setup/teardown
   53: %%%===================================================================
   54: init_per_group(Group, Config) ->
   55:     case mongoose_helper:is_rdbms_enabled(host_type()) of
   56:         true ->
   57:             load_custom_module(),
   58:             Config2 = dynamic_modules:save_modules(host_type(), Config),
   59:             dynamic_modules:ensure_modules(host_type(), group_to_modules(Group)),
   60:             [{props, mam_helper:mam06_props()}|Config2];
   61:         false ->
   62:             {skip, require_rdbms}
   63:     end.
   64: 
   65: end_per_group(_Groupname, Config) ->
   66:     case mongoose_helper:is_rdbms_enabled(host_type()) of
   67:         true ->
   68:             dynamic_modules:restore_modules(Config);
   69:         false ->
   70:             ok
   71:     end,
   72:     ok.
   73: 
   74: group_to_modules(send_message) ->
   75:     MH = subhost_pattern(muc_light_helper:muc_host_pattern()),
   76:     [{mod_mam, mam_helper:config_opts(#{pm => #{},
   77:                                         muc => #{host => MH},
   78:                                         send_message => mam_send_message_example})},
   79:      {mod_muc_light, mod_config(mod_muc_light,
   80:                                 #{backend => mongoose_helper:mnesia_or_rdbms_backend()})},
   81:      {mam_send_message_example, []}].
   82: 
   83: load_custom_module() ->
   84:     mam_send_message_example:module_info(),
   85:     {Mod, Code, File} = code:get_object_code(mam_send_message_example),
   86:     rpc(mim(), code, load_binary, [Mod, File, Code]).
   87: 
   88: %%%===================================================================
   89: %%% Testcase specific setup/teardown
   90: %%%===================================================================
   91: 
   92: init_per_testcase(TestCase, Config) ->
   93:     escalus:init_per_testcase(TestCase, Config).
   94: 
   95: end_per_testcase(TestCase, Config) ->
   96:     escalus:end_per_testcase(TestCase, Config).
   97: 
   98: %%%===================================================================
   99: %%% Test Cases
  100: %%%===================================================================
  101: 
  102: mam_pm_send_message(Config) ->
  103:     P = ?config(props, Config),
  104:     F = fun(Alice, Bob) ->
  105:         escalus:send(Alice, escalus_stanza:chat_to(Bob, <<"OH, HAI!">>)),
  106:         escalus:wait_for_stanza(Bob),
  107:         mam_helper:wait_for_archive_size(Alice, 1),
  108:         mam_helper:wait_for_archive_size(Bob, 1),
  109:         escalus:send(Alice, stanza_archive_request(P, <<"q1">>)),
  110:         Res = wait_archive_respond(Alice),
  111:         assert_respond_size(1, Res),
  112:         [Msg] = respond_messages(Res),
  113:         verify_has_some_hash(Msg)
  114:         end,
  115:     escalus:fresh_story(Config, [{alice, 1}, {bob, 1}], F).
  116: 
  117: mam_muc_send_message(Config0) ->
  118:     F = fun(Config, Alice) ->
  119:         P = ?config(props, Config),
  120:         Room = muc_helper:fresh_room_name(),
  121:         MucHost = muc_light_helper:muc_host(),
  122:         muc_light_helper:create_room(Room, MucHost, alice,
  123:                                      [], Config, muc_light_helper:ver(1)),
  124:         escalus_assert:has_no_stanzas(Alice),
  125:         RoomAddr = <<Room/binary, "@", MucHost/binary>>,
  126:         escalus:send(Alice, escalus_stanza:groupchat_to(RoomAddr, <<"text">>)),
  127:         M = escalus:wait_for_stanza(Alice),
  128:         escalus:assert(is_message, M),
  129:         escalus_assert:has_no_stanzas(Alice),
  130:         mam_helper:wait_for_room_archive_size(MucHost, Room, 1),
  131:         escalus:send(Alice, escalus_stanza:to(stanza_archive_request(P, <<"q1">>), RoomAddr)),
  132:         [Msg] = respond_messages(assert_respond_size(1, wait_archive_respond(Alice))),
  133:         verify_has_some_hash(Msg)
  134:         end,
  135:     escalus:fresh_story_with_config(Config0, [{alice, 1}], F).
  136: 
  137: verify_has_some_hash(Msg) ->
  138:     Hash = exml_query:path(Msg, [{element, <<"result">>},
  139:                                  {element, <<"some_hash">>},
  140:                                  {attr, <<"value">>}]),
  141:     binary_to_integer(Hash). %% is integer