|
@@ -21,6 +21,7 @@
|
|
|
|
|
|
|
|
-include_lib("emqx/include/emqx_mqtt.hrl").
|
|
-include_lib("emqx/include/emqx_mqtt.hrl").
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
|
+-include_lib("emqx/include/asserts.hrl").
|
|
|
-include_lib("snabbkaffe/include/snabbkaffe.hrl").
|
|
-include_lib("snabbkaffe/include/snabbkaffe.hrl").
|
|
|
-include_lib("common_test/include/ct.hrl").
|
|
-include_lib("common_test/include/ct.hrl").
|
|
|
|
|
|
|
@@ -323,24 +324,62 @@ t_connect_will_retain(Config) ->
|
|
|
ok = emqtt:disconnect(Client4),
|
|
ok = emqtt:disconnect(Client4),
|
|
|
clean_retained(Topic, Config).
|
|
clean_retained(Topic, Config).
|
|
|
|
|
|
|
|
-t_connect_idle_timeout(_Config) ->
|
|
|
|
|
|
|
+t_connect_silent_idle_timeout(init, Config) ->
|
|
|
IdleTimeout = 2000,
|
|
IdleTimeout = 2000,
|
|
|
emqx_config:put_zone_conf(default, [mqtt, idle_timeout], IdleTimeout),
|
|
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),
|
|
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) ->
|
|
t_connect_emit_stats_timeout(init, Config) ->
|
|
|
NewIdleTimeout = 1000,
|
|
NewIdleTimeout = 1000,
|
|
|
emqx_config:put_zone_conf(default, [mqtt, idle_timeout], NewIdleTimeout),
|
|
emqx_config:put_zone_conf(default, [mqtt, idle_timeout], NewIdleTimeout),
|
|
|
- emqx_config:put_zone_conf(default, [mqtt, idle_timeout], NewIdleTimeout),
|
|
|
|
|
ok = snabbkaffe:start_trace(),
|
|
ok = snabbkaffe:start_trace(),
|
|
|
[{idle_timeout, NewIdleTimeout} | Config];
|
|
[{idle_timeout, NewIdleTimeout} | Config];
|
|
|
t_connect_emit_stats_timeout('end', _Config) ->
|
|
t_connect_emit_stats_timeout('end', _Config) ->
|
|
|
snabbkaffe:stop(),
|
|
snabbkaffe:stop(),
|
|
|
emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
|
|
emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
|
|
|
- emqx_config:put_zone_conf(default, [mqtt, idle_timeout], 15000),
|
|
|
|
|
ok.
|
|
ok.
|
|
|
|
|
|
|
|
t_connect_emit_stats_timeout(Config) ->
|
|
t_connect_emit_stats_timeout(Config) ->
|
|
@@ -490,7 +529,6 @@ t_connack_session_present(Config) ->
|
|
|
t_connack_max_qos_allowed(init, Config) ->
|
|
t_connack_max_qos_allowed(init, Config) ->
|
|
|
Config;
|
|
Config;
|
|
|
t_connack_max_qos_allowed('end', _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),
|
|
emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 2),
|
|
|
ok.
|
|
ok.
|
|
|
t_connack_max_qos_allowed(Config) ->
|
|
t_connack_max_qos_allowed(Config) ->
|
|
@@ -500,7 +538,6 @@ t_connack_max_qos_allowed(Config) ->
|
|
|
|
|
|
|
|
%% max_qos_allowed = 0
|
|
%% 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),
|
|
|
- emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 0),
|
|
|
|
|
|
|
|
|
|
{ok, Client1} = emqtt:start_link([{proto_ver, v5} | Config]),
|
|
{ok, Client1} = emqtt:start_link([{proto_ver, v5} | Config]),
|
|
|
{ok, Connack1} = emqtt:ConnFun(Client1),
|
|
{ok, Connack1} = emqtt:ConnFun(Client1),
|
|
@@ -537,7 +574,6 @@ t_connack_max_qos_allowed(Config) ->
|
|
|
|
|
|
|
|
%% max_qos_allowed = 1
|
|
%% 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),
|
|
|
- emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 1),
|
|
|
|
|
|
|
|
|
|
{ok, Client3} = emqtt:start_link([{proto_ver, v5} | Config]),
|
|
{ok, Client3} = emqtt:start_link([{proto_ver, v5} | Config]),
|
|
|
{ok, Connack3} = emqtt:ConnFun(Client3),
|
|
{ok, Connack3} = emqtt:ConnFun(Client3),
|
|
@@ -574,7 +610,6 @@ t_connack_max_qos_allowed(Config) ->
|
|
|
|
|
|
|
|
%% max_qos_allowed = 2
|
|
%% 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),
|
|
|
- emqx_config:put_zone_conf(default, [mqtt, max_qos_allowed], 2),
|
|
|
|
|
|
|
|
|
|
{ok, Client5} = emqtt:start_link([{proto_ver, v5} | Config]),
|
|
{ok, Client5} = emqtt:start_link([{proto_ver, v5} | Config]),
|
|
|
{ok, Connack5} = emqtt:ConnFun(Client5),
|
|
{ok, Connack5} = emqtt:ConnFun(Client5),
|