|
|
@@ -160,13 +160,55 @@ groups() ->
|
|
|
|
|
|
init_per_suite(Config) ->
|
|
|
Apps = emqx_cth_suite:start(
|
|
|
- [
|
|
|
+ lists:flatten([
|
|
|
emqx,
|
|
|
emqx_conf,
|
|
|
emqx_rule_engine,
|
|
|
emqx_auth,
|
|
|
- emqx_bridge
|
|
|
- ],
|
|
|
+ emqx_bridge,
|
|
|
+ [
|
|
|
+ {emqx_schema_validation, #{
|
|
|
+ config => #{
|
|
|
+ <<"schema_validation">> => #{
|
|
|
+ <<"validations">> => [
|
|
|
+ #{
|
|
|
+ <<"name">> => <<"v1">>,
|
|
|
+ <<"topics">> => [<<"sv/fail">>],
|
|
|
+ <<"strategy">> => <<"all_pass">>,
|
|
|
+ <<"failure_action">> => <<"drop">>,
|
|
|
+ <<"checks">> => [
|
|
|
+ #{
|
|
|
+ <<"type">> => <<"sql">>,
|
|
|
+ <<"sql">> => <<"select 1 where false">>
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ || is_ee()
|
|
|
+ ],
|
|
|
+ [
|
|
|
+ {emqx_message_transformation, #{
|
|
|
+ config => #{
|
|
|
+ <<"message_transformation">> => #{
|
|
|
+ <<"transformations">> => [
|
|
|
+ #{
|
|
|
+ <<"name">> => <<"t1">>,
|
|
|
+ <<"topics">> => <<"mt/fail">>,
|
|
|
+ <<"failure_action">> => <<"drop">>,
|
|
|
+ <<"payload_decoder">> => #{<<"type">> => <<"json">>},
|
|
|
+ <<"payload_encoder">> => #{<<"type">> => <<"json">>},
|
|
|
+ <<"operations">> => []
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ || is_ee()
|
|
|
+ ]
|
|
|
+ ]),
|
|
|
#{work_dir => emqx_cth_suite:work_dir(Config)}
|
|
|
),
|
|
|
[{apps, Apps} | Config].
|
|
|
@@ -250,6 +292,8 @@ init_per_testcase(t_events, Config) ->
|
|
|
"\"$events/message_delivered\", "
|
|
|
"\"$events/message_dropped\", "
|
|
|
"\"$events/delivery_dropped\", "
|
|
|
+ "\"$events/schema_validation_failed\", "
|
|
|
+ "\"$events/message_transformation_failed\", "
|
|
|
"\"t1\"",
|
|
|
{ok, Rule} = emqx_rule_engine:create_rule(
|
|
|
#{
|
|
|
@@ -834,6 +878,13 @@ t_events(_Config) ->
|
|
|
session_subscribed(Client2),
|
|
|
ct:pal("====== verify t1"),
|
|
|
message_publish(Client),
|
|
|
+ is_ee() andalso
|
|
|
+ begin
|
|
|
+ ct:pal("====== verify $events/schema_validation_failed"),
|
|
|
+ schema_validation_failed(Client),
|
|
|
+ ct:pal("====== verify $events/message_transformation_failed"),
|
|
|
+ message_transformation_failed(Client)
|
|
|
+ end,
|
|
|
ct:pal("====== verify $events/delivery_dropped"),
|
|
|
delivery_dropped(Client),
|
|
|
ct:pal("====== verify $events/message_delivered"),
|
|
|
@@ -1151,6 +1202,16 @@ message_dropped(Client) ->
|
|
|
message_acked(_Client) ->
|
|
|
verify_event('message.acked'),
|
|
|
ok.
|
|
|
+schema_validation_failed(Client) ->
|
|
|
+ {ok, _} = emqtt:publish(Client, <<"sv/fail">>, <<"">>, [{qos, 1}]),
|
|
|
+ ct:sleep(100),
|
|
|
+ verify_event('schema.validation_failed'),
|
|
|
+ ok.
|
|
|
+message_transformation_failed(Client) ->
|
|
|
+ {ok, _} = emqtt:publish(Client, <<"mt/fail">>, <<"will fail to { parse">>, [{qos, 1}]),
|
|
|
+ ct:sleep(100),
|
|
|
+ verify_event('message.transformation_failed'),
|
|
|
+ ok.
|
|
|
|
|
|
t_match_atom_and_binary(_Config) ->
|
|
|
SQL =
|
|
|
@@ -3834,6 +3895,9 @@ t_trace_rule_id(_Config) ->
|
|
|
%% Internal helpers
|
|
|
%%------------------------------------------------------------------------------
|
|
|
|
|
|
+is_ee() ->
|
|
|
+ emqx_release:edition() == ee.
|
|
|
+
|
|
|
republish_action(Topic) ->
|
|
|
republish_action(Topic, <<"${payload}">>).
|
|
|
|
|
|
@@ -3920,6 +3984,7 @@ verify_event_fields('message.publish', Fields) ->
|
|
|
username := Username,
|
|
|
payload := Payload,
|
|
|
peerhost := PeerHost,
|
|
|
+ peername := PeerName,
|
|
|
topic := Topic,
|
|
|
qos := QoS,
|
|
|
flags := Flags,
|
|
|
@@ -3934,6 +3999,7 @@ verify_event_fields('message.publish', Fields) ->
|
|
|
?assertEqual(<<"c_event">>, ClientId),
|
|
|
?assertEqual(<<"u_event">>, Username),
|
|
|
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
|
|
|
+ verify_peername(PeerName),
|
|
|
verify_ipaddr(PeerHost),
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assertEqual(1, QoS),
|
|
|
@@ -4008,6 +4074,7 @@ verify_event_fields(SubUnsub, Fields) when
|
|
|
clientid := ClientId,
|
|
|
username := Username,
|
|
|
peerhost := PeerHost,
|
|
|
+ peername := PeerName,
|
|
|
topic := Topic,
|
|
|
qos := QoS,
|
|
|
timestamp := Timestamp
|
|
|
@@ -4017,6 +4084,7 @@ verify_event_fields(SubUnsub, Fields) when
|
|
|
?assert(is_atom(reason)),
|
|
|
?assertEqual(<<"c_event2">>, ClientId),
|
|
|
?assertEqual(<<"u_event2">>, Username),
|
|
|
+ verify_peername(PeerName),
|
|
|
verify_ipaddr(PeerHost),
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assertEqual(1, QoS),
|
|
|
@@ -4043,6 +4111,7 @@ verify_event_fields('delivery.dropped', Fields) ->
|
|
|
node := Node,
|
|
|
payload := Payload,
|
|
|
peerhost := PeerHost,
|
|
|
+ peername := PeerName,
|
|
|
pub_props := Properties,
|
|
|
publish_received_at := EventAt,
|
|
|
qos := QoS,
|
|
|
@@ -4062,6 +4131,7 @@ verify_event_fields('delivery.dropped', Fields) ->
|
|
|
?assertEqual(<<"c_event">>, FromClientId),
|
|
|
?assertEqual(<<"u_event">>, FromUsername),
|
|
|
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
|
|
|
+ verify_peername(PeerName),
|
|
|
verify_ipaddr(PeerHost),
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assertEqual(1, QoS),
|
|
|
@@ -4078,6 +4148,7 @@ verify_event_fields('message.dropped', Fields) ->
|
|
|
username := Username,
|
|
|
payload := Payload,
|
|
|
peerhost := PeerHost,
|
|
|
+ peername := PeerName,
|
|
|
topic := Topic,
|
|
|
qos := QoS,
|
|
|
flags := Flags,
|
|
|
@@ -4093,6 +4164,7 @@ verify_event_fields('message.dropped', Fields) ->
|
|
|
?assertEqual(<<"c_event">>, ClientId),
|
|
|
?assertEqual(<<"u_event">>, Username),
|
|
|
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
|
|
|
+ verify_peername(PeerName),
|
|
|
verify_ipaddr(PeerHost),
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assertEqual(1, QoS),
|
|
|
@@ -4110,6 +4182,7 @@ verify_event_fields('message.delivered', Fields) ->
|
|
|
from_username := FromUsername,
|
|
|
payload := Payload,
|
|
|
peerhost := PeerHost,
|
|
|
+ peername := PeerName,
|
|
|
topic := Topic,
|
|
|
qos := QoS,
|
|
|
flags := Flags,
|
|
|
@@ -4126,6 +4199,7 @@ verify_event_fields('message.delivered', Fields) ->
|
|
|
?assertEqual(<<"c_event">>, FromClientId),
|
|
|
?assertEqual(<<"u_event">>, FromUsername),
|
|
|
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
|
|
|
+ verify_peername(PeerName),
|
|
|
verify_ipaddr(PeerHost),
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assertEqual(1, QoS),
|
|
|
@@ -4143,6 +4217,7 @@ verify_event_fields('message.acked', Fields) ->
|
|
|
from_username := FromUsername,
|
|
|
payload := Payload,
|
|
|
peerhost := PeerHost,
|
|
|
+ peername := PeerName,
|
|
|
topic := Topic,
|
|
|
qos := QoS,
|
|
|
flags := Flags,
|
|
|
@@ -4160,6 +4235,7 @@ verify_event_fields('message.acked', Fields) ->
|
|
|
?assertEqual(<<"c_event">>, FromClientId),
|
|
|
?assertEqual(<<"u_event">>, FromUsername),
|
|
|
?assertEqual(<<"{\"id\": 1, \"name\": \"ha\"}">>, Payload),
|
|
|
+ verify_peername(PeerName),
|
|
|
verify_ipaddr(PeerHost),
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assertEqual(1, QoS),
|
|
|
@@ -4203,6 +4279,7 @@ verify_event_fields('client.check_authz_complete', Fields) ->
|
|
|
clientid := ClientId,
|
|
|
action := Action,
|
|
|
result := Result,
|
|
|
+ peername := PeerName,
|
|
|
topic := Topic,
|
|
|
authz_source := AuthzSource,
|
|
|
username := Username
|
|
|
@@ -4210,6 +4287,7 @@ verify_event_fields('client.check_authz_complete', Fields) ->
|
|
|
?assertEqual(<<"t1">>, Topic),
|
|
|
?assert(lists:member(Action, [subscribe, publish])),
|
|
|
?assert(lists:member(Result, [allow, deny])),
|
|
|
+ verify_peername(PeerName),
|
|
|
?assert(
|
|
|
lists:member(AuthzSource, [
|
|
|
cache,
|
|
|
@@ -4228,14 +4306,52 @@ verify_event_fields('client.check_authz_complete', Fields) ->
|
|
|
verify_event_fields('client.check_authn_complete', Fields) ->
|
|
|
#{
|
|
|
clientid := ClientId,
|
|
|
+ peername := PeerName,
|
|
|
username := Username,
|
|
|
is_anonymous := IsAnonymous,
|
|
|
is_superuser := IsSuperuser
|
|
|
} = Fields,
|
|
|
+ verify_peername(PeerName),
|
|
|
?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])),
|
|
|
?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])),
|
|
|
?assert(erlang:is_boolean(IsAnonymous)),
|
|
|
- ?assert(erlang:is_boolean(IsSuperuser)).
|
|
|
+ ?assert(erlang:is_boolean(IsSuperuser));
|
|
|
+verify_event_fields('schema.validation_failed', Fields) ->
|
|
|
+ #{
|
|
|
+ validation := ValidationName,
|
|
|
+ clientid := ClientId,
|
|
|
+ username := Username,
|
|
|
+ payload := _Payload,
|
|
|
+ peername := PeerName,
|
|
|
+ qos := _QoS,
|
|
|
+ topic := _Topic,
|
|
|
+ flags := _Flags,
|
|
|
+ pub_props := _PubProps,
|
|
|
+ publish_received_at := _PublishReceivedAt
|
|
|
+ } = Fields,
|
|
|
+ ?assertEqual(<<"v1">>, ValidationName),
|
|
|
+ verify_peername(PeerName),
|
|
|
+ ?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])),
|
|
|
+ ?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])),
|
|
|
+ ok;
|
|
|
+verify_event_fields('message.transformation_failed', Fields) ->
|
|
|
+ #{
|
|
|
+ transformation := TransformationName,
|
|
|
+ clientid := ClientId,
|
|
|
+ username := Username,
|
|
|
+ payload := _Payload,
|
|
|
+ peername := PeerName,
|
|
|
+ qos := _QoS,
|
|
|
+ topic := _Topic,
|
|
|
+ flags := _Flags,
|
|
|
+ pub_props := _PubProps,
|
|
|
+ publish_received_at := _PublishReceivedAt
|
|
|
+ } = Fields,
|
|
|
+ ?assertEqual(<<"t1">>, TransformationName),
|
|
|
+ verify_peername(PeerName),
|
|
|
+ ?assert(lists:member(ClientId, [<<"c_event">>, <<"c_event2">>])),
|
|
|
+ ?assert(lists:member(Username, [<<"u_event">>, <<"u_event2">>])),
|
|
|
+ ok.
|
|
|
|
|
|
verify_peername(PeerName) ->
|
|
|
case string:split(PeerName, ":") of
|