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