test(lwm2m): cover auto_observe mechanism

This commit is contained in:
JianBo He 2023-03-28 18:31:20 +08:00
parent 6750618d9a
commit 6db5a4872a
2 changed files with 102 additions and 35 deletions

View File

@ -15,11 +15,12 @@
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
-module(emqx_lwm2m_session). -module(emqx_lwm2m_session).
-include("src/coap/include/emqx_coap.hrl").
-include("src/lwm2m/include/emqx_lwm2m.hrl").
-include_lib("emqx/include/logger.hrl"). -include_lib("emqx/include/logger.hrl").
-include_lib("emqx/include/emqx.hrl"). -include_lib("emqx/include/emqx.hrl").
-include_lib("emqx/include/emqx_mqtt.hrl"). -include_lib("emqx/include/emqx_mqtt.hrl").
-include("src/coap/include/emqx_coap.hrl"). -include_lib("snabbkaffe/include/snabbkaffe.hrl").
-include("src/lwm2m/include/emqx_lwm2m.hrl").
%% API %% API
-export([ -export([
@ -513,13 +514,17 @@ observe_object_list(AlternatePath, ObjectList, Session) ->
true -> true ->
Acc; Acc;
false -> false ->
case emqx_lwm2m_xml_object_db:find_objectid(binary_to_integer(ObjId)) of ObjId1 = binary_to_integer(ObjId),
case emqx_lwm2m_xml_object_db:find_objectid(ObjId1) of
{error, no_xml_definition} -> {error, no_xml_definition} ->
?SLOG(warning, #{ ?tp(
msg => "ignore_observer_resource", warning,
reason => no_xml_definition, ignore_observer_resource,
object_id => ObjId #{
}), reason => no_xml_definition,
object_id => ObjId1
}
),
Acc; Acc;
_ -> _ ->
observe_object(AlternatePath, ObjectPath, Acc) observe_object(AlternatePath, ObjectPath, Acc)

View File

@ -35,29 +35,7 @@
-include("src/coap/include/emqx_coap.hrl"). -include("src/coap/include/emqx_coap.hrl").
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-include_lib("common_test/include/ct.hrl"). -include_lib("common_test/include/ct.hrl").
-include_lib("snabbkaffe/include/snabbkaffe.hrl").
-define(CONF_DEFAULT, <<
"\n"
"gateway.lwm2m {\n"
" xml_dir = \"../../lib/emqx_gateway/src/lwm2m/lwm2m_xml\"\n"
" lifetime_min = 1s\n"
" lifetime_max = 86400s\n"
" qmode_time_window = 22\n"
" auto_observe = false\n"
" mountpoint = \"lwm2m/${username}\"\n"
" update_msg_publish_condition = contains_object_list\n"
" translators {\n"
" command = {topic = \"/dn/#\", qos = 0}\n"
" response = {topic = \"/up/resp\", qos = 0}\n"
" notify = {topic = \"/up/notify\", qos = 0}\n"
" register = {topic = \"/up/resp\", qos = 0}\n"
" update = {topic = \"/up/resp\", qos = 0}\n"
" }\n"
" listeners.udp.default {\n"
" bind = 5783\n"
" }\n"
"}\n"
>>).
-record(coap_content, {content_format, payload = <<>>}). -record(coap_content, {content_format, payload = <<>>}).
@ -99,7 +77,8 @@ groups() ->
%% case06_register_wrong_lifetime, %% now, will ignore wrong lifetime %% case06_register_wrong_lifetime, %% now, will ignore wrong lifetime
case07_register_alternate_path_01, case07_register_alternate_path_01,
case07_register_alternate_path_02, case07_register_alternate_path_02,
case08_reregister case08_reregister,
case09_auto_observe
]}, ]},
{test_grp_1_read, [RepeatOpt], [ {test_grp_1_read, [RepeatOpt], [
case10_read, case10_read,
@ -164,8 +143,15 @@ end_per_suite(Config) ->
emqx_mgmt_api_test_util:end_suite([emqx_conf, emqx_authn]), emqx_mgmt_api_test_util:end_suite([emqx_conf, emqx_authn]),
Config. Config.
init_per_testcase(_AllTestCase, Config) -> init_per_testcase(TestCase, Config) ->
ok = emqx_common_test_helpers:load_config(emqx_gateway_schema, ?CONF_DEFAULT), GatewayConfig =
case TestCase of
case09_auto_observe ->
default_config(#{auto_observe => true});
_ ->
default_config()
end,
ok = emqx_common_test_helpers:load_config(emqx_gateway_schema, GatewayConfig),
{ok, _} = application:ensure_all_started(emqx_gateway), {ok, _} = application:ensure_all_started(emqx_gateway),
{ok, ClientUdpSock} = gen_udp:open(0, [binary, {active, false}]), {ok, ClientUdpSock} = gen_udp:open(0, [binary, {active, false}]),
@ -187,7 +173,37 @@ end_per_testcase(_AllTestCase, Config) ->
ok = application:stop(emqx_gateway). ok = application:stop(emqx_gateway).
default_config() -> default_config() ->
?CONF_DEFAULT. default_config(#{}).
default_config(Overrides) ->
iolist_to_binary(
io_lib:format(
"\n"
"gateway.lwm2m {\n"
" xml_dir = \"../../lib/emqx_gateway/src/lwm2m/lwm2m_xml\"\n"
" lifetime_min = 1s\n"
" lifetime_max = 86400s\n"
" qmode_time_window = 22\n"
" auto_observe = ~w\n"
" mountpoint = \"lwm2m/${username}\"\n"
" update_msg_publish_condition = contains_object_list\n"
" translators {\n"
" command = {topic = \"/dn/#\", qos = 0}\n"
" response = {topic = \"/up/resp\", qos = 0}\n"
" notify = {topic = \"/up/notify\", qos = 0}\n"
" register = {topic = \"/up/resp\", qos = 0}\n"
" update = {topic = \"/up/resp\", qos = 0}\n"
" }\n"
" listeners.udp.default {\n"
" bind = ~w\n"
" }\n"
"}\n",
[
maps:get(auto_observe, Overrides, false),
maps:get(bind, Overrides, ?PORT)
]
)
).
default_port() -> default_port() ->
?PORT. ?PORT.
@ -762,6 +778,52 @@ case08_reregister(Config) ->
%% verify the lwm2m client is still online %% verify the lwm2m client is still online
?assertEqual(ReadResult, test_recv_mqtt_response(ReportTopic)). ?assertEqual(ReadResult, test_recv_mqtt_response(ReportTopic)).
case09_auto_observe(Config) ->
UdpSock = ?config(sock, Config),
Epn = "urn:oma:lwm2m:oma:3",
MsgId1 = 15,
RespTopic = list_to_binary("lwm2m/" ++ Epn ++ "/up/resp"),
emqtt:subscribe(?config(emqx_c, Config), RespTopic, qos0),
timer:sleep(200),
ok = snabbkaffe:start_trace(),
%% step 1, device register ...
test_send_coap_request(
UdpSock,
post,
sprintf("coap://127.0.0.1:~b/rd?ep=~ts&lt=345&lwm2m=1", [?PORT, Epn]),
#coap_content{
content_format = <<"text/plain">>,
payload = <<
"</lwm2m>;rt=\"oma.lwm2m\";ct=11543,"
"</lwm2m/1/0>,</lwm2m/2/0>,</lwm2m/3/0>,</lwm2m/59102/0>"
>>
},
[],
MsgId1
),
#coap_message{method = Method1} = test_recv_coap_response(UdpSock),
?assertEqual({ok, created}, Method1),
#coap_message{
method = Method2,
token = Token2,
options = Options2
} = test_recv_coap_request(UdpSock),
?assertEqual(get, Method2),
?assertNotEqual(<<>>, Token2),
?assertMatch(
#{
observe := 0,
uri_path := [<<"lwm2m">>, <<"3">>, <<"0">>]
},
Options2
),
{ok, _} = ?block_until(#{?snk_kind := ignore_observer_resource}, 1000),
ok.
case10_read(Config) -> case10_read(Config) ->
UdpSock = ?config(sock, Config), UdpSock = ?config(sock, Config),
Epn = "urn:oma:lwm2m:oma:3", Epn = "urn:oma:lwm2m:oma:3",