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]").
|
-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]}]).
|
||||||
|
|
||||||
|
|
|
@ -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).
|
|
||||||
|
|
Loading…
Reference in New Issue