blob: 97b1692fa09cd5ff6109bc70c2037c5a6cd6afce [file]
% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.
-module(mem3_seeds_test).
-include_lib("couch/include/couch_eunit.hrl").
-define(FAKE_NODES, ['couchdb@node1.example.com', 'couchdb@node2.example.com']).
mem3_seeds_test_() ->
{
foreach,
fun setup/0,
fun teardown/1,
[
?TDEF_FE(t_empty_seedlist_status_ok),
?TDEF_FE(t_seedlist_misconfiguration),
?TDEF_FE(t_seedlist_replicate_all),
?TDEF_FE(t_seedlist_replicate_partial),
?TDEF_FE(t_check_nodelist),
?TDEF_FE(t_check_local_dbs)
]
}.
t_empty_seedlist_status_ok(_) ->
ok = application:start(mem3),
{ok, Result = #{}} = mem3_seeds:get_status(),
?assertMatch(#{seeds := _, status := ok}, Result).
t_seedlist_misconfiguration(_) ->
CfgSeeds = string:join([atom_to_list(N) || N <- ?FAKE_NODES], ","),
config:set("cluster", "seedlist", CfgSeeds, false),
ok = application:start(mem3),
{ok, Result = #{seeds := Seeds}} = mem3_seeds:get_status(),
?assertEqual(2, map_size(Seeds)),
?assertMatch(#{'couchdb@node1.example.com' := _}, Seeds),
?assertMatch(#{'couchdb@node2.example.com' := _}, Seeds),
?assertMatch(#{status := seeding}, Result).
t_seedlist_replicate_all(_) ->
CfgSeeds = string:join([atom_to_list(N) || N <- ?FAKE_NODES], ","),
config:set("cluster", "seedlist", CfgSeeds, false),
mock_rep(?FAKE_NODES, {ok, 0}),
meck:reset(mem3_seeds),
ok = application:start(mem3),
meck:wait(mem3_seeds, handle_info, [{'DOWN', '_', '_', '_', '_'}, '_'], 4000),
{ok, Result = #{seeds := Seeds}} = mem3_seeds:get_status(),
?assertEqual(2, map_size(Seeds)),
?assertMatch(#{'couchdb@node1.example.com' := _}, Seeds),
?assertMatch(#{'couchdb@node2.example.com' := _}, Seeds),
?assertMatch(#{status := ok}, Result).
t_seedlist_replicate_partial(_) ->
CfgSeeds = string:join([atom_to_list(N) || N <- ?FAKE_NODES], ","),
config:set("cluster", "seedlist", CfgSeeds, false),
mock_rep(?FAKE_NODES, {ok, 42}),
meck:reset(mem3_seeds),
ok = application:start(mem3),
meck:wait(mem3_seeds, handle_info, [{'DOWN', '_', '_', '_', '_'}, '_'], 4000),
{ok, Result = #{seeds := Seeds}} = mem3_seeds:get_status(),
?assertEqual(2, map_size(Seeds)),
?assertMatch(#{'couchdb@node1.example.com' := _}, Seeds),
?assertMatch(#{'couchdb@node2.example.com' := _}, Seeds),
?assertMatch(#{status := seeding}, Result).
t_check_nodelist(_) ->
CfgSeeds = string:join([atom_to_list(N) || N <- ?FAKE_NODES], ","),
config:set("cluster", "seedlist", CfgSeeds, false),
ok = application:start(mem3),
Nodes = mem3:nodes(),
?assert(lists:member('couchdb@node1.example.com', Nodes)),
?assert(lists:member('couchdb@node2.example.com', Nodes)).
t_check_local_dbs(_) ->
LocalDbs = mem3_sync:local_dbs(),
{ok, _} = couch_server:create(<<"_users">>, []),
?assertEqual(
lists:append(LocalDbs, [<<"_users">>]),
mem3_sync:local_dbs()
).
mock_rep(Nodes, Result) ->
ResultDbs = [{DbName, Result} || DbName <- mem3_sync:local_dbs()],
meck:expect(mem3_rpc, pull_replication, fun(Node) ->
case lists:member(Node, Nodes) of
true -> ResultDbs;
false -> meck:passthrough()
end
end).
setup() ->
meck:new(mem3_seeds, [passthrough]),
meck:new(mem3_rpc, [passthrough]),
test_util:start_couch([rexi]).
teardown(Ctx) ->
catch application:stop(mem3),
config:delete("cluster", "seedlist", false),
Filename = config:get("mem3", "nodes_db", "_nodes") ++ ".couch",
file:delete(filename:join([?BUILDDIR(), "data", Filename])),
case config:get("couch_httpd_auth", "authentication_db") of
undefined -> ok;
DbName -> couch_server:delete(list_to_binary(DbName), [])
end,
meck:unload(),
test_util:stop_couch(Ctx).