Add a test case for the new flapping module

This commit is contained in:
Feng Lee 2019-09-10 16:12:40 +08:00
parent 0a1679b122
commit a3daa533e7
2 changed files with 31 additions and 28 deletions

View File

@ -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]}]).

View File

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