137 lines
6.5 KiB
Erlang
137 lines
6.5 KiB
Erlang
%% Copyright (c) 2013-2019 EMQ Technologies Co., Ltd. All Rights Reserved.
|
|
%%
|
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
|
%% you may not use this file except in compliance with the License.
|
|
%% You may obtain a copy of the License at
|
|
%%
|
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
|
%%
|
|
%% Unless required by applicable law or agreed to in writing, software
|
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
%% See the License for the specific language governing permissions and
|
|
%% limitations under the License.
|
|
|
|
|
|
-module(emqx_packet_SUITE).
|
|
|
|
-compile(export_all).
|
|
-compile(nowarn_export_all).
|
|
|
|
-include("emqx.hrl").
|
|
|
|
-include("emqx_mqtt.hrl").
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
all() ->
|
|
[
|
|
packet_proto_name,
|
|
packet_type_name,
|
|
packet_validate,
|
|
packet_message,
|
|
packet_format,
|
|
packet_will_msg
|
|
].
|
|
|
|
packet_proto_name(_) ->
|
|
?assertEqual(<<"MQIsdp">>, emqx_packet:protocol_name(3)),
|
|
?assertEqual(<<"MQTT">>, emqx_packet:protocol_name(4)),
|
|
?assertEqual(<<"MQTT">>, emqx_packet:protocol_name(5)).
|
|
|
|
packet_type_name(_) ->
|
|
?assertEqual('CONNECT', emqx_packet:type_name(?CONNECT)),
|
|
?assertEqual('UNSUBSCRIBE', emqx_packet:type_name(?UNSUBSCRIBE)).
|
|
|
|
packet_validate(_) ->
|
|
?assert(emqx_packet:validate(?SUBSCRIBE_PACKET(15, #{'Subscription-Identifier' => 1}, [{<<"topic">>, #{qos => ?QOS_0}}]))),
|
|
?assert(emqx_packet:validate(?UNSUBSCRIBE_PACKET(89, [<<"topic">>]))),
|
|
?assert(emqx_packet:validate(?CONNECT_PACKET(#mqtt_packet_connect{}))),
|
|
?assert(emqx_packet:validate(?PUBLISH_PACKET(1, <<"topic">>, 1, #{'Response-Topic' => <<"responsetopic">>, 'Topic-Alias' => 1}, <<"payload">>))),
|
|
?assert(emqx_packet:validate(?CONNECT_PACKET(#mqtt_packet_connect{properties = #{'Receive-Maximum' => 1}}))),
|
|
?assertError(subscription_identifier_invalid,
|
|
emqx_packet:validate(
|
|
?SUBSCRIBE_PACKET(15, #{'Subscription-Identifier' => -1},
|
|
[{<<"topic">>, #{qos => ?QOS_0}}]))),
|
|
?assertError(topic_filters_invalid,
|
|
emqx_packet:validate(?UNSUBSCRIBE_PACKET(1,[]))),
|
|
?assertError(topic_name_invalid,
|
|
emqx_packet:validate(?PUBLISH_PACKET(1,<<>>,1,#{},<<"payload">>))),
|
|
?assertError(topic_name_invalid,
|
|
emqx_packet:validate(?PUBLISH_PACKET
|
|
(1, <<"+/+">>, 1, #{}, <<"payload">>))),
|
|
?assertError(topic_alias_invalid,
|
|
emqx_packet:validate(
|
|
?PUBLISH_PACKET
|
|
(1, <<"topic">>, 1, #{'Topic-Alias' => 0}, <<"payload">>))),
|
|
?assertError(protocol_error,
|
|
emqx_packet:validate(
|
|
?PUBLISH_PACKET(1, <<"topic">>, 1,
|
|
#{'Subscription-Identifier' => 10}, <<"payload">>))),
|
|
?assertError(protocol_error,
|
|
emqx_packet:validate(
|
|
?PUBLISH_PACKET(1, <<"topic">>, 1,
|
|
#{'Response-Topic' => <<"+/+">>}, <<"payload">>))),
|
|
?assertError(protocol_error,
|
|
emqx_packet:validate(
|
|
?CONNECT_PACKET(#mqtt_packet_connect{
|
|
properties =
|
|
#{'Request-Response-Information' => -1}}))),
|
|
?assertError(protocol_error,
|
|
emqx_packet:validate(
|
|
?CONNECT_PACKET(#mqtt_packet_connect{
|
|
properties =
|
|
#{'Request-Problem-Information' => 2}}))),
|
|
?assertError(protocol_error,
|
|
emqx_packet:validate(
|
|
?CONNECT_PACKET(#mqtt_packet_connect{
|
|
properties =
|
|
#{'Receive-Maximum' => 0}}))).
|
|
|
|
packet_message(_) ->
|
|
Pkt = #mqtt_packet{header = #mqtt_packet_header{type = ?PUBLISH,
|
|
qos = ?QOS_0,
|
|
retain = false,
|
|
dup = false},
|
|
variable = #mqtt_packet_publish{topic_name = <<"topic">>,
|
|
packet_id = 10,
|
|
properties = #{}},
|
|
payload = <<"payload">>},
|
|
Msg = emqx_message:make(<<"clientid">>, ?QOS_0, <<"topic">>, <<"payload">>),
|
|
Msg2 = emqx_message:set_flag(retain, false, Msg),
|
|
Pkt = emqx_packet:from_message(10, Msg2),
|
|
Msg3 = emqx_message:set_header(
|
|
peername, {{127,0,0,1}, 9527},
|
|
emqx_message:set_header(username, "test", Msg2)
|
|
),
|
|
Msg4 = emqx_packet:to_message(#{client_id => <<"clientid">>,
|
|
username => "test",
|
|
peername => {{127,0,0,1}, 9527}}, Pkt),
|
|
Msg5 = Msg4#message{timestamp = Msg3#message.timestamp, id = Msg3#message.id},
|
|
Msg5 = Msg3.
|
|
|
|
packet_format(_) ->
|
|
io:format("~s", [emqx_packet:format(?CONNECT_PACKET(#mqtt_packet_connect{}))]),
|
|
io:format("~s", [emqx_packet:format(?CONNACK_PACKET(?CONNACK_SERVER))]),
|
|
io:format("~s", [emqx_packet:format(?PUBLISH_PACKET(?QOS_1, 1))]),
|
|
io:format("~s", [emqx_packet:format(?PUBLISH_PACKET(?QOS_2, <<"topic">>, 10, <<"payload">>))]),
|
|
io:format("~s", [emqx_packet:format(?PUBACK_PACKET(?PUBACK, 98))]),
|
|
io:format("~s", [emqx_packet:format(?PUBREL_PACKET(99))]),
|
|
io:format("~s", [emqx_packet:format(?SUBSCRIBE_PACKET(15, [{<<"topic">>, ?QOS_0}, {<<"topic1">>, ?QOS_1}]))]),
|
|
io:format("~s", [emqx_packet:format(?SUBACK_PACKET(40, [?QOS_0, ?QOS_1]))]),
|
|
io:format("~s", [emqx_packet:format(?UNSUBSCRIBE_PACKET(89, [<<"t">>, <<"t2">>]))]),
|
|
io:format("~s", [emqx_packet:format(?UNSUBACK_PACKET(90))]).
|
|
|
|
packet_will_msg(_) ->
|
|
Pkt = #mqtt_packet_connect{ will_flag = true,
|
|
client_id = <<"clientid">>,
|
|
username = "test",
|
|
will_retain = true,
|
|
will_qos = ?QOS_2,
|
|
will_topic = <<"topic">>,
|
|
will_props = #{},
|
|
will_payload = <<"payload">>},
|
|
Msg = emqx_packet:will_msg(Pkt),
|
|
?assertEqual(<<"clientid">>, Msg#message.from),
|
|
?assertEqual(<<"topic">>, Msg#message.topic).
|