mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
172 lines
5.6 KiB
Erlang
172 lines
5.6 KiB
Erlang
%% SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
-module(gateway_cluster_discovery_tests).
|
|
-typing([eqwalizer]).
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
-define(PEERS_KEY, {gateway_cluster_discovery, peers}).
|
|
|
|
ip_addrs_to_peers_filters_self_test() ->
|
|
Self = node(),
|
|
SelfStr = atom_to_list(Self),
|
|
case string:split(SelfStr, "@") of
|
|
[Base, HostStr] ->
|
|
case inet:parse_address(HostStr) of
|
|
{ok, SelfAddr} ->
|
|
Others = other_ip_addrs(),
|
|
Peers = gateway_cluster_discovery:ip_addrs_to_peers(
|
|
[SelfAddr | Others], Base
|
|
),
|
|
?assertNot(lists:member(Self, Peers)),
|
|
?assertEqual(2, length(Peers));
|
|
_ ->
|
|
Peers = gateway_cluster_discovery:ip_addrs_to_peers(
|
|
other_ip_addrs(), Base
|
|
),
|
|
?assertEqual(2, length(Peers))
|
|
end;
|
|
_ ->
|
|
ok
|
|
end.
|
|
|
|
ip_addrs_to_peers_sorts_and_dedups_test() ->
|
|
Peers = gateway_cluster_discovery:ip_addrs_to_peers(
|
|
[{10, 0, 0, 3}, {10, 0, 0, 1}, {10, 0, 0, 2}, {10, 0, 0, 1}], "n"
|
|
),
|
|
?assertEqual(
|
|
[
|
|
list_to_atom("[email protected]"),
|
|
list_to_atom("[email protected]"),
|
|
list_to_atom("[email protected]")
|
|
],
|
|
Peers
|
|
).
|
|
|
|
ip_addrs_to_peers_empty_test() ->
|
|
?assertEqual([], gateway_cluster_discovery:ip_addrs_to_peers([], "n")).
|
|
|
|
ip_addrs_to_peers_rejects_invalid_node_basename_test() ->
|
|
?assertEqual(
|
|
[],
|
|
gateway_cluster_discovery:ip_addrs_to_peers([{10, 0, 0, 1}], "bad node")
|
|
).
|
|
|
|
peers_defaults_to_empty_test() ->
|
|
persistent_term:erase(?PEERS_KEY),
|
|
?assertEqual([], gateway_cluster_discovery:peers()),
|
|
persistent_term:put(
|
|
?PEERS_KEY,
|
|
[list_to_atom("[email protected]")]
|
|
),
|
|
?assertEqual([list_to_atom("[email protected]")], gateway_cluster_discovery:peers()),
|
|
persistent_term:erase(?PEERS_KEY).
|
|
|
|
poll_with_undefined_dns_returns_empty_test() ->
|
|
persistent_term:erase(?PEERS_KEY),
|
|
State = base_state(#{dns_name => undefined}),
|
|
{Result, _} = gateway_cluster_discovery:poll(State),
|
|
?assertEqual([], Result).
|
|
|
|
poll_with_static_peers_uses_static_peers_test() ->
|
|
persistent_term:erase(?PEERS_KEY),
|
|
StaticPeers = [list_to_atom("[email protected]"), node(), list_to_atom("[email protected]")],
|
|
Resolver = fun(_Name) -> error(static_peer_resolver_called) end,
|
|
State = base_state(#{
|
|
static_peers => StaticPeers,
|
|
resolver => Resolver,
|
|
subscribers => []
|
|
}),
|
|
{Result, _} = gateway_cluster_discovery:poll(State),
|
|
?assertEqual(
|
|
[list_to_atom("[email protected]"), list_to_atom("[email protected]")],
|
|
Result
|
|
),
|
|
?assertEqual(Result, persistent_term:get(?PEERS_KEY)),
|
|
persistent_term:erase(?PEERS_KEY).
|
|
|
|
other_ip_addrs() ->
|
|
[{10, 0, 0, 2}, {10, 0, 0, 3}].
|
|
|
|
poll_publishes_peers_and_notifies_subscribers_test() ->
|
|
persistent_term:erase(?PEERS_KEY),
|
|
Self = self(),
|
|
Resolver = fun("svc.test") -> {ok, [{10, 0, 0, 1}, {10, 0, 0, 2}]} end,
|
|
State0 = base_state(#{
|
|
dns_name => "svc.test",
|
|
resolver => Resolver,
|
|
subscribers => [{Self, erlang:monitor(process, Self)}]
|
|
}),
|
|
{Peers, State1} = gateway_cluster_discovery:poll(State0),
|
|
?assertEqual(
|
|
[
|
|
list_to_atom("[email protected]"),
|
|
list_to_atom("[email protected]")
|
|
],
|
|
Peers
|
|
),
|
|
?assertEqual(Peers, persistent_term:get(?PEERS_KEY)),
|
|
receive
|
|
{cluster_peers_changed, P} -> ?assertEqual(Peers, P)
|
|
after 100 -> ?assert(false)
|
|
end,
|
|
{Peers2, _State2} = gateway_cluster_discovery:poll(State1),
|
|
?assertEqual(Peers, Peers2),
|
|
receive
|
|
{cluster_peers_changed, _} -> ?assert(false)
|
|
after 50 -> ok
|
|
end,
|
|
persistent_term:erase(?PEERS_KEY).
|
|
|
|
poll_with_resolver_error_keeps_old_peers_test() ->
|
|
persistent_term:erase(?PEERS_KEY),
|
|
gateway_cluster_metrics:reset_for_tests(),
|
|
OldPeers = [list_to_atom("[email protected]")],
|
|
Resolver = fun("svc.test") -> {error, nxdomain} end,
|
|
State = base_state(#{
|
|
dns_name => "svc.test",
|
|
resolver => Resolver,
|
|
peers => OldPeers
|
|
}),
|
|
{Result, _} = gateway_cluster_discovery:poll(State),
|
|
?assertEqual(OldPeers, Result),
|
|
Snapshot = gateway_cluster_metrics:snapshot(),
|
|
?assertEqual(1, maps:get(<<"gateway_cluster_discovery_resolve_failures_total">>, Snapshot)),
|
|
persistent_term:erase(?PEERS_KEY).
|
|
|
|
subscriber_messages_include_initial_state_test() ->
|
|
persistent_term:erase(?PEERS_KEY),
|
|
Self = self(),
|
|
InitialPeers = [list_to_atom("[email protected]")],
|
|
State = base_state(#{peers => InitialPeers}),
|
|
NewState = gateway_cluster_discovery:add_subscriber(Self, State),
|
|
receive
|
|
{cluster_peers_changed, P} -> ?assertEqual(InitialPeers, P)
|
|
after 100 -> ?assert(false)
|
|
end,
|
|
?assertMatch(#{subscribers := [{Self, _}]}, NewState),
|
|
persistent_term:erase(?PEERS_KEY).
|
|
|
|
subscriber_can_unsubscribe_test() ->
|
|
Self = self(),
|
|
State0 = base_state(#{}),
|
|
State1 = gateway_cluster_discovery:add_subscriber(Self, State0),
|
|
receive
|
|
{cluster_peers_changed, _} -> ok
|
|
after 100 -> ok
|
|
end,
|
|
State2 = gateway_cluster_discovery:remove_subscriber(Self, State1),
|
|
?assertEqual([], maps:get(subscribers, State2)).
|
|
|
|
base_state(Overrides) ->
|
|
Defaults = #{
|
|
dns_name => "svc.test",
|
|
node_basename => "n",
|
|
poll_interval_ms => 5000,
|
|
resolver => fun(_) -> {ok, []} end,
|
|
static_peers => [],
|
|
peers => [],
|
|
subscribers => [],
|
|
timer => undefined
|
|
},
|
|
maps:merge(Defaults, Overrides).
|