Przeglądaj źródła

test(emqx_hook): Fix flaky t_add_hook_order test

ieQu1 4 lat temu
rodzic
commit
87d7698e1e
1 zmienionych plików z 14 dodań i 4 usunięć
  1. 14 4
      apps/emqx/test/emqx_hooks_SUITE.erl

+ 14 - 4
apps/emqx/test/emqx_hooks_SUITE.erl

@@ -46,7 +46,9 @@ end_per_testcase(_) ->
 %     error('TODO').
 
 t_add_hook_order(_) ->
-    ?assert(proper:quickcheck(add_hook_order_prop(), [{on_output, fun ct:print/2}])).
+    ?assert(proper:quickcheck(add_hook_order_prop(),
+                              [{on_output, fun ct:print/2},
+                               {numtests, 1000}])).
 
 add_hook_order_prop() ->
     %% Note: order is inversed, since higher prio hooks run first:
@@ -55,11 +57,10 @@ add_hook_order_prop() ->
                              (Prio1 =:= Prio2 andalso {M1, F1} =< {M2, F2})
                  end,
     ?FORALL(
-       Hooks0, list({range(-1, 5), atom(), atom()}),
+       Hooks, hooks(),
        try
-           Hooks = sets:to_list(sets:from_list(Hooks0)),
            {ok, _} = emqx_hooks:start_link(),
-           [emqx:hook(prop_hook, {M, F, []}, Prio) || {Prio, M, F} <- Hooks],
+           [ok = emqx:hook(prop_hook, {M, F, []}, Prio) || {Prio, M, F} <- Hooks],
            Callbacks = emqx_hooks:lookup(prop_hook),
            Order = [{Prio, M, F} || {callback, {M, F, _}, _Filter, Prio} <- Callbacks],
            ?assertEqual(lists:sort(Comparator, Hooks),
@@ -69,6 +70,15 @@ add_hook_order_prop() ->
            emqx_hooks:stop()
        end).
 
+hooks() ->
+    ?SUCHTHAT(L0, list({range(-1, 5), atom(), atom()}),
+              begin
+                  %% Duplicate callbacks are ignored, so check that
+                  %% all callbacks are unique:
+                  L = [{M, F} || {_Prio, M, F} <- L0],
+                  length(lists:usort(L)) =:= length(L0)
+              end).
+
 t_add_put_del_hook(_) ->
     {ok, _} = emqx_hooks:start_link(),
     ok = emqx:hook(test_hook, {?MODULE, hook_fun1, []}),