Merge pull request #6957 from thalesmg/fix-ctl-print-43

fix(ctl): fix formatting when printing messages without arguments (4.3)
This commit is contained in:
Shawn 2022-02-10 22:09:06 +08:00 committed by GitHub
commit 992e7e66cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 440 additions and 294 deletions

View File

@ -1,45 +1,38 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{VSN, {VSN,
[ [{<<"4.3.[0-3]">>,
{<<"4.3.[0-3]">>, [ [{load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]},
{add_module,emqx_acl_mnesia_db}, {add_module,emqx_acl_mnesia_db},
{add_module,emqx_acl_mnesia_migrator, [emqx_acl_mnesia_db]}, {add_module,emqx_acl_mnesia_migrator,[emqx_acl_mnesia_db]},
{update, emqx_auth_mnesia_sup, supervisor}, {update,emqx_auth_mnesia_sup,supervisor},
{apply, {emqx_acl_mnesia_migrator, start_supervised, []}}, {apply,{emqx_acl_mnesia_migrator,start_supervised,[]}},
{load_module,emqx_auth_mnesia_api, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia_api,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia_cli, brutal_purge,soft_purge,[]} {load_module,emqx_acl_mnesia_cli,brutal_purge,soft_purge,[]}]},
]}, {<<"4.3.4">>,
{<<"4.3.4">>, [ [{load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]}]},
{load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]} {<<".*">>,[]}],
]}, [{<<"4.3.[0-3]">>,
{<<".*">>, [ [{load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]},
]} {load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]},
], {apply,{emqx_acl_mnesia_migrator,stop_supervised,[]}},
[ {update,emqx_auth_mnesia_sup,supervisor},
{<<"4.3.[0-3]">>, [ {load_module,emqx_acl_mnesia_cli,brutal_purge,soft_purge,[]},
{apply, {emqx_acl_mnesia_migrator, stop_supervised, []}}, {load_module,emqx_acl_mnesia_api,brutal_purge,soft_purge,[]},
{update, emqx_auth_mnesia_sup, supervisor}, {load_module,emqx_auth_mnesia_api,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia_cli, brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia_api, brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]},
{delete_module,emqx_acl_mnesia_migrator}, {delete_module,emqx_acl_mnesia_migrator},
{delete_module,emqx_acl_mnesia_db} {delete_module,emqx_acl_mnesia_db}]},
]}, {<<"4.3.4">>,
{<<"4.3.4">>, [ [{load_module,emqx_auth_mnesia,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_cli,brutal_purge,soft_purge,[]},
{load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]}, {load_module,emqx_acl_mnesia,brutal_purge,soft_purge,[]},
{load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]}, {load_module,emqx_auth_mnesia_app,brutal_purge,soft_purge,[]}]},
{load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]} {<<".*">>,[]}]}.
]},
{<<".*">>, [
]}
]
}.

View File

@ -47,7 +47,9 @@ groups() ->
]}]. ]}].
init_per_suite(Config) -> init_per_suite(Config) ->
emqx_ct_helpers:start_apps([emqx_modules, emqx_management, emqx_auth_mnesia], fun set_special_configs/1), emqx_ct_helpers:start_apps( [emqx_modules, emqx_management, emqx_auth_mnesia]
, fun set_special_configs/1
),
supervisor:terminate_child(emqx_auth_mnesia_sup, emqx_acl_mnesia_migrator), supervisor:terminate_child(emqx_auth_mnesia_sup, emqx_acl_mnesia_migrator),
create_default_app(), create_default_app(),
Config. Config.
@ -151,7 +153,9 @@ run_acl_tests() ->
timer:sleep(100), timer:sleep(100),
deny = emqx_access_control:check_acl(User1, subscribe, <<"topic/mix">>), deny = emqx_access_control:check_acl(User1, subscribe, <<"topic/mix">>),
allow = emqx_access_control:check_acl(User1, publish, <<"topic/mix">>), allow = emqx_access_control:check_acl(User1, publish, <<"topic/mix">>),
ok = emqx_acl_mnesia_db:add_acl({clientid, <<"test_clientid">>}, <<"topic/mix">>, pubsub, allow), ok = emqx_acl_mnesia_db:add_acl( {clientid, <<"test_clientid">>}
, <<"topic/mix">>, pubsub, allow
),
timer:sleep(100), timer:sleep(100),
allow = emqx_access_control:check_acl(User1, subscribe, <<"topic/mix">>), allow = emqx_access_control:check_acl(User1, subscribe, <<"topic/mix">>),
allow = emqx_access_control:check_acl(User1, publish, <<"topic/mix">>), allow = emqx_access_control:check_acl(User1, publish, <<"topic/mix">>),
@ -302,7 +306,7 @@ t_start_stop_supervised(_Config) ->
t_acl_cli(_Config) -> t_acl_cli(_Config) ->
meck:new(emqx_ctl, [non_strict, passthrough]), meck:new(emqx_ctl, [non_strict, passthrough]),
meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg) end), meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg, []) end),
meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end), meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end),
meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end), meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end),
meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end), meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end),
@ -411,8 +415,12 @@ t_rest_api(_Config) ->
create_conflicting_records() -> create_conflicting_records() ->
Records = [ Records = [
#?ACL_TABLE{filter = {{clientid,<<"client6">>}, <<"t">>}, action = pubsub, access = deny, created_at = 0}, #?ACL_TABLE{ filter = {{clientid,<<"client6">>}, <<"t">>}
#?ACL_TABLE{filter = {{clientid,<<"client5">>}, <<"t">>}, action = pubsub, access = deny, created_at = 1}, , action = pubsub, access = deny, created_at = 0
},
#?ACL_TABLE{ filter = {{clientid,<<"client5">>}, <<"t">>}
, action = pubsub, access = deny, created_at = 1
},
#?ACL_TABLE2{who = {clientid,<<"client5">>}, rules = [{allow, sub, <<"t">>, 2}]} #?ACL_TABLE2{who = {clientid,<<"client5">>}, rules = [{allow, sub, <<"t">>, 2}]}
], ],
mnesia:transaction(fun() -> lists:foreach(fun mnesia:write/1, Records) end). mnesia:transaction(fun() -> lists:foreach(fun mnesia:write/1, Records) end).

View File

@ -158,9 +158,9 @@ t_clients_cmd(_) ->
timer:sleep(300), timer:sleep(300),
emqx_mgmt_cli:clients(["list"]), emqx_mgmt_cli:clients(["list"]),
?assertMatch({match, _}, re:run(emqx_mgmt_cli:clients(["show", "client12"]), "client12")), ?assertMatch({match, _}, re:run(emqx_mgmt_cli:clients(["show", "client12"]), "client12")),
?assertEqual("ok~n", emqx_mgmt_cli:clients(["kick", "client12"])), ?assertEqual("ok\n", emqx_mgmt_cli:clients(["kick", "client12"])),
timer:sleep(500), timer:sleep(500),
?assertEqual("ok~n", emqx_mgmt_cli:clients(["kick", "client12"])), ?assertEqual("ok\n", emqx_mgmt_cli:clients(["kick", "client12"])),
receive receive
{'EXIT', T, _} -> {'EXIT', T, _} ->
ok ok
@ -272,8 +272,8 @@ t_subscriptions_cmd(_) ->
timer:sleep(300), timer:sleep(300),
[?assertMatch({match, _} , re:run(Result, "b/b/c")) [?assertMatch({match, _} , re:run(Result, "b/b/c"))
|| Result <- emqx_mgmt_cli:subscriptions(["show", <<"client">>])], || Result <- emqx_mgmt_cli:subscriptions(["show", <<"client">>])],
?assertEqual(emqx_mgmt_cli:subscriptions(["add", "client", "b/b/c", "0"]), "ok~n"), ?assertEqual(emqx_mgmt_cli:subscriptions(["add", "client", "b/b/c", "0"]), "ok\n"),
?assertEqual(emqx_mgmt_cli:subscriptions(["del", "client", "b/b/c"]), "ok~n"), ?assertEqual(emqx_mgmt_cli:subscriptions(["del", "client", "b/b/c"]), "ok\n"),
unmock_print(). unmock_print().
t_listeners_cmd_old(_) -> t_listeners_cmd_old(_) ->
@ -304,7 +304,8 @@ t_listeners_cmd_new(_) ->
), ),
?assertEqual( ?assertEqual(
emqx_mgmt_cli:listeners(["restart", "bad:listener:identifier"]), emqx_mgmt_cli:listeners(["restart", "bad:listener:identifier"]),
"Failed to restart bad:listener:identifier listener: {no_such_listener,\"bad:listener:identifier\"}\n" "Failed to restart bad:listener:identifier listener:"
" {no_such_listener,\"bad:listener:identifier\"}\n"
), ),
unmock_print(). unmock_print().
@ -325,7 +326,7 @@ t_plugins_cmd(_) ->
), ),
?assertEqual( ?assertEqual(
emqx_mgmt_cli:plugins(["unload", "emqx_management"]), emqx_mgmt_cli:plugins(["unload", "emqx_management"]),
"Plugin emqx_management can not be unloaded.~n" "Plugin emqx_management can not be unloaded.\n"
), ),
unmock_print(). unmock_print().
@ -359,7 +360,7 @@ t_cli(_) ->
mock_print() -> mock_print() ->
catch meck:unload(emqx_ctl), catch meck:unload(emqx_ctl),
meck:new(emqx_ctl, [non_strict, passthrough]), meck:new(emqx_ctl, [non_strict, passthrough]),
meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg) end), meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg, []) end),
meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end), meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end),
meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end), meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end),
meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end). meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end).

View File

@ -105,10 +105,9 @@ cli_usage(_) ->
mock_print() -> mock_print() ->
catch meck:unload(emqx_ctl), catch meck:unload(emqx_ctl),
meck:new(emqx_ctl, [non_strict, passthrough]), meck:new(emqx_ctl, [non_strict, passthrough]),
meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg) end), meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg, []) end),
meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end), meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end),
meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end). meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end).
unmock_print() -> unmock_print() ->
meck:unload(). meck:unload().

View File

@ -1,135 +1,116 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{VSN, {VSN,
[ [{"4.3.6",
{"4.3.6", [{update,emqx_rule_metrics,{advanced,["4.3.6"]}},
[ {update, emqx_rule_metrics, {advanced, ["4.3.6"]}} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}
]},
{"4.3.5", {"4.3.5",
[ {update, emqx_rule_metrics, {advanced, ["4.3.5"]}} [{update,emqx_rule_metrics,{advanced,["4.3.5"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.4", {"4.3.4",
[ {update, emqx_rule_metrics, {advanced, ["4.3.4"]}} [{update,emqx_rule_metrics,{advanced,["4.3.4"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.3", {"4.3.3",
[ {update, emqx_rule_metrics, {advanced, ["4.3.3"]}} [{update,emqx_rule_metrics,{advanced,["4.3.3"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.2", {"4.3.2",
[ {update, emqx_rule_metrics, {advanced, ["4.3.2"]}} [{update,emqx_rule_metrics,{advanced,["4.3.2"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {apply,{emqx_stats,cancel_update,[rule_registery_stats]}} {apply,{emqx_stats,cancel_update,[rule_registery_stats]}},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.1", {"4.3.1",
[ {update, emqx_rule_metrics, {advanced, ["4.3.1"]}} [{update,emqx_rule_metrics,{advanced,["4.3.1"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {apply,{emqx_stats,cancel_update,[rule_registery_stats]}} {apply,{emqx_stats,cancel_update,[rule_registery_stats]}},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.0", {"4.3.0",
[ {update, emqx_rule_metrics, {advanced, ["4.3.0"]}} [{update,emqx_rule_metrics,{advanced,["4.3.0"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]} {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {apply,{emqx_stats,cancel_update,[rule_registery_stats]}} {apply,{emqx_stats,cancel_update,[rule_registery_stats]}},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]}, {<<".*">>,[]}],
{<<".*">>, []} [{"4.3.6",
], [{update,emqx_rule_metrics,{advanced,["4.3.6"]}},
[ {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
{"4.3.6", {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
[ {update, emqx_rule_metrics, {advanced, ["4.3.6"]}} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]}
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]}
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}
]},
{"4.3.5", {"4.3.5",
[ {update, emqx_rule_metrics, {advanced, ["4.3.5"]}} [{update,emqx_rule_metrics,{advanced,["4.3.5"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.4", {"4.3.4",
[ {update, emqx_rule_metrics, {advanced, ["4.3.4"]}} [{update,emqx_rule_metrics,{advanced,["4.3.4"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.3", {"4.3.3",
[ {update, emqx_rule_metrics, {advanced, ["4.3.3"]}} [{update,emqx_rule_metrics,{advanced,["4.3.3"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.2", {"4.3.2",
[ {update, emqx_rule_metrics, {advanced, ["4.3.2"]}} [{update,emqx_rule_metrics,{advanced,["4.3.2"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {apply,{emqx_stats,cancel_update,[rule_registery_stats]}} {apply,{emqx_stats,cancel_update,[rule_registery_stats]}},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.1", {"4.3.1",
[ {update, emqx_rule_metrics, {advanced, ["4.3.1"]}} [{update,emqx_rule_metrics,{advanced,["4.3.1"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {apply,{emqx_stats,cancel_update,[rule_registery_stats]}} {apply,{emqx_stats,cancel_update,[rule_registery_stats]}},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]},
{"4.3.0", {"4.3.0",
[ {update, emqx_rule_metrics, {advanced, ["4.3.0"]}} [{update,emqx_rule_metrics,{advanced,["4.3.0"]}},
, {load_module,emqx_rule_events,brutal_purge,soft_purge,[]} {load_module,emqx_rule_events,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]} {load_module,emqx_rule_funcs,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]} {load_module,emqx_rule_registry,brutal_purge,soft_purge,[]},
, {apply,{emqx_stats,cancel_update,[rule_registery_stats]}} {apply,{emqx_stats,cancel_update,[rule_registery_stats]}},
, {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]} {load_module,emqx_rule_actions,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]} {load_module,emqx_rule_runtime,brutal_purge,soft_purge,[]},
, {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]} {load_module,emqx_rule_engine_api,brutal_purge,soft_purge,[]}]},
]}, {<<".*">>,[]}]}.
{<<".*">>, []}
]
}.

View File

@ -187,7 +187,8 @@ end_per_group(_Groupname, _Config) ->
init_per_testcase(t_events, Config) -> init_per_testcase(t_events, Config) ->
ok = emqx_rule_engine:load_providers(), ok = emqx_rule_engine:load_providers(),
init_events_counters(), init_events_counters(),
ok = emqx_rule_registry:register_resource_types([make_simple_resource_type(simple_resource_type)]), ok = emqx_rule_registry:register_resource_types(
[make_simple_resource_type(simple_resource_type)]),
ok = emqx_rule_registry:add_action( ok = emqx_rule_registry:add_action(
#action{name = 'hook-metrics-action', app = ?APP, #action{name = 'hook-metrics-action', app = ?APP,
module = ?MODULE, on_create = hook_metrics_action, module = ?MODULE, on_create = hook_metrics_action,
@ -206,7 +207,10 @@ init_per_testcase(t_events, Config) ->
#{id => <<"rule:t_events">>, #{id => <<"rule:t_events">>,
rawsql => SQL, rawsql => SQL,
actions => [#{id => <<"action:inspect">>, name => 'inspect', args => #{}}, actions => [#{id => <<"action:inspect">>, name => 'inspect', args => #{}},
#{id => <<"action:hook-metrics-action">>, name => 'hook-metrics-action', args => #{}}], #{ id => <<"action:hook-metrics-action">>
, name => 'hook-metrics-action'
, args => #{}
}],
description => <<"Debug rule">>}), description => <<"Debug rule">>}),
?assertMatch(#rule{id = <<"rule:t_events">>}, Rule), ?assertMatch(#rule{id = <<"rule:t_events">>}, Rule),
[{hook_points_rules, Rule} | Config]; [{hook_points_rules, Rule} | Config];
@ -439,7 +443,8 @@ t_list_actions_api(_Config) ->
ok. ok.
t_show_action_api(_Config) -> t_show_action_api(_Config) ->
{ok, #{code := 0, data := Actions}} = emqx_rule_engine_api:show_action(#{name => 'inspect'}, []), {ok, #{code := 0, data := Actions}} =
emqx_rule_engine_api:show_action(#{name => 'inspect'}, []),
?assertEqual('inspect', maps:get(name, Actions)), ?assertEqual('inspect', maps:get(name, Actions)),
ok. ok.
@ -503,7 +508,8 @@ t_list_resource_types_api(_Config) ->
ok. ok.
t_show_resource_type_api(_Config) -> t_show_resource_type_api(_Config) ->
{ok, #{code := 0, data := RShow}} = emqx_rule_engine_api:show_resource_type(#{name => 'built_in'}, []), {ok, #{code := 0, data := RShow}} =
emqx_rule_engine_api:show_resource_type(#{name => 'built_in'}, []),
%ct:pal("RShow : ~p", [RShow]), %ct:pal("RShow : ~p", [RShow]),
?assertEqual(built_in, maps:get(name, RShow)), ?assertEqual(built_in, maps:get(name, RShow)),
ok. ok.
@ -521,7 +527,15 @@ t_rules_cli(_Config) ->
%ct:pal("Result : ~p", [RCreate]), %ct:pal("Result : ~p", [RCreate]),
?assertMatch({match, _}, re:run(RCreate, "created")), ?assertMatch({match, _}, re:run(RCreate, "created")),
RuleId = re:replace(re:replace(RCreate, "Rule\s", "", [{return, list}]), "\screated\n", "", [{return, list}]), RuleId = re:replace(
re:replace( RCreate
, "Rule\s"
, ""
, [{return, list}]
),
"\screated\n",
"",
[{return, list}]),
RList = emqx_rule_engine_cli:rules(["list"]), RList = emqx_rule_engine_cli:rules(["list"]),
?assertMatch({match, _}, re:run(RList, RuleId)), ?assertMatch({match, _}, re:run(RList, RuleId)),
@ -538,7 +552,7 @@ t_rules_cli(_Config) ->
?assertMatch({match, _}, re:run(RUpdate, "updated")), ?assertMatch({match, _}, re:run(RUpdate, "updated")),
RDelete = emqx_rule_engine_cli:rules(["delete", RuleId]), RDelete = emqx_rule_engine_cli:rules(["delete", RuleId]),
?assertEqual("ok~n", RDelete), ?assertEqual("ok\n", RDelete),
%ct:pal("RDelete : ~p", [RDelete]), %ct:pal("RDelete : ~p", [RDelete]),
%ct:pal("table action params after deleted: ~p", [ets:tab2list(emqx_action_instance_params)]), %ct:pal("table action params after deleted: ~p", [ets:tab2list(emqx_action_instance_params)]),
@ -562,8 +576,17 @@ t_actions_cli(_Config) ->
t_resources_cli(_Config) -> t_resources_cli(_Config) ->
mock_print(), mock_print(),
RCreate = emqx_rule_engine_cli:resources(["create", "built_in", "{\"a\" : 1}", "-d", "test resource"]), RCreate = emqx_rule_engine_cli:resources(
ResId = re:replace(re:replace(RCreate, "Resource\s", "", [{return, list}]), "\screated\n", "", [{return, list}]), ["create", "built_in", "{\"a\" : 1}", "-d", "test resource"]),
ResId = re:replace(
re:replace( RCreate
, "Resource\s"
, ""
, [{return, list}]
),
"\screated\n",
"",
[{return, list}]),
RList = emqx_rule_engine_cli:resources(["list"]), RList = emqx_rule_engine_cli:resources(["list"]),
?assertMatch({match, _}, re:run(RList, "test resource")), ?assertMatch({match, _}, re:run(RList, "test resource")),
@ -578,7 +601,7 @@ t_resources_cli(_Config) ->
%ct:pal("RShow : ~p", [RShow]), %ct:pal("RShow : ~p", [RShow]),
RDelete = emqx_rule_engine_cli:resources(["delete", ResId]), RDelete = emqx_rule_engine_cli:resources(["delete", ResId]),
?assertEqual("ok~n", RDelete), ?assertEqual("ok\n", RDelete),
RShow2 = emqx_rule_engine_cli:resources(["show", ResId]), RShow2 = emqx_rule_engine_cli:resources(["show", ResId]),
?assertMatch({match, _}, re:run(RShow2, "Cannot found")), ?assertMatch({match, _}, re:run(RShow2, "Cannot found")),
@ -765,48 +788,121 @@ t_get_rules_ordered_by_ts(_Config) ->
t_get_rules_for_2(_Config) -> t_get_rules_for_2(_Config) ->
Len0 = length(emqx_rule_registry:get_rules_for(<<"simple/1">>)), Len0 = length(emqx_rule_registry:get_rules_for(<<"simple/1">>)),
ok = emqx_rule_registry:add_rules( ok = emqx_rule_registry:add_rules(
[make_simple_rule(<<"rule-debug-1">>, <<"select * from \"simple/#\"">>, [<<"simple/#">>]), [make_simple_rule(
make_simple_rule(<<"rule-debug-2">>, <<"select * from \"simple/+\"">>, [<<"simple/+">>]), <<"rule-debug-1">>,
make_simple_rule(<<"rule-debug-3">>, <<"select * from \"simple/+/1\"">>, [<<"simple/+/1">>]), <<"select * from \"simple/#\"">>,
make_simple_rule(<<"rule-debug-4">>, <<"select * from \"simple/1\"">>, [<<"simple/1">>]), [<<"simple/#">>]),
make_simple_rule(<<"rule-debug-5">>, <<"select * from \"simple/2,simple/+,simple/3\"">>, [<<"simple/2">>,<<"simple/+">>, <<"simple/3">>]), make_simple_rule(
make_simple_rule(<<"rule-debug-6">>, <<"select * from \"simple/2,simple/3,simple/4\"">>, [<<"simple/2">>,<<"simple/3">>, <<"simple/4">>]) <<"rule-debug-2">>,
<<"select * from \"simple/+\"">>,
[<<"simple/+">>]),
make_simple_rule(
<<"rule-debug-3">>,
<<"select * from \"simple/+/1\"">>,
[<<"simple/+/1">>]),
make_simple_rule(
<<"rule-debug-4">>,
<<"select * from \"simple/1\"">>,
[<<"simple/1">>]),
make_simple_rule(
<<"rule-debug-5">>,
<<"select * from \"simple/2,simple/+,simple/3\"">>,
[<<"simple/2">>,<<"simple/+">>, <<"simple/3">>]),
make_simple_rule(
<<"rule-debug-6">>,
<<"select * from \"simple/2,simple/3,simple/4\"">>,
[<<"simple/2">>,<<"simple/3">>, <<"simple/4">>])
]), ]),
?assertEqual(Len0+4, length(emqx_rule_registry:get_rules_for(<<"simple/1">>))), ?assertEqual(Len0+4, length(emqx_rule_registry:get_rules_for(<<"simple/1">>))),
ok = emqx_rule_registry:remove_rules([<<"rule-debug-1">>, <<"rule-debug-2">>,<<"rule-debug-3">>, <<"rule-debug-4">>,<<"rule-debug-5">>, <<"rule-debug-6">>]), ok = emqx_rule_registry:remove_rules(
[ <<"rule-debug-1">>
, <<"rule-debug-2">>
, <<"rule-debug-3">>
, <<"rule-debug-4">>
, <<"rule-debug-5">>
, <<"rule-debug-6">>
]),
ok. ok.
t_get_rules_with_same_event(_Config) -> t_get_rules_with_same_event(_Config) ->
PubT = <<"simple/1">>, PubT = <<"simple/1">>,
PubN = length(emqx_rule_registry:get_rules_with_same_event(PubT)), PubN = length(emqx_rule_registry:get_rules_with_same_event(PubT)),
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/client_connected">>)), ?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/client_connected">>)),
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/client_disconnected">>)), ?assertEqual(
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/session_subscribed">>)), [],
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/session_unsubscribed">>)), emqx_rule_registry:get_rules_with_same_event(<<"$events/client_disconnected">>)),
?assertEqual(
[],
emqx_rule_registry:get_rules_with_same_event(<<"$events/session_subscribed">>)),
?assertEqual(
[],
emqx_rule_registry:get_rules_with_same_event(<<"$events/session_unsubscribed">>)),
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/message_delivered">>)), ?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/message_delivered">>)),
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/message_acked">>)), ?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/message_acked">>)),
?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/message_dropped">>)), ?assertEqual([], emqx_rule_registry:get_rules_with_same_event(<<"$events/message_dropped">>)),
ok = emqx_rule_registry:add_rules( ok = emqx_rule_registry:add_rules(
[make_simple_rule(<<"r1">>, <<"select * from \"simple/#\"">>, [<<"simple/#">>]), [make_simple_rule(<<"r1">>, <<"select * from \"simple/#\"">>, [<<"simple/#">>]),
make_simple_rule(<<"r2">>, <<"select * from \"abc/+\"">>, [<<"abc/+">>]), make_simple_rule(<<"r2">>, <<"select * from \"abc/+\"">>, [<<"abc/+">>]),
make_simple_rule(<<"r3">>, <<"select * from \"$events/client_connected\"">>, [<<"$events/client_connected">>]), make_simple_rule(
make_simple_rule(<<"r4">>, <<"select * from \"$events/client_disconnected\"">>, [<<"$events/client_disconnected">>]), <<"r3">>,
make_simple_rule(<<"r5">>, <<"select * from \"$events/session_subscribed\"">>, [<<"$events/session_subscribed">>]), <<"select * from \"$events/client_connected\"">>,
make_simple_rule(<<"r6">>, <<"select * from \"$events/session_unsubscribed\"">>, [<<"$events/session_unsubscribed">>]), [<<"$events/client_connected">>]),
make_simple_rule(<<"r7">>, <<"select * from \"$events/message_delivered\"">>, [<<"$events/message_delivered">>]), make_simple_rule(
make_simple_rule(<<"r8">>, <<"select * from \"$events/message_acked\"">>, [<<"$events/message_acked">>]), <<"r4">>,
make_simple_rule(<<"r9">>, <<"select * from \"$events/message_dropped\"">>, [<<"$events/message_dropped">>]), <<"select * from \"$events/client_disconnected\"">>,
make_simple_rule(<<"r10">>, <<"select * from \"t/1, $events/session_subscribed, $events/client_connected\"">>, [<<"t/1">>, <<"$events/session_subscribed">>, <<"$events/client_connected">>]) [<<"$events/client_disconnected">>]),
make_simple_rule(
<<"r5">>,
<<"select * from \"$events/session_subscribed\"">>,
[<<"$events/session_subscribed">>]),
make_simple_rule(
<<"r6">>,
<<"select * from \"$events/session_unsubscribed\"">>,
[<<"$events/session_unsubscribed">>]),
make_simple_rule(
<<"r7">>,
<<"select * from \"$events/message_delivered\"">>,
[<<"$events/message_delivered">>]),
make_simple_rule(
<<"r8">>,
<<"select * from \"$events/message_acked\"">>,
[<<"$events/message_acked">>]),
make_simple_rule(
<<"r9">>,
<<"select * from \"$events/message_dropped\"">>,
[<<"$events/message_dropped">>]),
make_simple_rule(
<<"r10">>,
<<"select * from \"t/1, $events/session_subscribed,"
" $events/client_connected\"">>,
[<<"t/1">>, <<"$events/session_subscribed">>, <<"$events/client_connected">>])
]), ]),
?assertEqual(PubN + 3, length(emqx_rule_registry:get_rules_with_same_event(PubT))), ?assertEqual(PubN + 3, length(emqx_rule_registry:get_rules_with_same_event(PubT))),
?assertEqual(2, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/client_connected">>))), ?assertEqual(
?assertEqual(1, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/client_disconnected">>))), 2,
?assertEqual(2, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/session_subscribed">>))), length(emqx_rule_registry:get_rules_with_same_event(<<"$events/client_connected">>))),
?assertEqual(1, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/session_unsubscribed">>))), ?assertEqual(
?assertEqual(1, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/message_delivered">>))), 1,
?assertEqual(1, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/message_acked">>))), length(emqx_rule_registry:get_rules_with_same_event(<<"$events/client_disconnected">>))),
?assertEqual(1, length(emqx_rule_registry:get_rules_with_same_event(<<"$events/message_dropped">>))), ?assertEqual(
ok = emqx_rule_registry:remove_rules([<<"r1">>, <<"r2">>,<<"r3">>, <<"r4">>,<<"r5">>, <<"r6">>, <<"r7">>, <<"r8">>, <<"r9">>, <<"r10">>]), 2,
length(emqx_rule_registry:get_rules_with_same_event(<<"$events/session_subscribed">>))),
?assertEqual(
1,
length(emqx_rule_registry:get_rules_with_same_event(<<"$events/session_unsubscribed">>))),
?assertEqual(
1,
length(emqx_rule_registry:get_rules_with_same_event(<<"$events/message_delivered">>))),
?assertEqual(
1,
length(emqx_rule_registry:get_rules_with_same_event(<<"$events/message_acked">>))),
?assertEqual(
1,
length(emqx_rule_registry:get_rules_with_same_event(<<"$events/message_dropped">>))),
ok = emqx_rule_registry:remove_rules(
[<<"r1">>, <<"r2">>,<<"r3">>,
<<"r4">>,<<"r5">>, <<"r6">>,
<<"r7">>, <<"r8">>, <<"r9">>, <<"r10">>]),
ok. ok.
t_add_get_remove_action(_Config) -> t_add_get_remove_action(_Config) ->
@ -882,7 +978,11 @@ register_resource_types() ->
emqx_rule_registry:register_resource_types([ResType1,ResType2]), emqx_rule_registry:register_resource_types([ResType1,ResType2]),
ok. ok.
get_resource_type() -> get_resource_type() ->
?assertMatch({ok, #resource_type{name = <<"resource-type-debug-1">>}}, emqx_rule_registry:find_resource_type(<<"resource-type-debug-1">>)), ?assertMatch( { ok
, #resource_type{name = <<"resource-type-debug-1">>}
}
, emqx_rule_registry:find_resource_type(<<"resource-type-debug-1">>)
),
ok. ok.
get_resource_types() -> get_resource_types() ->
ResTypes = emqx_rule_registry:get_resource_types(), ResTypes = emqx_rule_registry:get_resource_types(),
@ -947,11 +1047,18 @@ client_disconnected(Client, Client2) ->
verify_event('client.disconnected'), verify_event('client.disconnected'),
ok. ok.
session_subscribed(Client2) -> session_subscribed(Client2) ->
{ok, _, _} = emqtt:subscribe(Client2, #{'User-Property' => {<<"topic_name">>, <<"t1">>}}, <<"t1">>, 1), {ok, _, _} = emqtt:subscribe( Client2
, #{'User-Property' => {<<"topic_name">>, <<"t1">>}}
, <<"t1">>
, 1
),
verify_event('session.subscribed'), verify_event('session.subscribed'),
ok. ok.
session_unsubscribed(Client2) -> session_unsubscribed(Client2) ->
{ok, _, _} = emqtt:unsubscribe(Client2, #{'User-Property' => {<<"topic_name">>, <<"t1">>}}, <<"t1">>), {ok, _, _} = emqtt:unsubscribe( Client2
, #{'User-Property' => {<<"topic_name">>, <<"t1">>}}
, <<"t1">>
),
verify_event('session.unsubscribed'), verify_event('session.unsubscribed'),
ok. ok.
@ -977,7 +1084,10 @@ t_mfa_action(_Config) ->
{ok, #rule{id = Id}} = emqx_rule_engine:create_rule( {ok, #rule{id = Id}} = emqx_rule_engine:create_rule(
#{id => <<"rule:t_mfa_action">>, #{id => <<"rule:t_mfa_action">>,
rawsql => SQL, rawsql => SQL,
actions => [#{id => <<"action:mfa-test">>, name => 'mfa-action', args => #{}}], actions => [#{ id => <<"action:mfa-test">>
, name => 'mfa-action'
, args => #{}
}],
description => <<"Debug rule">>}), description => <<"Debug rule">>}),
{ok, Client} = emqtt:start_link([{username, <<"emqx">>}]), {ok, Client} = emqtt:start_link([{username, <<"emqx">>}]),
{ok, _} = emqtt:connect(Client), {ok, _} = emqtt:connect(Client),
@ -1676,12 +1786,18 @@ t_sqlparse_foreach_1(_Config) ->
Sql3 = "foreach payload.sensors " Sql3 = "foreach payload.sensors "
"from \"t/#\" ", "from \"t/#\" ",
?assertMatch({ok,[#{item := #{<<"cmd">> := <<"1">>}, clientid := <<"c_a">>}, ?assertMatch({ok,[#{item := #{<<"cmd">> := <<"1">>}, clientid := <<"c_a">>},
#{item := #{<<"cmd">> := <<"2">>, <<"name">> := <<"ct">>}, clientid := <<"c_a">>}]}, #{item := #{ <<"cmd">> := <<"2">>
, <<"name">> := <<"ct">>
}
, clientid := <<"c_a">>}]},
emqx_rule_sqltester:test( emqx_rule_sqltester:test(
#{<<"rawsql">> => Sql3, #{<<"rawsql">> => Sql3,
<<"ctx">> => #{ <<"ctx">> =>
<<"payload">> => <<"{\"sensors\": [{\"cmd\":\"1\"}, {\"cmd\":\"2\",\"name\":\"ct\"}]}">>, <<"clientid">> => <<"c_a">>, #{ <<"payload">> => <<"{\"sensors\": [{\"cmd\":\"1\"}, "
<<"topic">> => <<"t/a">>}})), "{\"cmd\":\"2\",\"name\":\"ct\"}]}">>
, <<"clientid">> => <<"c_a">>
, <<"topic">> => <<"t/a">>
}})),
Sql4 = "foreach payload.sensors " Sql4 = "foreach payload.sensors "
"from \"t/#\" ", "from \"t/#\" ",
{ok,[#{metadata := #{rule_id := TRuleId}}, {ok,[#{metadata := #{rule_id := TRuleId}},
@ -1766,12 +1882,17 @@ t_sqlparse_foreach_4(_Config) ->
#{<<"payload">> => #{<<"payload">> =>
<<"{\"sensors\": [{\"cmd\":\"1\"}, {\"cmd\":\"2\"}]}">>, <<"{\"sensors\": [{\"cmd\":\"1\"}, {\"cmd\":\"2\"}]}">>,
<<"topic">> => <<"t/a">>}})), <<"topic">> => <<"t/a">>}})),
?assertMatch({ok,[#{<<"msg_type">> := <<"1">>, <<"name">> := <<"n1">>}, #{<<"msg_type">> := <<"2">>}]}, ?assertMatch({ ok
, [ #{<<"msg_type">> := <<"1">>, <<"name">> := <<"n1">>}
, #{<<"msg_type">> := <<"2">>}
]
},
emqx_rule_sqltester:test( emqx_rule_sqltester:test(
#{<<"rawsql">> => Sql, #{<<"rawsql">> => Sql,
<<"ctx">> => <<"ctx">> =>
#{<<"payload">> => #{<<"payload">> =>
<<"{\"sensors\": [{\"cmd\":\"1\", \"name\":\"n1\"}, {\"cmd\":\"2\"}, {\"name\":\"n3\"}]}">>, <<"{\"sensors\": [{\"cmd\":\"1\", \"name\":\"n1\"}, "
"{\"cmd\":\"2\"}, {\"name\":\"n3\"}]}">>,
<<"topic">> => <<"t/a">>}})), <<"topic">> => <<"t/a">>}})),
?assertMatch({ok,[]}, ?assertMatch({ok,[]},
emqx_rule_sqltester:test( emqx_rule_sqltester:test(
@ -1828,8 +1949,13 @@ t_sqlparse_foreach_7(_Config) ->
"incase is_not_null(info.cmd) " "incase is_not_null(info.cmd) "
"from \"t/#\" " "from \"t/#\" "
"where s.page = '2' ", "where s.page = '2' ",
Payload = <<"{\"sensors\": {\"page\": 2, \"collection\": {\"info\":[{\"name\":\"cmd1\", \"cmd\":\"1\"}, {\"cmd\":\"2\"}]} } }">>, Payload = <<"{\"sensors\": {\"page\": 2, \"collection\": "
?assertMatch({ok,[#{<<"name">> := <<"cmd1">>, <<"msg_type">> := <<"1">>}, #{<<"msg_type">> := <<"2">>}]}, "{\"info\":[{\"name\":\"cmd1\", \"cmd\":\"1\"}, {\"cmd\":\"2\"}]} } }">>,
?assertMatch({ ok
, [ #{<<"name">> := <<"cmd1">>, <<"msg_type">> := <<"1">>}
, #{<<"msg_type">> := <<"2">>}
]
},
emqx_rule_sqltester:test( emqx_rule_sqltester:test(
#{<<"rawsql">> => Sql, #{<<"rawsql">> => Sql,
<<"ctx">> => <<"ctx">> =>
@ -1854,7 +1980,8 @@ t_sqlparse_foreach_8(_Config) ->
"incase is_map(info) " "incase is_map(info) "
"from \"t/#\" " "from \"t/#\" "
"where s.page = '2' ", "where s.page = '2' ",
Payload = <<"{\"sensors\": {\"page\": 2, \"collection\": {\"info\":[\"haha\", {\"name\":\"cmd1\", \"cmd\":\"1\"}]} } }">>, Payload = <<"{\"sensors\": {\"page\": 2, \"collection\": "
"{\"info\":[\"haha\", {\"name\":\"cmd1\", \"cmd\":\"1\"}]} } }">>,
?assertMatch({ok,[#{<<"name">> := <<"cmd1">>, <<"msg_type">> := <<"1">>}]}, ?assertMatch({ok,[#{<<"name">> := <<"cmd1">>, <<"msg_type">> := <<"1">>}]},
emqx_rule_sqltester:test( emqx_rule_sqltester:test(
#{<<"rawsql">> => Sql, #{<<"rawsql">> => Sql,
@ -1862,7 +1989,8 @@ t_sqlparse_foreach_8(_Config) ->
#{<<"payload">> => Payload, #{<<"payload">> => Payload,
<<"topic">> => <<"t/a">>}})), <<"topic">> => <<"t/a">>}})),
Sql3 = "foreach json_decode(payload) as p, p.sensors as s, s.collection as c, sublist(2,1,c.info) as info " Sql3 = "foreach json_decode(payload) as p, p.sensors as s,"
" s.collection as c, sublist(2,1,c.info) as info "
"do info.cmd as msg_type, info.name as name " "do info.cmd as msg_type, info.name as name "
"from \"t/#\" " "from \"t/#\" "
"where s.page = '2' ", "where s.page = '2' ",
@ -1992,10 +2120,12 @@ t_sqlparse_array_index_1(_Config) ->
Sql3 = "select " Sql3 = "select "
" payload.x[2].y " " payload.x[2].y "
"from \"t/#\" ", "from \"t/#\" ",
?assertMatch({ok, #{<<"payload">> := #{<<"x">> := [#{<<"y">> := 3}]}}}, emqx_rule_sqltester:test( ?assertMatch( {ok, #{<<"payload">> := #{<<"x">> := [#{<<"y">> := 3}]}}}
, emqx_rule_sqltester:test(
#{<<"rawsql">> => Sql3, #{<<"rawsql">> => Sql3,
<<"ctx">> => #{<<"payload">> => #{<<"x">> => [1,#{y => 3},4]}, <<"ctx">> => #{<<"payload">> => #{<<"x">> => [1,#{y => 3},4]},
<<"topic">> => <<"t/a">>}})), <<"topic">> => <<"t/a">>}})
),
%% index get with 'as' %% index get with 'as'
Sql4 = "select " Sql4 = "select "
@ -2228,10 +2358,12 @@ t_sqlparse_new_map(_Config) ->
t_sqlparse_payload_as(_Config) -> t_sqlparse_payload_as(_Config) ->
%% https://github.com/emqx/emqx/issues/3866 %% https://github.com/emqx/emqx/issues/3866
Sql00 = "SELECT " Sql00 = "SELECT "
" payload, map_get('engineWorkTime', payload.params, -1) as payload.params.engineWorkTime, " " payload, map_get('engineWorkTime', payload.params, -1) "
"as payload.params.engineWorkTime, "
" map_get('hydOilTem', payload.params, -1) as payload.params.hydOilTem " " map_get('hydOilTem', payload.params, -1) as payload.params.hydOilTem "
"FROM \"t/#\" ", "FROM \"t/#\" ",
Payload1 = <<"{ \"msgId\": 1002, \"params\": { \"convertTemp\": 20, \"engineSpeed\": 42, \"hydOilTem\": 30 } }">>, Payload1 = <<"{ \"msgId\": 1002, \"params\": "
"{ \"convertTemp\": 20, \"engineSpeed\": 42, \"hydOilTem\": 30 } }">>,
{ok, Res01} = emqx_rule_sqltester:test( {ok, Res01} = emqx_rule_sqltester:test(
#{<<"rawsql">> => Sql00, #{<<"rawsql">> => Sql00,
<<"ctx">> => #{<<"payload">> => Payload1, <<"ctx">> => #{<<"payload">> => Payload1,
@ -2711,7 +2843,7 @@ set_special_configs(_App) ->
mock_print() -> mock_print() ->
catch meck:unload(emqx_ctl), catch meck:unload(emqx_ctl),
meck:new(emqx_ctl, [non_strict, passthrough]), meck:new(emqx_ctl, [non_strict, passthrough]),
meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg) end), meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg, []) end),
meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end), meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end),
meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end), meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end),
meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end). meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end).
@ -2763,4 +2895,3 @@ t_clear_resource(_) ->
t_clear_action(_) -> t_clear_action(_) ->
error('TODO'). error('TODO').

View File

@ -143,7 +143,7 @@ t_join_cluster(_) ->
mock_print() -> mock_print() ->
catch meck:unload(emqx_ctl), catch meck:unload(emqx_ctl),
meck:new(emqx_ctl, [non_strict, passthrough]), meck:new(emqx_ctl, [non_strict, passthrough]),
meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg) end), meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg, []) end),
meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end), meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end),
meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end), meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end),
meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end). meck:expect(emqx_ctl, usage, fun(Cmd, Descr) -> emqx_ctl:format_usage(Cmd, Descr) end).

View File

@ -1,20 +1,23 @@
%% -*- mode: erlang -*- %% -*- mode: erlang -*-
{VSN, {VSN,
[{"4.3.12", [{"4.3.12",
[ {load_module,emqx_metrics,brutal_purge,soft_purge,[]} [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}} {load_module,emqx_ctl,brutal_purge,soft_purge,[]},
, {load_module,emqx_access_control,brutal_purge,soft_purge,[]} {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
, {load_module,emqx_channel,brutal_purge,soft_purge,[]} {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
, {load_module,emqx_session,brutal_purge,soft_purge,[]} {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
, {load_module,emqx_alarm,brutal_purge,soft_purge,[]} {load_module,emqx_channel,brutal_purge,soft_purge,[]},
, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]} {load_module,emqx_session,brutal_purge,soft_purge,[]},
, {load_module,emqx,brutal_purge,soft_purge,[]} {load_module,emqx_alarm,brutal_purge,soft_purge,[]},
, {load_module,emqx_app,brutal_purge,soft_purge,[]} {load_module,emqx_os_mon,brutal_purge,soft_purge,[]},
, {load_module,emqx_message,brutal_purge,soft_purge,[]} {load_module,emqx,brutal_purge,soft_purge,[]},
, {load_module,emqx_limiter,brutal_purge,soft_purge,[]} {load_module,emqx_app,brutal_purge,soft_purge,[]},
]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.11", {"4.3.11",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -31,7 +34,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.10", {"4.3.10",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]},
@ -48,7 +53,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.9", {"4.3.9",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -70,7 +77,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.8", {"4.3.8",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -92,7 +101,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.7", {"4.3.7",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -116,7 +127,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.6", {"4.3.6",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -141,7 +153,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.5", {"4.3.5",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -167,7 +180,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.4", {"4.3.4",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -194,7 +208,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.3", {"4.3.3",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -222,7 +237,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.2", {"4.3.2",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -250,7 +266,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.1", {"4.3.1",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]}, {load_module,emqx_vm,brutal_purge,soft_purge,[]},
@ -282,7 +299,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.0", {"4.3.0",
[{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}, {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
{apply,{emqx_metrics,upgrade_retained_delayed_counter_type,[]}}, {apply,{emqx_metrics,upgrade_retained_delayed_counter_type,[]}},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
@ -318,19 +336,22 @@
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{<<".*">>,[]}], {<<".*">>,[]}],
[{"4.3.12", [{"4.3.12",
[ {load_module,emqx_channel,brutal_purge,soft_purge,[]} [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
, {load_module,emqx_access_control,brutal_purge,soft_purge,[]} {load_module,emqx_ctl,brutal_purge,soft_purge,[]},
, {load_module,emqx_metrics,brutal_purge,soft_purge,[]} {load_module,emqx_channel,brutal_purge,soft_purge,[]},
, {load_module,emqx_session,brutal_purge,soft_purge,[]} {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
, {load_module,emqx_alarm,brutal_purge,soft_purge,[]} {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
, {load_module,emqx_os_mon,brutal_purge,soft_purge,[]} {load_module,emqx_session,brutal_purge,soft_purge,[]},
, {load_module,emqx,brutal_purge,soft_purge,[]} {load_module,emqx_alarm,brutal_purge,soft_purge,[]},
, {load_module,emqx_app,brutal_purge,soft_purge,[]} {load_module,emqx_os_mon,brutal_purge,soft_purge,[]},
, {load_module,emqx_message,brutal_purge,soft_purge,[]} {load_module,emqx,brutal_purge,soft_purge,[]},
, {load_module,emqx_limiter,brutal_purge,soft_purge,[]} {load_module,emqx_app,brutal_purge,soft_purge,[]},
]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.11", {"4.3.11",
[{load_module,emqx_connection,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]},
{load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
@ -346,7 +367,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.10", {"4.3.10",
[{load_module,emqx_channel,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_channel,brutal_purge,soft_purge,[]},
{load_module,emqx_metrics,brutal_purge,soft_purge,[]}, {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
{load_module,emqx_access_control,brutal_purge,soft_purge,[]}, {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
{load_module,emqx_session,brutal_purge,soft_purge,[]}, {load_module,emqx_session,brutal_purge,soft_purge,[]},
@ -362,7 +385,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.9", {"4.3.9",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -383,7 +408,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.8", {"4.3.8",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -404,7 +431,9 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.7", {"4.3.7",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_ctl,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -427,7 +456,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.6", {"4.3.6",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -451,7 +481,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.5", {"4.3.5",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -476,7 +507,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.4", {"4.3.4",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -502,7 +534,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.3", {"4.3.3",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_http_lib,brutal_purge,soft_purge,[]}, {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
{load_module,emqx_connection,brutal_purge,soft_purge,[]}, {load_module,emqx_connection,brutal_purge,soft_purge,[]},
@ -529,7 +562,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.2", {"4.3.2",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
@ -556,7 +590,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.1", {"4.3.1",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_pqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
{load_module,emqx_mqueue,brutal_purge,soft_purge,[]}, {load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
@ -587,7 +622,8 @@
{load_module,emqx_message,brutal_purge,soft_purge,[]}, {load_module,emqx_message,brutal_purge,soft_purge,[]},
{load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
{"4.3.0", {"4.3.0",
[{load_module,emqx_vm,brutal_purge,soft_purge,[]}, [{load_module,emqx_vm_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_vm,brutal_purge,soft_purge,[]},
{load_module,emqx_sys_mon,brutal_purge,soft_purge,[]}, {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
{load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]}, {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
{load_module,emqx_misc,brutal_purge,soft_purge,[]}, {load_module,emqx_misc,brutal_purge,soft_purge,[]},

View File

@ -43,8 +43,7 @@
]). ]).
%% Exports mainly for test cases %% Exports mainly for test cases
-export([ format/1 -export([ format/2
, format/2
, format_usage/1 , format_usage/1
, format_usage/2 , format_usage/2
]). ]).
@ -58,6 +57,8 @@
, code_change/3 , code_change/3
]). ]).
-elvis([{elvis_style, invalid_dynamic_call, #{ignore => [emqx_ctl]}}]).
-record(state, {seq = 0}). -record(state, {seq = 0}).
-type(cmd() :: atom()). -type(cmd() :: atom()).
@ -137,7 +138,7 @@ help() ->
-spec(print(io:format()) -> ok). -spec(print(io:format()) -> ok).
print(Msg) -> print(Msg) ->
io:format("~s", [format(Msg)]). io:format("~s", [format(Msg, [])]).
-spec(print(io:format(), [term()]) -> ok). -spec(print(io:format(), [term()]) -> ok).
print(Format, Args) -> print(Format, Args) ->
@ -151,10 +152,6 @@ usage(UsageList) ->
usage(CmdParams, Desc) -> usage(CmdParams, Desc) ->
io:format(format_usage(CmdParams, Desc)). io:format(format_usage(CmdParams, Desc)).
-spec(format(io:format()) -> string()).
format(Msg) ->
lists:flatten(io_lib:format("~s", [Msg])).
-spec(format(io:format(), [term()]) -> string()). -spec(format(io:format(), [term()]) -> string()).
format(Format, Args) -> format(Format, Args) ->
lists:flatten(io_lib:format(Format, Args)). lists:flatten(io_lib:format(Format, Args)).

View File

@ -70,7 +70,7 @@ t_print(_) ->
ok = emqx_ctl:print("~s", [<<"~!@#$%^&*()">>]), ok = emqx_ctl:print("~s", [<<"~!@#$%^&*()">>]),
% - check the output of the usage % - check the output of the usage
mock_print(), mock_print(),
?assertEqual("help~n", emqx_ctl:print("help~n")), ?assertEqual("help\n", emqx_ctl:print("help~n")),
?assertEqual("help", emqx_ctl:print("~s", [help])), ?assertEqual("help", emqx_ctl:print("~s", [help])),
?assertEqual("~!@#$%^&*()", emqx_ctl:print("~s", [<<"~!@#$%^&*()">>])), ?assertEqual("~!@#$%^&*()", emqx_ctl:print("~s", [<<"~!@#$%^&*()">>])),
unmock_print(). unmock_print().
@ -110,7 +110,7 @@ mock_print() ->
%% proxy usage/1,2 and print/1,2 to format_xx/1,2 funcs %% proxy usage/1,2 and print/1,2 to format_xx/1,2 funcs
catch meck:unload(emqx_ctl), catch meck:unload(emqx_ctl),
meck:new(emqx_ctl, [non_strict, passthrough]), meck:new(emqx_ctl, [non_strict, passthrough]),
meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg) end), meck:expect(emqx_ctl, print, fun(Arg) -> emqx_ctl:format(Arg, []) end),
meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end), meck:expect(emqx_ctl, print, fun(Msg, Arg) -> emqx_ctl:format(Msg, Arg) end),
meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end), meck:expect(emqx_ctl, usage, fun(Usages) -> emqx_ctl:format_usage(Usages) end),
meck:expect(emqx_ctl, usage, fun(CmdParams, CmdDescr) -> meck:expect(emqx_ctl, usage, fun(CmdParams, CmdDescr) ->