test: check device_id is used from topic or config

This commit is contained in:
Stefan Strigler 2023-05-30 15:54:17 +02:00
parent 938d62a666
commit 767f7c57e7
2 changed files with 103 additions and 26 deletions

View File

@ -32,7 +32,7 @@ init_per_group(TestGroup, BridgeType, Config) ->
{ok, _} = application:ensure_all_started(emqx_connector), {ok, _} = application:ensure_all_started(emqx_connector),
emqx_mgmt_api_test_util:init_suite(), emqx_mgmt_api_test_util:init_suite(),
UniqueNum = integer_to_binary(erlang:unique_integer([positive])), UniqueNum = integer_to_binary(erlang:unique_integer([positive])),
MQTTTopic = <<"mqtt/topic/", UniqueNum/binary>>, MQTTTopic = <<"mqtt/topic/abc", UniqueNum/binary>>,
[ [
{proxy_host, ProxyHost}, {proxy_host, ProxyHost},
{proxy_port, ProxyPort}, {proxy_port, ProxyPort},

View File

@ -8,6 +8,7 @@
-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(BRIDGE_TYPE_BIN, <<"iotdb">>). -define(BRIDGE_TYPE_BIN, <<"iotdb">>).
-define(APPS, [emqx_bridge, emqx_resource, emqx_rule_engine, emqx_bridge_iotdb]). -define(APPS, [emqx_bridge, emqx_resource, emqx_rule_engine, emqx_bridge_iotdb]).
@ -143,9 +144,15 @@ make_message_fun(Topic, Payload) ->
} }
end. end.
iotdb_topic(Config) ->
?config(mqtt_topic, Config).
iotdb_device(Config) -> iotdb_device(Config) ->
MQTTTopic = ?config(mqtt_topic, Config), Topic = iotdb_topic(Config),
Device = re:replace(MQTTTopic, "/", ".dev", [global, {return, binary}]), topic_to_iotdb_device(Topic).
topic_to_iotdb_device(Topic) ->
Device = re:replace(Topic, "/", ".", [global, {return, binary}]),
<<"root.", Device/binary>>. <<"root.", Device/binary>>.
iotdb_request(Config, Path, Body) -> iotdb_request(Config, Path, Body) ->
@ -172,6 +179,9 @@ iotdb_request(Config, Path, Body, Opts) ->
iotdb_reset(Config) -> iotdb_reset(Config) ->
Device = iotdb_device(Config), Device = iotdb_device(Config),
iotdb_reset(Config, Device).
iotdb_reset(Config, Device) ->
Body = #{sql => <<"delete from ", Device/binary, ".*">>}, Body = #{sql => <<"delete from ", Device/binary, ".*">>},
{ok, _} = iotdb_request(Config, <<"/rest/v2/nonQuery">>, Body). {ok, _} = iotdb_request(Config, <<"/rest/v2/nonQuery">>, Body).
@ -181,6 +191,12 @@ iotdb_query(Config, Query) ->
Body = #{sql => Query}, Body = #{sql => Query},
iotdb_request(Config, Path, Body, Opts). iotdb_request(Config, Path, Body, Opts).
is_success_check({ok, 200, _, Body}) ->
?assert(is_code(200, emqx_utils_json:decode(Body))).
is_code(Code, #{<<"code">> := Code}) -> true;
is_code(_, _) -> false.
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
%% Testcases %% Testcases
%%------------------------------------------------------------------------------ %%------------------------------------------------------------------------------
@ -188,13 +204,9 @@ iotdb_query(Config, Query) ->
t_sync_query_simple(Config) -> t_sync_query_simple(Config) ->
DeviceId = iotdb_device(Config), DeviceId = iotdb_device(Config),
Payload = make_iotdb_payload(DeviceId, "temp", "INT32", "36"), Payload = make_iotdb_payload(DeviceId, "temp", "INT32", "36"),
MakeMessageFun = make_message_fun(DeviceId, Payload), MakeMessageFun = make_message_fun(iotdb_topic(Config), Payload),
IsSuccessCheck =
fun(Result) ->
?assertEqual(ok, element(1, Result))
end,
ok = emqx_bridge_testlib:t_sync_query( ok = emqx_bridge_testlib:t_sync_query(
Config, MakeMessageFun, IsSuccessCheck, iotdb_bridge_on_query Config, MakeMessageFun, fun is_success_check/1, iotdb_bridge_on_query
), ),
Query = <<"select temp from ", DeviceId/binary>>, Query = <<"select temp from ", DeviceId/binary>>,
{ok, {{_, 200, _}, _, IoTDBResult}} = iotdb_query(Config, Query), {ok, {{_, 200, _}, _, IoTDBResult}} = iotdb_query(Config, Query),
@ -206,13 +218,9 @@ t_sync_query_simple(Config) ->
t_async_query(Config) -> t_async_query(Config) ->
DeviceId = iotdb_device(Config), DeviceId = iotdb_device(Config),
Payload = make_iotdb_payload(DeviceId, "temp", "INT32", "36"), Payload = make_iotdb_payload(DeviceId, "temp", "INT32", "36"),
MakeMessageFun = make_message_fun(DeviceId, Payload), MakeMessageFun = make_message_fun(iotdb_topic(Config), Payload),
IsSuccessCheck =
fun(Result) ->
?assertEqual(ok, element(1, Result))
end,
ok = emqx_bridge_testlib:t_async_query( ok = emqx_bridge_testlib:t_async_query(
Config, MakeMessageFun, IsSuccessCheck, iotdb_bridge_on_query_async Config, MakeMessageFun, fun is_success_check/1, iotdb_bridge_on_query_async
), ),
Query = <<"select temp from ", DeviceId/binary>>, Query = <<"select temp from ", DeviceId/binary>>,
{ok, {{_, 200, _}, _, IoTDBResult}} = iotdb_query(Config, Query), {ok, {{_, 200, _}, _, IoTDBResult}} = iotdb_query(Config, Query),
@ -260,13 +268,9 @@ t_sync_query_aggregated(Config) ->
make_iotdb_payload(DeviceId, "foo", "TEXT", "bar", 1685112026300) make_iotdb_payload(DeviceId, "foo", "TEXT", "bar", 1685112026300)
], ],
MakeMessageFun = make_message_fun(DeviceId, Payload), MakeMessageFun = make_message_fun(iotdb_topic(Config), Payload),
IsSuccessCheck =
fun(Result) ->
?assertEqual(ok, element(1, Result))
end,
ok = emqx_bridge_testlib:t_sync_query( ok = emqx_bridge_testlib:t_sync_query(
Config, MakeMessageFun, IsSuccessCheck, iotdb_bridge_on_query Config, MakeMessageFun, fun is_success_check/1, iotdb_bridge_on_query
), ),
%% check temp %% check temp
@ -319,7 +323,7 @@ exp(Dev, M0) ->
t_sync_query_fail(Config) -> t_sync_query_fail(Config) ->
DeviceId = iotdb_device(Config), DeviceId = iotdb_device(Config),
Payload = make_iotdb_payload(DeviceId, "temp", "INT32", "Anton"), Payload = make_iotdb_payload(DeviceId, "temp", "INT32", "Anton"),
MakeMessageFun = make_message_fun(DeviceId, Payload), MakeMessageFun = make_message_fun(iotdb_topic(Config), Payload),
IsSuccessCheck = IsSuccessCheck =
fun(Result) -> fun(Result) ->
?assertEqual(error, element(1, Result)) ?assertEqual(error, element(1, Result))
@ -327,7 +331,6 @@ t_sync_query_fail(Config) ->
emqx_bridge_testlib:t_sync_query(Config, MakeMessageFun, IsSuccessCheck, iotdb_bridge_on_query). emqx_bridge_testlib:t_sync_query(Config, MakeMessageFun, IsSuccessCheck, iotdb_bridge_on_query).
t_sync_query_badpayload(Config) -> t_sync_query_badpayload(Config) ->
DeviceId = iotdb_device(Config),
BadPayload = #{foo => bar}, BadPayload = #{foo => bar},
IsSuccessCheck = IsSuccessCheck =
fun(Result) -> fun(Result) ->
@ -335,14 +338,13 @@ t_sync_query_badpayload(Config) ->
end, end,
emqx_bridge_testlib:t_sync_query( emqx_bridge_testlib:t_sync_query(
Config, Config,
make_message_fun(DeviceId, BadPayload), make_message_fun(iotdb_topic(Config), BadPayload),
IsSuccessCheck, IsSuccessCheck,
iotdb_bridge_on_query iotdb_bridge_on_query
), ),
ok. ok.
t_async_query_badpayload(Config) -> t_async_query_badpayload(Config) ->
DeviceId = iotdb_device(Config),
BadPayload = #{foo => bar}, BadPayload = #{foo => bar},
IsSuccessCheck = IsSuccessCheck =
fun(Result) -> fun(Result) ->
@ -350,7 +352,7 @@ t_async_query_badpayload(Config) ->
end, end,
emqx_bridge_testlib:t_async_query( emqx_bridge_testlib:t_async_query(
Config, Config,
make_message_fun(DeviceId, BadPayload), make_message_fun(iotdb_topic(Config), BadPayload),
IsSuccessCheck, IsSuccessCheck,
iotdb_bridge_on_query_async iotdb_bridge_on_query_async
), ),
@ -364,3 +366,78 @@ t_start_stop(Config) ->
t_on_get_status(Config) -> t_on_get_status(Config) ->
emqx_bridge_testlib:t_on_get_status(Config). emqx_bridge_testlib:t_on_get_status(Config).
t_device_id(Config) ->
ResourceId = emqx_bridge_testlib:resource_id(Config),
%% Create without device_id configured
?assertMatch({ok, _}, emqx_bridge_testlib:create_bridge(Config)),
?retry(
_Sleep = 1_000,
_Attempts = 20,
?assertEqual({ok, connected}, emqx_resource_manager:health_check(ResourceId))
),
ConfiguredDevice = <<"root.someOtherDevice234">>,
DeviceId = <<"root.deviceFooBar123">>,
Topic = <<"some/random/topic">>,
TopicDevice = topic_to_iotdb_device(Topic),
iotdb_reset(Config, DeviceId),
iotdb_reset(Config, TopicDevice),
iotdb_reset(Config, ConfiguredDevice),
Payload1 = make_iotdb_payload(DeviceId, "test", "BOOLEAN", true),
MessageF1 = make_message_fun(Topic, Payload1),
?assertNotEqual(DeviceId, TopicDevice),
is_success_check(
emqx_resource:simple_sync_query(ResourceId, {send_message, MessageF1()})
),
{ok, {{_, 200, _}, _, Res1_1}} = iotdb_query(Config, <<"select * from ", DeviceId/binary>>),
#{<<"values">> := Values1_1} = emqx_utils_json:decode(Res1_1),
?assertNotEqual([], Values1_1),
{ok, {{_, 200, _}, _, Res1_2}} = iotdb_query(Config, <<"select * from ", TopicDevice/binary>>),
#{<<"values">> := Values1_2} = emqx_utils_json:decode(Res1_2),
?assertEqual([], Values1_2),
%% test without device_id in message, taking it from topic
iotdb_reset(Config, DeviceId),
iotdb_reset(Config, TopicDevice),
iotdb_reset(Config, ConfiguredDevice),
Payload2 = maps:remove(device_id, make_iotdb_payload(DeviceId, "root", "BOOLEAN", true)),
MessageF2 = make_message_fun(Topic, Payload2),
is_success_check(
emqx_resource:simple_sync_query(ResourceId, {send_message, MessageF2()})
),
{ok, {{_, 200, _}, _, Res2_1}} = iotdb_query(Config, <<"select * from ", DeviceId/binary>>),
#{<<"values">> := Values2_1} = emqx_utils_json:decode(Res2_1),
?assertEqual([], Values2_1),
{ok, {{_, 200, _}, _, Res2_2}} = iotdb_query(Config, <<"select * from ", TopicDevice/binary>>),
#{<<"values">> := Values2_2} = emqx_utils_json:decode(Res2_2),
?assertNotEqual([], Values2_2),
iotdb_reset(Config, DeviceId),
iotdb_reset(Config, TopicDevice),
iotdb_reset(Config, ConfiguredDevice),
%% reconfigure bridge with device_id
{ok, _} =
emqx_bridge_testlib:update_bridge_api(Config, #{<<"device_id">> => ConfiguredDevice}),
is_success_check(
emqx_resource:simple_sync_query(ResourceId, {send_message, MessageF1()})
),
%% even though we had a device_id in the message it's not being used
{ok, {{_, 200, _}, _, Res3_1}} = iotdb_query(Config, <<"select * from ", DeviceId/binary>>),
#{<<"values">> := Values3_1} = emqx_utils_json:decode(Res3_1),
?assertEqual([], Values3_1),
{ok, {{_, 200, _}, _, Res3_2}} = iotdb_query(Config, <<"select * from ", TopicDevice/binary>>),
#{<<"values">> := Values3_2} = emqx_utils_json:decode(Res3_2),
?assertEqual([], Values3_2),
{ok, {{_, 200, _}, _, Res3_3}} = iotdb_query(
Config, <<"select * from ", ConfiguredDevice/binary>>
),
#{<<"values">> := Values3_3} = emqx_utils_json:decode(Res3_3),
?assertNotEqual([], Values3_3),
iotdb_reset(Config, DeviceId),
iotdb_reset(Config, TopicDevice),
iotdb_reset(Config, ConfiguredDevice),
ok.