فهرست منبع

Add a test case to cover timeout message flush in emqx_misc

spring2maz 7 سال پیش
والد
کامیت
f75a624197
2فایلهای تغییر یافته به همراه11 افزوده شده و 5 حذف شده
  1. 4 5
      src/emqx_misc.erl
  2. 7 0
      test/emqx_misc_tests.erl

+ 4 - 5
src/emqx_misc.erl

@@ -36,14 +36,13 @@ start_timer(Interval, Dest, Msg) ->
     erlang:start_timer(Interval, Dest, Msg).
     erlang:start_timer(Interval, Dest, Msg).
 
 
 -spec(cancel_timer(undefined | reference()) -> ok).
 -spec(cancel_timer(undefined | reference()) -> ok).
-cancel_timer(undefined) ->
-    ok;
-cancel_timer(Timer) ->
-    case catch erlang:cancel_timer(Timer) of
+cancel_timer(Timer) when is_reference(Timer) ->
+    case erlang:cancel_timer(Timer) of
         false ->
         false ->
             receive {timeout, Timer, _} -> ok after 0 -> ok end;
             receive {timeout, Timer, _} -> ok after 0 -> ok end;
         _ -> ok
         _ -> ok
-    end.
+    end;
+cancel_timer(_) -> ok.
 
 
 -spec(proc_name(atom(), pos_integer()) -> atom()).
 -spec(proc_name(atom(), pos_integer()) -> atom()).
 proc_name(Mod, Id) ->
 proc_name(Mod, Id) ->

+ 7 - 0
test/emqx_misc_tests.erl

@@ -15,6 +15,13 @@
 -module(emqx_misc_tests).
 -module(emqx_misc_tests).
 -include_lib("eunit/include/eunit.hrl").
 -include_lib("eunit/include/eunit.hrl").
 
 
+timer_cancel_flush_test() ->
+    Timer = emqx_misc:start_timer(0, foo),
+    ok = emqx_misc:cancel_timer(Timer),
+    receive {timeout, Timer, foo} -> error(unexpected)
+    after 0 -> ok
+    end.
+
 shutdown_disabled_test() ->
 shutdown_disabled_test() ->
     with_env(
     with_env(
       [{conn_max_msg_queue_len, 0},
       [{conn_max_msg_queue_len, 0},