|
|
@@ -53,6 +53,8 @@
|
|
|
?FORALL(Vars, Types, Exprs)
|
|
|
)
|
|
|
).
|
|
|
+-define(DEFAULT_CLUSTER_NAME_ATOM, emqxcl).
|
|
|
+-define(DEFAULT_CLUSTER_NAME_BIN, <<"emqxcl">>).
|
|
|
|
|
|
%%--------------------------------------------------------------------
|
|
|
%% Properties
|
|
|
@@ -60,15 +62,16 @@
|
|
|
|
|
|
prop_client_connect() ->
|
|
|
?ALL(
|
|
|
- {ConnInfo, ConnProps},
|
|
|
- {conninfo(), conn_properties()},
|
|
|
+ {ConnInfo, ConnProps, Meta},
|
|
|
+ {conninfo(), conn_properties(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('client.connect', [ConnInfo, ConnProps]),
|
|
|
{'on_client_connect', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
#{
|
|
|
props => properties(ConnProps),
|
|
|
- conninfo => from_conninfo(ConnInfo)
|
|
|
+ conninfo => from_conninfo(ConnInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -77,8 +80,8 @@ prop_client_connect() ->
|
|
|
|
|
|
prop_client_connack() ->
|
|
|
?ALL(
|
|
|
- {ConnInfo, Rc, AckProps},
|
|
|
- {conninfo(), connack_return_code(), ack_properties()},
|
|
|
+ {ConnInfo, Rc, AckProps, Meta},
|
|
|
+ {conninfo(), connack_return_code(), ack_properties(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('client.connack', [ConnInfo, Rc, AckProps]),
|
|
|
{'on_client_connack', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
@@ -86,7 +89,8 @@ prop_client_connack() ->
|
|
|
#{
|
|
|
props => properties(AckProps),
|
|
|
result_code => atom_to_binary(Rc, utf8),
|
|
|
- conninfo => from_conninfo(ConnInfo)
|
|
|
+ conninfo => from_conninfo(ConnInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -95,8 +99,8 @@ prop_client_connack() ->
|
|
|
|
|
|
prop_client_authenticate() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo0, AuthResult},
|
|
|
- {clientinfo(), authresult()},
|
|
|
+ {ClientInfo0, AuthResult, Meta},
|
|
|
+ {clientinfo(), authresult(), request_meta()},
|
|
|
begin
|
|
|
ClientInfo = inject_magic_into(username, ClientInfo0),
|
|
|
OutAuthResult = emqx_hooks:run_fold('client.authenticate', [ClientInfo], AuthResult),
|
|
|
@@ -120,7 +124,8 @@ prop_client_authenticate() ->
|
|
|
Expected =
|
|
|
#{
|
|
|
result => authresult_to_bool(AuthResult),
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -129,8 +134,8 @@ prop_client_authenticate() ->
|
|
|
|
|
|
prop_client_authorize() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo0, PubSub, Topic, Result},
|
|
|
- {clientinfo(), oneof([publish, subscribe]), topic(), oneof([allow, deny])},
|
|
|
+ {ClientInfo0, PubSub, Topic, Result, Meta},
|
|
|
+ {clientinfo(), oneof([publish, subscribe]), topic(), oneof([allow, deny]), request_meta()},
|
|
|
begin
|
|
|
ClientInfo = inject_magic_into(username, ClientInfo0),
|
|
|
OutResult = emqx_hooks:run_fold(
|
|
|
@@ -153,7 +158,8 @@ prop_client_authorize() ->
|
|
|
result => aclresult_to_bool(Result),
|
|
|
type => pubsub_to_enum(PubSub),
|
|
|
topic => Topic,
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -162,13 +168,16 @@ prop_client_authorize() ->
|
|
|
|
|
|
prop_client_connected() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, ConnInfo},
|
|
|
- {clientinfo(), conninfo()},
|
|
|
+ {ClientInfo, ConnInfo, Meta},
|
|
|
+ {clientinfo(), conninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('client.connected', [ClientInfo, ConnInfo]),
|
|
|
{'on_client_connected', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
- #{clientinfo => from_clientinfo(ClientInfo)},
|
|
|
+ #{
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
+ },
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
end
|
|
|
@@ -176,15 +185,16 @@ prop_client_connected() ->
|
|
|
|
|
|
prop_client_disconnected() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, Reason, ConnInfo},
|
|
|
- {clientinfo(), shutdown_reason(), conninfo()},
|
|
|
+ {ClientInfo, Reason, ConnInfo, Meta},
|
|
|
+ {clientinfo(), shutdown_reason(), conninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('client.disconnected', [ClientInfo, Reason, ConnInfo]),
|
|
|
{'on_client_disconnected', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
#{
|
|
|
reason => stringfy(Reason),
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -193,8 +203,8 @@ prop_client_disconnected() ->
|
|
|
|
|
|
prop_client_subscribe() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, SubProps, TopicTab},
|
|
|
- {clientinfo(), sub_properties(), topictab()},
|
|
|
+ {ClientInfo, SubProps, TopicTab, Meta},
|
|
|
+ {clientinfo(), sub_properties(), topictab(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('client.subscribe', [ClientInfo, SubProps, TopicTab]),
|
|
|
{'on_client_subscribe', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
@@ -202,7 +212,8 @@ prop_client_subscribe() ->
|
|
|
#{
|
|
|
props => properties(SubProps),
|
|
|
topic_filters => topicfilters(TopicTab),
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -211,8 +222,8 @@ prop_client_subscribe() ->
|
|
|
|
|
|
prop_client_unsubscribe() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, UnSubProps, TopicTab},
|
|
|
- {clientinfo(), unsub_properties(), topictab()},
|
|
|
+ {ClientInfo, UnSubProps, TopicTab, Meta},
|
|
|
+ {clientinfo(), unsub_properties(), topictab(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('client.unsubscribe', [ClientInfo, UnSubProps, TopicTab]),
|
|
|
{'on_client_unsubscribe', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
@@ -220,7 +231,8 @@ prop_client_unsubscribe() ->
|
|
|
#{
|
|
|
props => properties(UnSubProps),
|
|
|
topic_filters => topicfilters(TopicTab),
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -229,13 +241,16 @@ prop_client_unsubscribe() ->
|
|
|
|
|
|
prop_session_created() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, SessInfo},
|
|
|
- {clientinfo(), sessioninfo()},
|
|
|
+ {ClientInfo, SessInfo, Meta},
|
|
|
+ {clientinfo(), sessioninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.created', [ClientInfo, SessInfo]),
|
|
|
{'on_session_created', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
- #{clientinfo => from_clientinfo(ClientInfo)},
|
|
|
+ #{
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
+ },
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
end
|
|
|
@@ -243,8 +258,8 @@ prop_session_created() ->
|
|
|
|
|
|
prop_session_subscribed() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, Topic, SubOpts},
|
|
|
- {clientinfo(), topic(), subopts()},
|
|
|
+ {ClientInfo, Topic, SubOpts, Meta},
|
|
|
+ {clientinfo(), topic(), subopts(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.subscribed', [ClientInfo, Topic, SubOpts]),
|
|
|
{'on_session_subscribed', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
@@ -252,7 +267,8 @@ prop_session_subscribed() ->
|
|
|
#{
|
|
|
topic => Topic,
|
|
|
subopts => subopts(SubOpts),
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -261,15 +277,16 @@ prop_session_subscribed() ->
|
|
|
|
|
|
prop_session_unsubscribed() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, Topic, SubOpts},
|
|
|
- {clientinfo(), topic(), subopts()},
|
|
|
+ {ClientInfo, Topic, SubOpts, Meta},
|
|
|
+ {clientinfo(), topic(), subopts(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.unsubscribed', [ClientInfo, Topic, SubOpts]),
|
|
|
{'on_session_unsubscribed', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
#{
|
|
|
topic => Topic,
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -278,13 +295,16 @@ prop_session_unsubscribed() ->
|
|
|
|
|
|
prop_session_resumed() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, SessInfo},
|
|
|
- {clientinfo(), sessioninfo()},
|
|
|
+ {ClientInfo, SessInfo, Meta},
|
|
|
+ {clientinfo(), sessioninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.resumed', [ClientInfo, SessInfo]),
|
|
|
{'on_session_resumed', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
- #{clientinfo => from_clientinfo(ClientInfo)},
|
|
|
+ #{
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
+ },
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
end
|
|
|
@@ -292,13 +312,13 @@ prop_session_resumed() ->
|
|
|
|
|
|
prop_session_discared() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, SessInfo},
|
|
|
- {clientinfo(), sessioninfo()},
|
|
|
+ {ClientInfo, SessInfo, Meta},
|
|
|
+ {clientinfo(), sessioninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.discarded', [ClientInfo, SessInfo]),
|
|
|
{'on_session_discarded', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
- #{clientinfo => from_clientinfo(ClientInfo)},
|
|
|
+ #{clientinfo => from_clientinfo(ClientInfo), meta => Meta},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
end
|
|
|
@@ -306,13 +326,13 @@ prop_session_discared() ->
|
|
|
|
|
|
prop_session_takenover() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, SessInfo},
|
|
|
- {clientinfo(), sessioninfo()},
|
|
|
+ {ClientInfo, SessInfo, Meta},
|
|
|
+ {clientinfo(), sessioninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.takenover', [ClientInfo, SessInfo]),
|
|
|
{'on_session_takenover', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
- #{clientinfo => from_clientinfo(ClientInfo)},
|
|
|
+ #{clientinfo => from_clientinfo(ClientInfo), meta => Meta},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
end
|
|
|
@@ -320,15 +340,16 @@ prop_session_takenover() ->
|
|
|
|
|
|
prop_session_terminated() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, Reason, SessInfo},
|
|
|
- {clientinfo(), shutdown_reason(), sessioninfo()},
|
|
|
+ {ClientInfo, Reason, SessInfo, Meta},
|
|
|
+ {clientinfo(), shutdown_reason(), sessioninfo(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('session.terminated', [ClientInfo, Reason, SessInfo]),
|
|
|
{'on_session_terminated', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
#{
|
|
|
reason => stringfy(Reason),
|
|
|
- clientinfo => from_clientinfo(ClientInfo)
|
|
|
+ clientinfo => from_clientinfo(ClientInfo),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp),
|
|
|
true
|
|
|
@@ -337,8 +358,8 @@ prop_session_terminated() ->
|
|
|
|
|
|
prop_message_publish() ->
|
|
|
?ALL(
|
|
|
- Msg0,
|
|
|
- message(),
|
|
|
+ {Msg0, Meta},
|
|
|
+ {message(), request_meta()},
|
|
|
begin
|
|
|
Msg = emqx_message:from_map(
|
|
|
inject_magic_into(from, emqx_message:to_map(Msg0))
|
|
|
@@ -381,7 +402,10 @@ prop_message_publish() ->
|
|
|
|
|
|
{'on_message_publish', Resp} = emqx_exhook_demo_svr:take(),
|
|
|
Expected =
|
|
|
- #{message => from_message(Msg)},
|
|
|
+ #{
|
|
|
+ message => from_message(Msg),
|
|
|
+ meta => Meta
|
|
|
+ },
|
|
|
?assertEqual(Expected, Resp)
|
|
|
end,
|
|
|
true
|
|
|
@@ -390,8 +414,8 @@ prop_message_publish() ->
|
|
|
|
|
|
prop_message_dropped() ->
|
|
|
?ALL(
|
|
|
- {Msg, By, Reason},
|
|
|
- {message(), hardcoded, shutdown_reason()},
|
|
|
+ {Msg, By, Reason, Meta},
|
|
|
+ {message(), hardcoded, shutdown_reason(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('message.dropped', [Msg, By, Reason]),
|
|
|
case emqx_topic:match(emqx_message:topic(Msg), <<"$SYS/#">>) of
|
|
|
@@ -402,7 +426,8 @@ prop_message_dropped() ->
|
|
|
Expected =
|
|
|
#{
|
|
|
reason => stringfy(Reason),
|
|
|
- message => from_message(Msg)
|
|
|
+ message => from_message(Msg),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp)
|
|
|
end,
|
|
|
@@ -412,8 +437,8 @@ prop_message_dropped() ->
|
|
|
|
|
|
prop_message_delivered() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, Msg},
|
|
|
- {clientinfo(), message()},
|
|
|
+ {ClientInfo, Msg, Meta},
|
|
|
+ {clientinfo(), message(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('message.delivered', [ClientInfo, Msg]),
|
|
|
case emqx_topic:match(emqx_message:topic(Msg), <<"$SYS/#">>) of
|
|
|
@@ -424,7 +449,8 @@ prop_message_delivered() ->
|
|
|
Expected =
|
|
|
#{
|
|
|
clientinfo => from_clientinfo(ClientInfo),
|
|
|
- message => from_message(Msg)
|
|
|
+ message => from_message(Msg),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp)
|
|
|
end,
|
|
|
@@ -434,8 +460,8 @@ prop_message_delivered() ->
|
|
|
|
|
|
prop_message_acked() ->
|
|
|
?ALL(
|
|
|
- {ClientInfo, Msg},
|
|
|
- {clientinfo(), message()},
|
|
|
+ {ClientInfo, Msg, Meta},
|
|
|
+ {clientinfo(), message(), request_meta()},
|
|
|
begin
|
|
|
ok = emqx_hooks:run('message.acked', [ClientInfo, Msg]),
|
|
|
case emqx_topic:match(emqx_message:topic(Msg), <<"$SYS/#">>) of
|
|
|
@@ -446,7 +472,8 @@ prop_message_acked() ->
|
|
|
Expected =
|
|
|
#{
|
|
|
clientinfo => from_clientinfo(ClientInfo),
|
|
|
- message => from_message(Msg)
|
|
|
+ message => from_message(Msg),
|
|
|
+ meta => Meta
|
|
|
},
|
|
|
?assertEqual(Expected, Resp)
|
|
|
end,
|
|
|
@@ -500,6 +527,8 @@ stringfy(Term) when is_integer(Term) ->
|
|
|
integer_to_binary(Term);
|
|
|
stringfy(Term) when is_atom(Term) ->
|
|
|
atom_to_binary(Term, utf8);
|
|
|
+stringfy(Term) when is_list(Term) ->
|
|
|
+ list_to_binary(Term);
|
|
|
stringfy(Term) ->
|
|
|
unicode:characters_to_binary((io_lib:format("~0p", [Term]))).
|
|
|
|
|
|
@@ -569,6 +598,8 @@ from_message(Msg) ->
|
|
|
|
|
|
do_setup() ->
|
|
|
logger:set_primary_config(#{level => warning}),
|
|
|
+ ok = ekka:start(),
|
|
|
+ application:set_env(ekka, cluster_name, ?DEFAULT_CLUSTER_NAME_ATOM),
|
|
|
_ = emqx_exhook_demo_svr:start(),
|
|
|
ok = emqx_config:init_load(emqx_exhook_schema, ?CONF_DEFAULT),
|
|
|
emqx_common_test_helpers:start_apps([emqx_exhook]),
|
|
|
@@ -623,3 +654,11 @@ inject_magic_into(Key, Object) ->
|
|
|
castspell() ->
|
|
|
L = [<<"baduser">>, <<"gooduser">>, <<"normaluser">>, muggles],
|
|
|
lists:nth(rand:uniform(length(L)), L).
|
|
|
+
|
|
|
+request_meta() ->
|
|
|
+ #{
|
|
|
+ node => nodestr(),
|
|
|
+ version => stringfy(emqx_sys:version()),
|
|
|
+ sysdescr => stringfy(emqx_sys:sysdescr()),
|
|
|
+ cluster_name => ?DEFAULT_CLUSTER_NAME_BIN
|
|
|
+ }.
|