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]"). -logger_header("[Flapping]").
-export([start_link/0]). -export([start_link/0, stop/0]).
%% API %% API
-export([check/1, detect/1]). -export([check/1, detect/1]).
@ -66,6 +66,8 @@
start_link() -> start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
stop() -> gen_server:stop(?MODULE).
%% @doc Check flapping when a MQTT client connected. %% @doc Check flapping when a MQTT client connected.
-spec(check(emqx_types:client()) -> boolean()). -spec(check(emqx_types:client()) -> boolean()).
check(#{zone := Zone, client_id := ClientId}) -> check(#{zone := Zone, client_id := ClientId}) ->
@ -109,7 +111,7 @@ detect(#{client_id := ClientId, peername := Peername},
-spec(is_enabled(emqx_types:zone()) -> boolean()). -spec(is_enabled(emqx_types:zone()) -> boolean()).
is_enabled(Zone) -> is_enabled(Zone) ->
emqx_zone:get(Zone, enable_flapping_detect, false). emqx_zone:get_env(Zone, enable_flapping_detect, false).
get_policy() -> get_policy() ->
emqx:get_env(flapping_detect_policy, ?DEFAULT_DETECT_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]}, [{'<', '$1', NowTime-Duration}], [true]},
{#flapping{client_id = {banned, '_'}, banned_at = '$1', _ = '_'}, {#flapping{client_id = {banned, '_'}, banned_at = '$1', _ = '_'},
[{'<', '$1', NowTime-Interval}], [true]}]). [{'<', '$1', NowTime-Interval}], [true]}]).

View File

@ -22,34 +22,34 @@
all() -> emqx_ct:all(?MODULE). all() -> emqx_ct:all(?MODULE).
init_per_suite(Config) -> init_per_suite(Config) ->
emqx_ct_helpers:start_apps([]), prepare_env(),
prepare_for_test(),
Config. 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) -> end_per_suite(_Config) ->
emqx_ct_helpers:stop_apps([]). ok.
%% t_flapping(_Config) -> t_detect_check(_) ->
%% process_flag(trap_exit, true), {ok, _Pid} = emqx_flapping:start_link(),
%% flapping_connect(5), Client = #{zone => external,
%% {ok, C} = emqtt:start_link([{client_id, <<"Client">>}]), client_id => <<"clientid">>,
%% {error, _} = emqtt:connect(C), peername => {{127,0,0,1}, 5000}
%% receive },
%% {'EXIT', Client, _Reason} -> false = emqx_flapping:detect(Client),
%% ct:log("receive exit signal, Client: ~p", [Client]) false = emqx_flapping:check(Client),
%% after 1000 -> false = emqx_flapping:detect(Client),
%% ct:log("timeout") false = emqx_flapping:check(Client),
%% end. 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).