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