Add test case for emqx_mod_rewrite

This commit is contained in:
GilbertWong 2019-08-28 09:17:18 +08:00 committed by Gilbert
parent a4e9142979
commit 783e29d6f7
2 changed files with 30 additions and 56 deletions

View File

@ -21,6 +21,11 @@
-include_lib("emqx.hrl"). -include_lib("emqx.hrl").
-include_lib("emqx_mqtt.hrl"). -include_lib("emqx_mqtt.hrl").
-ifdef(TEST).
-compile(export_all).
-compile(nowarn_export_all).
-endif.
%% APIs %% APIs
-export([ rewrite_subscribe/4 -export([ rewrite_subscribe/4
, rewrite_unsubscribe/4 , rewrite_unsubscribe/4
@ -86,4 +91,3 @@ compile(Rules) ->
{ok, MP} = re:compile(Re), {ok, MP} = re:compile(Re),
{rewrite, Topic, MP, Dest} {rewrite, Topic, MP, Dest}
end, Rules). end, Rules).

View File

@ -19,63 +19,33 @@
-compile(export_all). -compile(export_all).
-compile(nowarn_export_all). -compile(nowarn_export_all).
-import(emqx_mod_rewrite, -include("emqx_mqtt.hrl").
[ rewrite_subscribe/4 -include_lib("proper/include/proper.hrl").
, rewrite_unsubscribe/4
, rewrite_publish/2
]).
-include_lib("emqx.hrl").
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-define(TEST_RULES, [<<"x/# ^x/y/(.+)$ z/y/$1">>, -define(rules, [{rewrite,<<"x/#">>,<<"^x/y/(.+)$">>,<<"z/y/$1">>},
<<"y/+/z/# ^y/(.+)/z/(.+)$ y/z/$2">> {rewrite,<<"y/+/z/#">>,<<"^y/(.+)/z/(.+)$">>,<<"y/z/$2">>}]).
]).
all() -> emqx_ct:all(?MODULE). all() -> emqx_ct:all(?MODULE).
%%-------------------------------------------------------------------- t_rewrite_rule(_Config) ->
%% Test cases {ok, _} = emqx_hooks:start_link(),
%%-------------------------------------------------------------------- ok = emqx_mod_rewrite:load(?rules),
RawTopicFilters = [{<<"x/y/2">>, opts},
t_rewrite_subscribe(_) -> {<<"x/1/2">>, opts},
?assertEqual({ok, [{<<"test">>, #{}}]}, {<<"y/a/z/b">>, opts},
rewrite(subscribe, [{<<"test">>, #{}}])), {<<"y/def">>, opts}],
?assertEqual({ok, [{<<"z/y/test">>, #{}}]}, SubTopicFilters = emqx_hooks:run_fold('client.subscribe', [client, properties], RawTopicFilters),
rewrite(subscribe, [{<<"x/y/test">>, #{}}])), UnSubTopicFilters = emqx_hooks:run_fold('client.unsubscribe', [client, properties], RawTopicFilters),
?assertEqual({ok, [{<<"y/z/test_topic">>, #{}}]}, Messages = [emqx_hooks:run_fold('message.publish', [], emqx_message:make(Topic, <<"payload">>))
rewrite(subscribe, [{<<"y/test/z/test_topic">>, #{}}])). || {Topic, _Opts} <- RawTopicFilters],
ExpectedTopicFilters = [{<<"z/y/2">>, opts},
t_rewrite_unsubscribe(_) -> {<<"x/1/2">>, opts},
?assertEqual({ok, [{<<"test">>, #{}}]}, {<<"y/z/b">>, opts},
rewrite(unsubscribe, [{<<"test">>, #{}}])), {<<"y/def">>, opts}],
?assertEqual({ok, [{<<"z/y/test">>, #{}}]}, ?assertEqual(ExpectedTopicFilters, SubTopicFilters),
rewrite(unsubscribe, [{<<"x/y/test">>, #{}}])), ?assertEqual(ExpectedTopicFilters, UnSubTopicFilters),
?assertEqual({ok, [{<<"y/z/test_topic">>, #{}}]}, [?assertEqual(ExpectedTopic, emqx_message:topic(Message))
rewrite(unsubscribe, [{<<"y/test/z/test_topic">>, #{}}])). || {{ExpectedTopic, _opts}, Message} <- lists:zip(ExpectedTopicFilters, Messages)],
ok = emqx_mod_rewrite:unload(?rules),
t_rewrite_publish(_) -> ok = emqx_hooks:stop().
?assertMatch({ok, #message{topic = <<"test">>}},
rewrite(publish, #message{topic = <<"test">>})),
?assertMatch({ok, #message{topic = <<"z/y/test">>}},
rewrite(publish, #message{topic = <<"x/y/test">>})),
?assertMatch({ok, #message{topic = <<"y/z/test_topic">>}},
rewrite(publish, #message{topic = <<"y/test/z/test_topic">>})).
%%--------------------------------------------------------------------
%% Helper functions
%%--------------------------------------------------------------------
rewrite(subscribe, TopicFilters) ->
rewrite_subscribe(#{}, #{}, TopicFilters, rules());
rewrite(unsubscribe, TopicFilters) ->
rewrite_unsubscribe(#{}, #{}, TopicFilters, rules());
rewrite(publish, Msg) -> rewrite_publish(Msg, rules()).
rules() ->
[begin
[Topic, Re, Dest] = string:split(Rule, " ", all),
{ok, MP} = re:compile(Re),
{rewrite, Topic, MP, Dest}
end || Rule <- ?TEST_RULES].