Просмотр исходного кода

test(client): verify `idle_timeout` more thoroughly

Andrew Mayorov 1 год назад
Родитель
Сommit
1809ce923f
1 измененных файлов с 45 добавлено и 10 удалено
  1. 45 10
      apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl

+ 45 - 10
apps/emqx/test/emqx_mqtt_protocol_v5_SUITE.erl

@@ -21,6 +21,7 @@
 
 -include_lib("emqx/include/emqx_mqtt.hrl").
 -include_lib("eunit/include/eunit.hrl").
+-include_lib("emqx/include/asserts.hrl").
 -include_lib("snabbkaffe/include/snabbkaffe.hrl").
 -include_lib("common_test/include/ct.hrl").
 
@@ -323,24 +324,62 @@ t_connect_will_retain(Config) ->
     ok = emqtt:disconnect(Client4),
     clean_retained(Topic, Config).
 
-t_connect_idle_timeout(_Config) ->
+t_connect_silent_idle_timeout(init, Config) ->
     IdleTimeout = 2000,
     emqx_config:put_zone_conf(default, [mqtt, idle_timeout], IdleTimeout),
+    ok = snabbkaffe:start_trace(),
+    [{idle_timeout, IdleTimeout} | Config];
+t_connect_silent_idle_timeout('end', _Config) ->
+    snabbkaffe:stop(),
+    emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
+    ok.
+
+t_connect_silent_idle_timeout(Config) ->
+    %% Connect, send nothing more.
+    %% Connection should be dropped in roughly `IdleTimeout` ms.
+    IdleTimeout = ?config(idle_timeout, Config),
+    emqx_config:put_zone_conf(default, [mqtt, idle_timeout], IdleTimeout),
+    SockOpts = [binary, {active, true}, {nodelay, true}],
+    {ok, Sock} = gen_tcp:connect({127, 0, 0, 1}, 1883, SockOpts, 5000),
+    ?assertReceive({tcp_closed, Sock}, IdleTimeout * 2),
+    ?assertMatch(
+        {ok, #{reason := {shutdown, idle_timeout}}},
+        ?block_until(#{?snk_kind := terminate}, IdleTimeout)
+    ).
+
+t_connect_idle_timeout(init, Config) ->
+    IdleTimeout = 2000,
+    emqx_config:put_zone_conf(default, [mqtt, idle_timeout], IdleTimeout),
+    ok = snabbkaffe:start_trace(),
+    [{idle_timeout, IdleTimeout} | Config];
+t_connect_idle_timeout('end', _Config) ->
+    snabbkaffe:stop(),
+    emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
+    ok.
+
+t_connect_idle_timeout(Config) ->
+    %% Connect, send few bytes.
+    %% Connection should be dropped in roughly `IdleTimeout` ms.
+    IdleTimeout = ?config(idle_timeout, Config),
+    ConnectPacket = emqx_frame:serialize(?CONNECT_PACKET(#mqtt_packet_connect{})),
     emqx_config:put_zone_conf(default, [mqtt, idle_timeout], IdleTimeout),
-    {ok, Sock} = emqtt_sock:connect({127, 0, 0, 1}, 1883, [], 60000),
-    timer:sleep(IdleTimeout),
-    ?assertMatch({error, closed}, emqtt_sock:recv(Sock, 1024)).
+    SockOpts = [binary, {active, true}, {nodelay, true}],
+    {ok, Sock} = gen_tcp:connect({127, 0, 0, 1}, 1883, SockOpts, 5000),
+    ok = gen_tcp:send(Sock, binary:part(iolist_to_binary(ConnectPacket), 0, 4)),
+    ?assertReceive({tcp_closed, Sock}, IdleTimeout * 2),
+    ?assertMatch(
+        {ok, #{reason := {shutdown, idle_timeout}}},
+        ?block_until(#{?snk_kind := terminate}, IdleTimeout)
+    ).
 
 t_connect_emit_stats_timeout(init, Config) ->
     NewIdleTimeout = 1000,
     emqx_config:put_zone_conf(default, [mqtt, idle_timeout], NewIdleTimeout),
-    emqx_config:put_zone_conf(default, [mqtt, idle_timeout], NewIdleTimeout),
     ok = snabbkaffe:start_trace(),
     [{idle_timeout, NewIdleTimeout} | Config];
 t_connect_emit_stats_timeout('end', _Config) ->
     snabbkaffe:stop(),
     emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
-    emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
     ok.
 
 t_connect_emit_stats_timeout(Config) ->
@@ -490,7 +529,6 @@ t_connack_session_present(Config) ->
 t_connack_max_qos_allowed(init, Config) ->
     Config;
 t_connack_max_qos_allowed('end', _Config) ->
-    emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 2),
     emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 2),
     ok.
 t_connack_max_qos_allowed(Config) ->
@@ -500,7 +538,6 @@ t_connack_max_qos_allowed(Config) ->
 
     %% max_qos_allowed = 0
     emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 0),
-    emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 0),
 
     {ok, Client1} = emqtt:start_link([{proto_ver, v5} | Config]),
     {ok, Connack1} = emqtt:ConnFun(Client1),
@@ -537,7 +574,6 @@ t_connack_max_qos_allowed(Config) ->
 
     %% max_qos_allowed = 1
     emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 1),
-    emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 1),
 
     {ok, Client3} = emqtt:start_link([{proto_ver, v5} | Config]),
     {ok, Connack3} = emqtt:ConnFun(Client3),
@@ -574,7 +610,6 @@ t_connack_max_qos_allowed(Config) ->
 
     %% max_qos_allowed = 2
     emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 2),
-    emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 2),
 
     {ok, Client5} = emqtt:start_link([{proto_ver, v5} | Config]),
     {ok, Connack5} = emqtt:ConnFun(Client5),