1: -module(mod_mam_meta_SUITE).
    2: -compile([export_all, nowarn_export_all]).
    3: 
    4: -include_lib("common_test/include/ct.hrl").
    5: -include_lib("eunit/include/eunit.hrl").
    6: 
    7: all() -> [
    8:           overrides_general_options,
    9:           sets_rdbms_as_default_backend,
   10:           handles_only_pm,
   11:           handles_only_muc,
   12:           disables_sync_writer_on_async_writer,
   13:           disables_sync_muc_writer_on_async_writer,
   14:           produces_valid_configurations,
   15:           handles_riak_config,
   16:           handles_cassandra_config,
   17:           example_muc_only_no_pref_good_performance,
   18:           example_pm_only_good_performance
   19:          ].
   20: 
   21: %% Tests
   22: 
   23: init_per_testcase(_, Config) -> Config.
   24: 
   25: end_per_testcase(_CaseName, Config) -> Config.
   26: 
   27: overrides_general_options(_Config) ->
   28:     Deps = deps([{backend, rdbms}, {pm, [{backend, cassandra}]}, {muc, []}]),
   29: 
   30:     ?assert(lists:keymember(mod_mam_cassandra_arch, 1, Deps)),
   31:     ?assert(lists:keymember(mod_mam_muc_rdbms_arch, 1, Deps)),
   32:     ?assertNot(lists:keymember(mod_mam_rdbms_arch, 1, Deps)).
   33: 
   34: 
   35: sets_rdbms_as_default_backend(_Config) ->
   36:     Deps = deps([{pm, []}]),
   37:     ?assert(lists:keymember(mod_mam_rdbms_arch, 1, Deps)).
   38: 
   39: 
   40: handles_only_pm(_Config) ->
   41:     Deps = deps([{pm, []}]),
   42:     ?assert(lists:keymember(mod_mam, 1, Deps)),
   43:     ?assertNot(lists:keymember(mod_mam_muc, 1, Deps)).
   44: 
   45: 
   46: handles_only_muc(_Config) ->
   47:     Deps = deps([{muc, []}]),
   48:     ?assertNot(lists:keymember(mod_mam, 1, Deps)),
   49:     ?assert(lists:keymember(mod_mam_muc, 1, Deps)).
   50: 
   51: 
   52: disables_sync_writer_on_async_writer(_Config) ->
   53:     Deps = deps([{pm, [{async_writer, []}]}]),
   54:     {_, Args, _} = lists:keyfind(mod_mam_rdbms_arch, 1, Deps),
   55:     ?assert(lists:member(no_writer, Args)).
   56: 
   57: 
   58: disables_sync_muc_writer_on_async_writer(_Config) ->
   59:     Deps = deps([{muc, [{async_writer, []}]}]),
   60:     {_, Args, _} = lists:keyfind(mod_mam_muc_rdbms_arch, 1, Deps),
   61:     ?assert(lists:member(no_writer, Args)).
   62: 
   63: 
   64: produces_valid_configurations(_Config) ->
   65:     Deps = deps([
   66:                  {backend, rdbms},
   67:                  cache_users,
   68: 
   69:                  {pm, [{user_prefs_store, rdbms}, archive_groupchats, {async_writer, [{enabled, false}]}]},
   70:                  {muc, [
   71:                         {host, <<"host">>},
   72:                         {rdbms_message_format, simple},
   73:                         {user_prefs_store, mnesia}
   74:                        ]}
   75:                 ]),
   76: 
   77:     ExpandedSimpleOpts = [{db_jid_format, mam_jid_rfc}, {db_message_format, mam_message_xml}],
   78: 
   79:     check_has_args(mod_mam, [{archive_groupchats, true}], Deps),
   80:     check_has_args(mod_mam_muc, [{host, <<"host">>}], Deps),
   81:     check_has_args(mod_mam_rdbms_arch, [pm], Deps),
   82:     check_has_args(mod_mam_muc_rdbms_arch, [no_writer | ExpandedSimpleOpts], Deps),
   83:     check_has_args(mod_mam_rdbms_user, [pm, muc], Deps),
   84:     check_has_args(mod_mam_cache_user, [pm, muc], Deps),
   85:     check_has_args(mod_mam_mnesia_prefs, [muc], Deps),
   86:     check_has_args(mod_mam_rdbms_prefs, [pm], Deps),
   87:     check_has_args(mod_mam_rdbms_arch_async, [{muc, []}], Deps),
   88: 
   89:     check_has_no_args(mod_mam_rdbms_arch, [muc, no_writer | ExpandedSimpleOpts], Deps),
   90:     check_has_no_args(mod_mam_mnesia_prefs, [pm], Deps),
   91:     check_has_no_args(mod_mam_rdbms_prefs, [muc], Deps).
   92: 
   93: 
   94: handles_riak_config(_Config) ->
   95:     Deps = deps([
   96:                  {backend, riak},
   97:                  {db_message_format, some_format},
   98:                  {pm, [{user_prefs_store, mnesia}]},
   99:                  {muc, []}
  100:                 ]),
  101: 
  102:     ?assert(lists:keymember(mod_mam, 1, Deps)),
  103:     ?assert(lists:keymember(mod_mam_muc, 1, Deps)),
  104:     check_has_args(mod_mam_riak_timed_arch_yz, [pm, muc], Deps),
  105:     check_has_args(mod_mam_riak_timed_arch_yz, [{db_message_format, some_format}], Deps),
  106:     check_has_args(mod_mam_mnesia_prefs, [pm], Deps),
  107:     check_has_no_args(mod_mam_mnesia_prefs, [muc], Deps).
  108: 
  109: 
  110: handles_cassandra_config(_Config) ->
  111:     Deps = deps([
  112:                  {backend, cassandra},
  113:                  simple,
  114:                  {pm, [{user_prefs_store, cassandra}, {db_message_format, some_format}]},
  115:                  {muc, [{user_prefs_store, mnesia}, {pool_name, some_poolname}]}
  116:                 ]),
  117: 
  118:     check_has_args(mod_mam_mnesia_prefs, [muc], Deps),
  119:     check_has_args(mod_mam_cassandra_prefs, [pm], Deps),
  120:     check_has_args(mod_mam_cassandra_arch, [{db_message_format, some_format}, {simple, true}], Deps),
  121:     check_has_args(mod_mam_muc_cassandra_arch, [{pool_name, some_poolname}, {simple, true}], Deps),
  122:     check_has_no_args(mod_mam_cassandra_arch, [{pool_name, some_poolname}], Deps),
  123:     check_has_no_args(mod_mam_muc_cassandra_arch, [{db_message_format, some_format}], Deps).
  124: 
  125: 
  126: example_muc_only_no_pref_good_performance(_Config) ->
  127:     Deps = deps([
  128:                  cache_users,
  129:                  {async_writer, []},
  130:                  {muc, [{host, "muc.@HOST@"}]}
  131:                 ]),
  132: 
  133:     check_equal_deps([
  134:                       {mod_mam_rdbms_user, [muc, pm]},
  135:                       {mod_mam_cache_user, [muc]},
  136:                       %% 'muc' argument is ignored by the module
  137:                       {mod_mam_muc_rdbms_arch, [muc, no_writer]},
  138:                       %% 'muc' argument is ignored by the module
  139:                       {mod_mam_rdbms_arch_async, [{muc, []}]},
  140:                       {mod_mam_muc, [{async_writer, []}, {host, "muc.@HOST@"}]}
  141:                      ], Deps).
  142: 
  143: 
  144: example_pm_only_good_performance(_Config) ->
  145:     Deps = deps([
  146:                  {pm, []},
  147:                  cache_users,
  148:                  {async_writer, []},
  149:                  {user_prefs_store, mnesia}
  150:                 ]),
  151: 
  152:     check_equal_deps([
  153:                       {mod_mam_rdbms_user, [pm]},
  154:                       {mod_mam_cache_user, [pm]},
  155:                       {mod_mam_mnesia_prefs, [pm]},
  156:                       {mod_mam_rdbms_arch, [pm, no_writer]},
  157:                       {mod_mam_rdbms_arch_async, [{pm, []}]},
  158:                       {mod_mam, [{async_writer, []}]}
  159:                      ], Deps).
  160: 
  161: %% Helpers
  162: 
  163: check_equal_deps(A, B) ->
  164:     ?assertEqual(sort_deps(A), sort_deps(B)).
  165: 
  166: 
  167: sort_deps(Deps) ->
  168:     lists:map(
  169:       fun
  170:           ({Mod, ArgsOrHardness}) -> {Mod, lists:sort(ArgsOrHardness)};
  171:           ({Mod, Args, _Hardness}) -> {Mod, lists:sort(Args)}
  172:       end,
  173:       lists:keysort(1, Deps)).
  174: 
  175: 
  176: check_has_no_args(Mod, Args, Deps) ->
  177:     {_, ActualArgs, _} = lists:keyfind(Mod, 1, Deps),
  178:     ?assertEqual([], ordsets:intersection(
  179:                        ordsets:from_list(Args), ordsets:from_list(ActualArgs))).
  180: 
  181: check_has_args(Mod, Args, Deps) ->
  182:     {_, ActualArgs, _} = lists:keyfind(Mod, 1, Deps),
  183:     ?assert(ordsets:is_subset(
  184:               ordsets:from_list(Args), ordsets:from_list(ActualArgs))).
  185: 
  186: deps(Args) ->
  187:     mod_mam_meta:deps(<<"host">>, Args).