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),
|
_ = application:ensure_all_started(emqx_sn),
|
||||||
ok.
|
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
|
%% Test cases
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
@ -388,6 +397,38 @@ t_subscribe_case08(_) ->
|
||||||
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
?assertEqual(<<2, ?SN_DISCONNECT>>, receive_response(Socket)),
|
||||||
gen_udp:close(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(_) ->
|
t_publish_negqos_case09(_) ->
|
||||||
Dup = 0,
|
Dup = 0,
|
||||||
QoS = 0,
|
QoS = 0,
|
||||||
|
@ -404,7 +445,6 @@ t_publish_negqos_case09(_) ->
|
||||||
|
|
||||||
Topic = <<"abc">>,
|
Topic = <<"abc">>,
|
||||||
|
|
||||||
|
|
||||||
send_subscribe_msg_normal_topic(Socket, QoS, Topic, MsgId),
|
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>>,
|
?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)),
|
receive_response(Socket)),
|
||||||
|
@ -429,7 +469,7 @@ t_publish_negqos_case10(_) ->
|
||||||
TopicId1 = ?PREDEF_TOPIC_ID1,
|
TopicId1 = ?PREDEF_TOPIC_ID1,
|
||||||
{ok, Socket} = gen_udp:open(0, [binary]),
|
{ok, Socket} = gen_udp:open(0, [binary]),
|
||||||
Payload1 = <<20, 21, 22, 23>>,
|
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),
|
timer:sleep(100),
|
||||||
gen_udp:close(Socket).
|
gen_udp:close(Socket).
|
||||||
|
|
||||||
|
@ -1333,6 +1373,7 @@ t_asleep_test04_to_awake_qos1_dl_msg(_) ->
|
||||||
?assertError(_, receive_publish(Socket)),
|
?assertError(_, receive_publish(Socket)),
|
||||||
|
|
||||||
send_regack_msg(Socket, TopicIdNew, MsgId3),
|
send_regack_msg(Socket, TopicIdNew, MsgId3),
|
||||||
|
send_regack_msg(Socket, TopicIdNew, MsgId3, ?SN_RC_INVALID_TOPIC_ID),
|
||||||
|
|
||||||
UdpData2 = receive_response(Socket),
|
UdpData2 = receive_response(Socket),
|
||||||
MsgId_udp2 = check_publish_msg_on_udp({Dup, QoS, Retain, WillBit, CleanSession, ?SN_NORMAL_TOPIC, TopicIdNew, Payload1}, UdpData2),
|
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).
|
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(_) ->
|
t_awake_test01_to_connected(_) ->
|
||||||
QoS = 1,
|
QoS = 1,
|
||||||
Keepalive_Duration = 3,
|
Keepalive_Duration = 3,
|
||||||
|
@ -2081,6 +2149,66 @@ t_code_change(_) ->
|
||||||
?assertEqual({ok, name, OldTulpe},
|
?assertEqual({ok, name, OldTulpe},
|
||||||
emqx_sn_gateway:code_change({down, 1}, name, NewTulpe, ["4.3.2"])).
|
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
|
%% Helper funcs
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue