test(exhook): more case for topic filter wildcards/level and different qos

This commit is contained in:
JimMoen 2022-08-26 11:13:44 +08:00
parent 2657b78c44
commit 820e848909
2 changed files with 60 additions and 10 deletions

View File

@ -169,22 +169,72 @@ t_message_topic_filters(_) ->
{ok, C1} = emqtt:start_link([{clientid, <<"client1">>}, {username, <<"gooduser">>}]), {ok, _} = emqtt:connect(C1),
{ok, C2} = emqtt:start_link([{clientid, <<"test_filter_client">>}, {username, <<"gooduser">>}]), {ok, _} = emqtt:connect(C2),
{ok, _, _} = emqtt:subscribe(C1,[{<<"t/1">>, qos0}, {<<"t/2">>, qos0}]),
{ok, _, _} = emqtt:subscribe(C1,[{<<"exhook/hardcoded">>, qos0},
{<<"t/1">>, qos0},
{<<"t/2">>, qos0},
{<<"a/1">>, qos1},
{<<"a/2">>, qos2},
{<<"b/1">>, qos1},
{<<"b/2">>, qos2},
{<<"b/3/4">>, qos1},
{<<"b/3/4/5">>, qos2}
]),
%% server only handle topic `t/1`, rewrite all topic to `exhook/hardcoded`,
%% rewrite all payload to <<"after_hardcoded">>
%% See emqx_exhook_demo_svr:on_message_publish/2
'test_t/1_topic'(C1, C2),
'test_a/#_topic'(C1, C2),
'test_b/+_topic'(C1, C2),
ok = emqtt:disconnect(C1),
ok = emqtt:disconnect(C2).
'test_t/1_topic'(_C1, C2) ->
ok = emqtt:publish(C2, <<"t/1">>, ?BEFORE, 0),
[Msg1 | _] = receive_messages(1),
ct:pal("~p", [Msg1]),
%% server only handle topic `t/1`, rewrite topic `t/1` => `t/2`, rewrite payload hardcoded.
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg1)),
ok = emqtt:publish(C2, <<"t/2">>, ?BEFORE, 0),
[Msg2 | _] = receive_messages(1),
ct:pal("~p", [Msg2]),
%% `t/2` not matched, no gRPC call, no handled
?assertEqual({ok, ?BEFORE}, maps:find(payload, Msg2)),
?assertEqual({ok, ?BEFORE}, maps:find(payload, Msg2)).
'test_a/#_topic'(_C1, C2) ->
{ok, _} = emqtt:publish(C2, <<"a/1">>, ?BEFORE, 1),
[Msg1 | _] = receive_messages(1),
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg1)),
{ok, _} = emqtt:publish(C2, <<"a/2">>, ?BEFORE, 1),
[Msg2 | _] = receive_messages(1),
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg2)),
{ok, _} = emqtt:publish(C2, <<"a/3/4">>, ?BEFORE, 1),
[Msg3 | _] = receive_messages(1),
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg3)),
{ok, _} = emqtt:publish(C2, <<"a/3/4/5">>, ?BEFORE, 1),
[Msg4 | _] = receive_messages(1),
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg4)).
'test_b/+_topic'(_C1, C2) ->
{ok, _} = emqtt:publish(C2, <<"b/1">>, ?BEFORE, 1),
[Msg1 | _] = receive_messages(1),
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg1)),
{ok, _} = emqtt:publish(C2, <<"b/2">>, ?BEFORE, 1),
[Msg2 | _] = receive_messages(1),
?assertEqual({ok, ?AFTER}, maps:find(payload, Msg2)),
{ok, _} = emqtt:publish(C2, <<"b/3/4">>, ?BEFORE, 1),
[Msg3 | _] = receive_messages(1),
?assertEqual({ok, ?BEFORE}, maps:find(payload, Msg3)),
{ok, _} = emqtt:publish(C2, <<"b/3/4/5">>, ?BEFORE, 2),
[Msg4 | _] = receive_messages(1),
?assertEqual({ok, ?BEFORE}, maps:find(payload, Msg4)).
ok = emqtt:disconnect(C1),
ok = emqtt:disconnect(C2).
%%--------------------------------------------------------------------
%% Utils

View File

@ -137,7 +137,7 @@ on_provider_loaded(#{meta := #{cluster_name := Name}} = Req, Md) ->
#{name => <<"session.takeovered">>},
#{name => <<"session.terminated">>}],
PublishWithFilter =
[#{name => <<"message.publish">>, topics => [<<"t/1">>]}],
[#{name => <<"message.publish">>, topics => [<<"t/1">>, <<"a/#">>, <<"b/+">>]}],
PublishWithOutFilter =
[#{name => <<"message.publish">>}],
HooksMessage =
@ -328,7 +328,7 @@ on_message_publish(#{message := #{from := From} = Msg} = Req, Md) ->
value => {message, NMsg}}, Md};
<<"test_filter_client">> ->
%% rewrite topic and payload
NMsg = Msg#{topic => <<"t/2">>,
NMsg = Msg#{topic => <<"exhook/hardcoded">>,
payload => ?AFTER_HARDCODED_PAYLOAD},
{ok, #{type => 'STOP_AND_RETURN',
value => {message, NMsg}}, Md};