From a3daa533e7406d61c978aaa831470eff404336ea Mon Sep 17 00:00:00 2001 From: Feng Lee Date: Tue, 10 Sep 2019 16:12:40 +0800 Subject: [PATCH] Add a test case for the new flapping module --- src/emqx_flapping.erl | 7 +++-- test/emqx_flapping_SUITE.erl | 52 ++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/emqx_flapping.erl b/src/emqx_flapping.erl index dc507433f..23a2696de 100644 --- a/src/emqx_flapping.erl +++ b/src/emqx_flapping.erl @@ -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]}]). + diff --git a/test/emqx_flapping_SUITE.erl b/test/emqx_flapping_SUITE.erl index a36d21c2a..493a57b6e 100644 --- a/test/emqx_flapping_SUITE.erl +++ b/test/emqx_flapping_SUITE.erl @@ -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).