Add a test case for the new flapping module
This commit is contained in:
parent
0a1679b122
commit
a3daa533e7
|
@ -24,7 +24,7 @@
|
|||
|
||||
-logger_header("[Flapping]").
|
||||
|
||||
-export([start_link/0]).
|
||||
-export([start_link/0, stop/0]).
|
||||
|
||||
%% API
|
||||
-export([check/1, detect/1]).
|
||||
|
@ -66,6 +66,8 @@
|
|||
start_link() ->
|
||||
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
|
||||
|
||||
stop() -> gen_server:stop(?MODULE).
|
||||
|
||||
%% @doc Check flapping when a MQTT client connected.
|
||||
-spec(check(emqx_types:client()) -> boolean()).
|
||||
check(#{zone := Zone, client_id := ClientId}) ->
|
||||
|
@ -109,7 +111,7 @@ detect(#{client_id := ClientId, peername := Peername},
|
|||
|
||||
-spec(is_enabled(emqx_types:zone()) -> boolean()).
|
||||
is_enabled(Zone) ->
|
||||
emqx_zone:get(Zone, enable_flapping_detect, false).
|
||||
emqx_zone:get_env(Zone, enable_flapping_detect, false).
|
||||
|
||||
get_policy() ->
|
||||
emqx:get_env(flapping_detect_policy, ?DEFAULT_DETECT_POLICY).
|
||||
|
@ -197,3 +199,4 @@ expire_flapping(NowTime, #{duration := Duration, banned_interval := Interval}) -
|
|||
[{'<', '$1', NowTime-Duration}], [true]},
|
||||
{#flapping{client_id = {banned, '_'}, banned_at = '$1', _ = '_'},
|
||||
[{'<', '$1', NowTime-Interval}], [true]}]).
|
||||
|
||||
|
|
|
@ -22,34 +22,34 @@
|
|||
all() -> emqx_ct:all(?MODULE).
|
||||
|
||||
init_per_suite(Config) ->
|
||||
emqx_ct_helpers:start_apps([]),
|
||||
prepare_for_test(),
|
||||
prepare_env(),
|
||||
Config.
|
||||
|
||||
prepare_env() ->
|
||||
emqx_zone:set_env(external, enable_flapping_detect, true),
|
||||
application:set_env(emqx, flapping_detect_policy,
|
||||
#{threshold => 3,
|
||||
duration => 100,
|
||||
banned_interval => 200
|
||||
}).
|
||||
|
||||
end_per_suite(_Config) ->
|
||||
emqx_ct_helpers:stop_apps([]).
|
||||
ok.
|
||||
|
||||
%% t_flapping(_Config) ->
|
||||
%% process_flag(trap_exit, true),
|
||||
%% flapping_connect(5),
|
||||
%% {ok, C} = emqtt:start_link([{client_id, <<"Client">>}]),
|
||||
%% {error, _} = emqtt:connect(C),
|
||||
%% receive
|
||||
%% {'EXIT', Client, _Reason} ->
|
||||
%% ct:log("receive exit signal, Client: ~p", [Client])
|
||||
%% after 1000 ->
|
||||
%% ct:log("timeout")
|
||||
%% end.
|
||||
t_detect_check(_) ->
|
||||
{ok, _Pid} = emqx_flapping:start_link(),
|
||||
Client = #{zone => external,
|
||||
client_id => <<"clientid">>,
|
||||
peername => {{127,0,0,1}, 5000}
|
||||
},
|
||||
false = emqx_flapping:detect(Client),
|
||||
false = emqx_flapping:check(Client),
|
||||
false = emqx_flapping:detect(Client),
|
||||
false = emqx_flapping:check(Client),
|
||||
true = emqx_flapping:detect(Client),
|
||||
timer:sleep(50),
|
||||
true = emqx_flapping:check(Client),
|
||||
timer:sleep(300),
|
||||
false = emqx_flapping:check(Client),
|
||||
ok = emqx_flapping:stop().
|
||||
|
||||
flapping_connect(Times) ->
|
||||
lists:foreach(fun do_connect/1, lists:seq(1, Times)).
|
||||
|
||||
do_connect(_I) ->
|
||||
{ok, C} = emqtt:start_link([{client_id, <<"Client">>}]),
|
||||
{ok, _} = emqtt:connect(C),
|
||||
ok = emqtt:disconnect(C).
|
||||
|
||||
prepare_for_test() ->
|
||||
ok = emqx_zone:set_env(external, enable_flapping_detect, true),
|
||||
ok = emqx_zone:set_env(external, flapping_threshold, {10, 60}),
|
||||
ok = emqx_zone:set_env(external, flapping_expiry_interval, 3600).
|
||||
|
|
Loading…
Reference in New Issue