Bläddra i källkod

Add a test case to cover timeout message flush in emqx_misc

spring2maz 7 år sedan
förälder
incheckning
f75a624197
2 ändrade filer med 11 tillägg och 5 borttagningar
  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).
 
 -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 ->
             receive {timeout, Timer, _} -> ok after 0 -> ok end;
         _ -> ok
-    end.
+    end;
+cancel_timer(_) -> ok.
 
 -spec(proc_name(atom(), pos_integer()) -> atom()).
 proc_name(Mod, Id) ->

+ 7 - 0
test/emqx_misc_tests.erl

@@ -15,6 +15,13 @@
 -module(emqx_misc_tests).
 -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() ->
     with_env(
       [{conn_max_msg_queue_len, 0},