From 5b14d7f70908f48b65da303ef76d33c112ea3762 Mon Sep 17 00:00:00 2001 From: firest Date: Mon, 26 Sep 2022 16:37:33 +0800 Subject: [PATCH] test(mqtt_sn): improve test coverage of `emqx_sn_gateway` --- apps/emqx_sn/test/emqx_sn_protocol_SUITE.erl | 132 ++++++++++++++++++- 1 file changed, 130 insertions(+), 2 deletions(-) diff --git a/apps/emqx_sn/test/emqx_sn_protocol_SUITE.erl b/apps/emqx_sn/test/emqx_sn_protocol_SUITE.erl index b064b630e..60b27af2c 100644 --- a/apps/emqx_sn/test/emqx_sn_protocol_SUITE.erl +++ b/apps/emqx_sn/test/emqx_sn_protocol_SUITE.erl @@ -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 %%--------------------------------------------------------------------