1: -module(persistent_cluster_id_SUITE). 2: 3: -include_lib("common_test/include/ct.hrl"). 4: -include_lib("eunit/include/eunit.hrl"). 5: 6: %% API 7: -export([all/0, 8: groups/0, 9: init_per_suite/1, 10: end_per_suite/1, 11: group/1, 12: init_per_group/2, 13: end_per_group/2, 14: init_per_testcase/2, 15: end_per_testcase/2]). 16: 17: %% test cases 18: -export([ 19: all_nodes_in_the_cluster_have_the_same_cluster_id/1, 20: id_persists_after_restart/1, 21: same_cluster_id_in_backend_and_mnesia/1, 22: backed_up_id_if_rdbms_is_added/1, 23: cluster_id_is_restored_to_mnesia_from_rdbms_if_mnesia_lost/1 24: ]). 25: 26: -import(distributed_helper, [mim/0, mim2/0]). 27: 28: -import(domain_helper, [host_type/0]). 29: 30: all() -> 31: [ 32: {group, mnesia}, 33: {group, rdbms} 34: ]. 35: 36: tests() -> 37: [ 38: all_nodes_in_the_cluster_have_the_same_cluster_id, 39: id_persists_after_restart, 40: same_cluster_id_in_backend_and_mnesia, 41: backed_up_id_if_rdbms_is_added, 42: cluster_id_is_restored_to_mnesia_from_rdbms_if_mnesia_lost 43: ]. 44: 45: groups() -> 46: [ 47: {mnesia, [], [all_nodes_in_the_cluster_have_the_same_cluster_id]}, 48: {rdbms, [], tests()} 49: ]. 50: 51: %%%=================================================================== 52: %%% Overall setup/teardown 53: %%%=================================================================== 54: init_per_suite(Config) -> 55: Config. 56: 57: end_per_suite(_Config) -> 58: ok. 59: 60: %%%=================================================================== 61: %%% Group specific setup/teardown 62: %%%=================================================================== 63: group(_Groupname) -> 64: []. 65: 66: init_per_group(mnesia, Config) -> 67: case not mongoose_helper:is_rdbms_enabled(host_type()) of 68: true -> Config; 69: false -> {skip, require_no_rdbms} 70: end; 71: init_per_group(_Groupname, Config) -> 72: case mongoose_helper:is_rdbms_enabled(host_type()) of 73: true -> Config; 74: false -> {skip, require_rdbms} 75: end. 76: 77: end_per_group(_Groupname, _Config) -> 78: ok. 79: 80: %%%=================================================================== 81: %%% Testcase specific setup/teardown 82: %%%=================================================================== 83: init_per_testcase(all_nodes_in_the_cluster_have_the_same_cluster_id, Config) -> 84: distributed_helper:add_node_to_cluster(mim2(), Config), 85: Config; 86: init_per_testcase(_TestCase, Config) -> 87: Config. 88: 89: end_per_testcase(all_nodes_in_the_cluster_have_the_same_cluster_id, Config) -> 90: distributed_helper:remove_node_from_cluster(mim2(), Config), 91: Config; 92: end_per_testcase(_TestCase, _Config) -> 93: ok. 94: 95: %%%=================================================================== 96: %%% Individual Test Cases (from groups() definition) 97: %%%=================================================================== 98: all_nodes_in_the_cluster_have_the_same_cluster_id(_Config) -> 99: {ok, ID_mim1} = mongoose_helper:successful_rpc( 100: mim(), mongoose_cluster_id, get_cached_cluster_id, []), 101: {ok, ID_mim2} = mongoose_helper:successful_rpc( 102: mim2(), mongoose_cluster_id, get_cached_cluster_id, []), 103: ?assertEqual(ID_mim1, ID_mim2). 104: 105: id_persists_after_restart(_Config) -> 106: {ok, FirstID} = mongoose_helper:successful_rpc( 107: mim(), mongoose_cluster_id, get_cached_cluster_id, []), 108: ejabberd_node_utils:restart_application(mongooseim), 109: {ok, SecondID} = mongoose_helper:successful_rpc( 110: mim(), mongoose_cluster_id, get_cached_cluster_id, []), 111: ?assertEqual(FirstID, SecondID). 112: 113: same_cluster_id_in_backend_and_mnesia(_Config) -> 114: {ok, MnesiaID} = mongoose_helper:successful_rpc( 115: mim(), mongoose_cluster_id, get_cached_cluster_id, []), 116: {ok, BackendID} = mongoose_helper:successful_rpc( 117: mim(), mongoose_cluster_id, get_backend_cluster_id, []), 118: ?assertEqual(MnesiaID, BackendID). 119: 120: backed_up_id_if_rdbms_is_added(_Config) -> 121: ok = mongoose_helper:successful_rpc( 122: mim(), mongoose_cluster_id, clean_table, []), 123: {ok, MnesiaID} = mongoose_helper:successful_rpc( 124: mim(), mongoose_cluster_id, get_cached_cluster_id, []), 125: {error, no_value_in_backend} = mongoose_helper:successful_rpc( 126: mim(), mongoose_cluster_id, get_backend_cluster_id, []), 127: {ok, AfterRestartID} = mongoose_helper:successful_rpc( 128: mim(), mongoose_cluster_id, start, []), 129: {ok, BackendID} = mongoose_helper:successful_rpc( 130: mim(), mongoose_cluster_id, get_backend_cluster_id, []), 131: ?assertEqual(AfterRestartID, MnesiaID), 132: ?assertEqual(AfterRestartID, BackendID). 133: 134: cluster_id_is_restored_to_mnesia_from_rdbms_if_mnesia_lost(_Config) -> 135: {ok, FirstID} = mongoose_helper:successful_rpc( 136: mim(), mongoose_cluster_id, get_cached_cluster_id, []), 137: %% mongoose_cluster:leave/0 does everything we need here: 138: %% it stops the node, deletes everything related to mnesia from the system, 139: %% the hardcore way, removing folders from the OS and so on, and restarts the node. 140: %% Assuming this works correctly, then we can be sure that "mnesia files were lost". 141: Node = mim(), 142: ok = distributed_helper:rpc( 143: Node#{timeout => timer:seconds(30)}, mongoose_cluster, leave, []), 144: {ok, SecondID} = mongoose_helper:successful_rpc( 145: Node, mongoose_cluster_id, get_cached_cluster_id, []), 146: ?assertEqual(FirstID, SecondID).