test(mqtt_sn): improve test coverage of `emqx_sn_gateway`

This commit is contained in:
firest 2022-09-26 16:37:33 +08:00
parent 502f3e8d5c
commit 5b14d7f709
1 changed files with 130 additions and 2 deletions

View File

@ -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
%%--------------------------------------------------------------------