test(mqtt_sn): improve test coverage of `emqx_sn_gateway`
This commit is contained in:
parent
502f3e8d5c
commit
5b14d7f709
|
@ -85,6 +85,15 @@ restart_emqx_sn(#{subs_resume := Bool}) ->
|
|||
_ = application:ensure_all_started(emqx_sn),
|
||||
ok.
|
||||
|
||||
recoverable_restart_emqx_sn(Setup) ->
|
||||
AppEnvs = application:get_all_env(emqx_sn),
|
||||
Setup(),
|
||||
_ = application:stop(emqx_sn),
|
||||
_ = application:ensure_all_started(emqx_sn),
|
||||
fun() ->
|
||||
application:set_env([{emqx_sn, AppEnvs}])
|
||||
end.
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Test cases
|
||||
%%--------------------------------------------------------------------
|
||||
|
@ -388,6 +397,38 @@ t_subscribe_case08(_) ->
|
|||
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
||||
gen_udp:close(Socket).
|
||||
|
||||
t_subscribe_case09(_) ->
|
||||
Dup = 0,
|
||||
QoS = 0,
|
||||
Retain = 0,
|
||||
CleanSession = 0,
|
||||
ReturnCode = 0,
|
||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||
ClientId = ?CLIENTID,
|
||||
send_connect_msg(Socket, ClientId),
|
||||
?assertEqual(<<3, ?SN_CONNACK, 0>>, receive_response(Socket)),
|
||||
|
||||
TopicName1 = <<"t/+">>,
|
||||
MsgId1 = 25,
|
||||
TopicId0 = 0,
|
||||
WillBit = 0,
|
||||
send_subscribe_msg_normal_topic(Socket, QoS, TopicName1, MsgId1),
|
||||
?assertEqual(<<8, ?SN_SUBACK, Dup:1, QoS:2, Retain:1, WillBit:1, CleanSession:1, ?SN_NORMAL_TOPIC:2, TopicId0:16, MsgId1:16, ReturnCode>>,
|
||||
receive_response(Socket)),
|
||||
|
||||
{ok, C} = emqtt:start_link(),
|
||||
{ok, _} = emqtt:connect(C),
|
||||
ok = emqtt:publish(C, <<"t/1">>, <<"Hello">>, 0),
|
||||
timer:sleep(100),
|
||||
ok = emqtt:disconnect(C),
|
||||
|
||||
timer:sleep(50),
|
||||
?assertError(_, receive_publish(Socket)),
|
||||
|
||||
send_disconnect_msg(Socket, undefined),
|
||||
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
||||
gen_udp:close(Socket).
|
||||
|
||||
t_publish_negqos_case09(_) ->
|
||||
Dup = 0,
|
||||
QoS = 0,
|
||||
|
@ -404,7 +445,6 @@ t_publish_negqos_case09(_) ->
|
|||
|
||||
Topic = <<"abc">>,
|
||||
|
||||
|
||||
send_subscribe_msg_normal_topic(Socket, QoS, Topic, MsgId),
|
||||
?assertEqual(<<8, ?SN_SUBACK, Dup:1, QoS:2, Retain:1, Will:1, CleanSession:1, ?SN_NORMAL_TOPIC:2, TopicId1:16, MsgId:16, ?SN_RC_ACCEPTED>>,
|
||||
receive_response(Socket)),
|
||||
|
@ -429,7 +469,7 @@ t_publish_negqos_case10(_) ->
|
|||
TopicId1 = ?PREDEF_TOPIC_ID1,
|
||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||
Payload1 = <<20, 21, 22, 23>>,
|
||||
send_publish_msg_normal_topic(Socket, QoS, MsgId, TopicId1, Payload1),
|
||||
send_publish_msg_predefined_topic(Socket, QoS, MsgId, TopicId1, Payload1),
|
||||
timer:sleep(100),
|
||||
gen_udp:close(Socket).
|
||||
|
||||
|
@ -1333,6 +1373,7 @@ t_asleep_test04_to_awake_qos1_dl_msg(_) ->
|
|||
?assertError(_, receive_publish(Socket)),
|
||||
|
||||
send_regack_msg(Socket, TopicIdNew, MsgId3),
|
||||
send_regack_msg(Socket, TopicIdNew, MsgId3, ?SN_RC_INVALID_TOPIC_ID),
|
||||
|
||||
UdpData2 = receive_response(Socket),
|
||||
MsgId_udp2 = check_publish_msg_on_udp({Dup, QoS, Retain, WillBit, CleanSession, ?SN_NORMAL_TOPIC, TopicIdNew, Payload1}, UdpData2),
|
||||
|
@ -1662,6 +1703,33 @@ t_asleep_test09_to_awake_again_qos1_dl_msg(_) ->
|
|||
|
||||
gen_udp:close(Socket).
|
||||
|
||||
t_asleep_unexpected(_) ->
|
||||
SleepDuration = 3,
|
||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||
ClientId = ?CLIENTID,
|
||||
send_connect_msg(Socket, ClientId),
|
||||
?assertEqual(<<3, ?SN_CONNACK, 0>>, receive_response(Socket)),
|
||||
|
||||
timer:sleep(200),
|
||||
|
||||
% goto asleep state
|
||||
send_disconnect_msg(Socket, SleepDuration),
|
||||
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
||||
timer:sleep(100),
|
||||
|
||||
send_pingreq_msg(Socket, undefined),
|
||||
?assertEqual(udp_receive_timeout, receive_response(Socket)),
|
||||
|
||||
send_puback_msg(Socket, 5, 5, ?SN_RC_INVALID_TOPIC_ID),
|
||||
send_pubrec_msg(Socket, 5),
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
send_disconnect_msg(Socket, undefined),
|
||||
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
||||
timer:sleep(100),
|
||||
|
||||
gen_udp:close(Socket).
|
||||
|
||||
t_awake_test01_to_connected(_) ->
|
||||
QoS = 1,
|
||||
Keepalive_Duration = 3,
|
||||
|
@ -2081,6 +2149,66 @@ t_code_change(_) ->
|
|||
?assertEqual({ok, name, OldTulpe},
|
||||
emqx_sn_gateway:code_change({down, 1}, name, NewTulpe, ["4.3.2"])).
|
||||
|
||||
t_topic_id_to_large(_) ->
|
||||
Dup = 0,
|
||||
QoS = 0,
|
||||
Retain = 0,
|
||||
Will = 0,
|
||||
CleanSession = 0,
|
||||
MsgId = 1,
|
||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||
ClientId = ?CLIENTID,
|
||||
send_connect_msg(Socket, ClientId),
|
||||
|
||||
?assertEqual(<<3, ?SN_CONNACK, 0>>, receive_response(Socket)),
|
||||
|
||||
mnesia:dirty_write(emqx_sn_registry, {emqx_sn_registry, {ClientId, next_topic_id}, 16#FFFF}),
|
||||
|
||||
TopicName1 = <<"abcD">>,
|
||||
send_register_msg(Socket, TopicName1, MsgId),
|
||||
?assertEqual(<<7, ?SN_REGACK, 0:16, MsgId:16, 3:8>>, receive_response(Socket)),
|
||||
|
||||
send_subscribe_msg_normal_topic(Socket, QoS, TopicName1, MsgId),
|
||||
?assertEqual(<<8, ?SN_SUBACK, Dup:1, QoS:2, Retain:1, Will:1,
|
||||
CleanSession:1, ?SN_NORMAL_TOPIC:2, 0:16,
|
||||
MsgId:16, 2>>, receive_response(Socket)),
|
||||
|
||||
send_disconnect_msg(Socket, undefined),
|
||||
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
||||
gen_udp:close(Socket).
|
||||
|
||||
t_idle_timeout(_) ->
|
||||
Backup = recoverable_restart_emqx_sn(fun() ->
|
||||
application:set_env(emqx_sn, idle_timeout, 500),
|
||||
application:set_env(emqx_sn, enable_qos3, false)
|
||||
end),
|
||||
timer:sleep(200),
|
||||
QoS = ?QOS_NEG1,
|
||||
MsgId = 1,
|
||||
TopicId1 = ?PREDEF_TOPIC_ID1,
|
||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||
Payload1 = <<20, 21, 22, 23>>,
|
||||
send_publish_msg_predefined_topic(Socket, QoS, MsgId, TopicId1, Payload1),
|
||||
timer:sleep(1500),
|
||||
|
||||
send_disconnect_msg(Socket, undefined),
|
||||
?assertEqual(udp_receive_timeout, receive_response(Socket)),
|
||||
gen_udp:close(Socket),
|
||||
_ = recoverable_restart_emqx_sn(Backup),
|
||||
timer:sleep(200),
|
||||
ok.
|
||||
|
||||
t_invalid_packet(_) ->
|
||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||
send_connect_msg(Socket, <<"client_id_test1">>),
|
||||
?assertEqual(<<3, ?SN_CONNACK, 0>>, receive_response(Socket)),
|
||||
|
||||
send_packet(Socket, emqx_sn_frame_SUITE:generate_random_binary()),
|
||||
|
||||
send_disconnect_msg(Socket, undefined),
|
||||
?assertEqual(udp_receive_timeout, receive_response(Socket)),
|
||||
gen_udp:close(Socket).
|
||||
|
||||
%%--------------------------------------------------------------------
|
||||
%% Helper funcs
|
||||
%%--------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue