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, [{backend, rdbms}, {pm, []}, {muc, [{host, MH}]},
   80:                      {send_message, mam_send_message_example}]},
   81:      {mod_muc_light, [{host, subhost_pattern(muc_light_helper:muc_host_pattern())},
   82:                       {backend, mongoose_helper:mnesia_or_rdbms_backend()}]},
   83:      {mam_send_message_example, []}].
   84: 
   85: load_custom_module() ->
   86:     mam_send_message_example:module_info(),
   87:     {Mod, Code, File} = code:get_object_code(mam_send_message_example),
   88:     rpc(mim(), code, load_binary, [Mod, File, Code]).
   89: 
   90: %%%===================================================================
   91: %%% Testcase specific setup/teardown
   92: %%%===================================================================
   93: 
   94: init_per_testcase(TestCase, Config) ->
   95:     escalus:init_per_testcase(TestCase, Config).
   96: 
   97: end_per_testcase(TestCase, Config) ->
   98:     escalus:end_per_testcase(TestCase, Config).
   99: 
  100: %%%===================================================================
  101: %%% Test Cases
  102: %%%===================================================================
  103: 
  104: mam_pm_send_message(Config) ->
  105:     P = ?config(props, Config),
  106:     F = fun(Alice, Bob) ->
  107:         escalus:send(Alice, escalus_stanza:chat_to(Bob, <<"OH, HAI!">>)),
  108:         escalus:wait_for_stanza(Bob),
  109:         mam_helper:wait_for_archive_size(Alice, 1),
  110:         mam_helper:wait_for_archive_size(Bob, 1),
  111:         escalus:send(Alice, stanza_archive_request(P, <<"q1">>)),
  112:         Res = wait_archive_respond(Alice),
  113:         assert_respond_size(1, Res),
  114:         [Msg] = respond_messages(Res),
  115:         verify_has_some_hash(Msg)
  116:         end,
  117:     escalus:fresh_story(Config, [{alice, 1}, {bob, 1}], F).
  118: 
  119: mam_muc_send_message(Config0) ->
  120:     F = fun(Config, Alice) ->
  121:         P = ?config(props, Config),
  122:         Room = muc_helper:fresh_room_name(),
  123:         MucHost = muc_light_helper:muc_host(),
  124:         muc_light_helper:create_room(Room, MucHost, alice,
  125:                                      [], Config, muc_light_helper:ver(1)),
  126:         escalus_assert:has_no_stanzas(Alice),
  127:         RoomAddr = <<Room/binary, "@", MucHost/binary>>,
  128:         escalus:send(Alice, escalus_stanza:groupchat_to(RoomAddr, <<"text">>)),
  129:         M = escalus:wait_for_stanza(Alice),
  130:         escalus:assert(is_message, M),
  131:         escalus_assert:has_no_stanzas(Alice),
  132:         mam_helper:wait_for_room_archive_size(MucHost, Room, 1),
  133:         escalus:send(Alice, escalus_stanza:to(stanza_archive_request(P, <<"q1">>), RoomAddr)),
  134:         [Msg] = respond_messages(assert_respond_size(1, wait_archive_respond(Alice))),
  135:         verify_has_some_hash(Msg)
  136:         end,
  137:     escalus:fresh_story_with_config(Config0, [{alice, 1}], F).
  138: 
  139: verify_has_some_hash(Msg) ->
  140:     Hash = exml_query:path(Msg, [{element, <<"result">>},
  141:                                  {element, <<"some_hash">>},
  142:                                  {attr, <<"value">>}]),
  143:     binary_to_integer(Hash). %% is integer