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