|
|
@@ -95,10 +95,10 @@ rabbitmq_source() ->
|
|
|
},
|
|
|
parse_and_check(<<"sources">>, emqx_bridge_v2_schema, Source, Name).
|
|
|
|
|
|
-rabbitmq_action() ->
|
|
|
- rabbitmq_action(rabbit_mq_exchange()).
|
|
|
+rabbitmq_action(TestCase) ->
|
|
|
+ rabbitmq_action(TestCase, rabbit_mq_exchange(TestCase)).
|
|
|
|
|
|
-rabbitmq_action(Exchange) ->
|
|
|
+rabbitmq_action(TestCase, Exchange) ->
|
|
|
Name = atom_to_binary(?MODULE),
|
|
|
Action = #{
|
|
|
<<"actions">> => #{
|
|
|
@@ -109,7 +109,7 @@ rabbitmq_action(Exchange) ->
|
|
|
<<"parameters">> => #{
|
|
|
<<"exchange">> => Exchange,
|
|
|
<<"payload_template">> => <<"${.payload}">>,
|
|
|
- <<"routing_key">> => rabbit_mq_routing_key(),
|
|
|
+ <<"routing_key">> => rabbit_mq_routing_key(TestCase),
|
|
|
<<"delivery_mode">> => <<"non_persistent">>,
|
|
|
<<"publish_confirmation_timeout">> => <<"30s">>,
|
|
|
<<"wait_for_publish_confirmations">> => true
|
|
|
@@ -138,11 +138,11 @@ create_source(Name) ->
|
|
|
delete_source(Name) ->
|
|
|
ok = emqx_bridge_v2:remove(sources, ?TYPE, Name).
|
|
|
|
|
|
-create_action(Name) ->
|
|
|
- create_action(Name, rabbit_mq_exchange()).
|
|
|
+create_action(TestCase, Name) ->
|
|
|
+ create_action(TestCase, Name, rabbit_mq_exchange(TestCase)).
|
|
|
|
|
|
-create_action(Name, Exchange) ->
|
|
|
- Action = rabbitmq_action(Exchange),
|
|
|
+create_action(TestCase, Name, Exchange) ->
|
|
|
+ Action = rabbitmq_action(TestCase, Exchange),
|
|
|
{ok, _} = emqx_bridge_v2:create(actions, ?TYPE, Name, Action).
|
|
|
|
|
|
delete_action(Name) ->
|
|
|
@@ -228,14 +228,14 @@ t_source_probe(_Config) ->
|
|
|
|
|
|
t_action_probe(_Config) ->
|
|
|
Name = atom_to_binary(?FUNCTION_NAME),
|
|
|
- Action = rabbitmq_action(),
|
|
|
+ Action = rabbitmq_action(?FUNCTION_NAME),
|
|
|
{ok, Res0} = emqx_bridge_v2_testlib:probe_bridge_api(action, ?TYPE, Name, Action),
|
|
|
?assertMatch({{_, 204, _}, _, _}, Res0),
|
|
|
ok.
|
|
|
|
|
|
t_action(Config) ->
|
|
|
Name = atom_to_binary(?FUNCTION_NAME),
|
|
|
- create_action(Name),
|
|
|
+ create_action(?FUNCTION_NAME, Name),
|
|
|
Actions = emqx_bridge_v2:list(actions),
|
|
|
Any = fun(#{name := BName}) -> BName =:= Name end,
|
|
|
?assert(lists:any(Any, Actions), Actions),
|
|
|
@@ -276,7 +276,7 @@ t_action(Config) ->
|
|
|
|
|
|
t_action_not_exist_exchange(_Config) ->
|
|
|
Name = atom_to_binary(?FUNCTION_NAME),
|
|
|
- create_action(Name, <<"not_exist_exchange">>),
|
|
|
+ create_action(?FUNCTION_NAME, Name, <<"not_exist_exchange">>),
|
|
|
Actions = emqx_bridge_v2:list(actions),
|
|
|
Any = fun(#{name := BName}) -> BName =:= Name end,
|
|
|
?assert(lists:any(Any, Actions), Actions),
|
|
|
@@ -336,7 +336,7 @@ t_action_not_exist_exchange(_Config) ->
|
|
|
).
|
|
|
|
|
|
t_replace_action_source(Config) ->
|
|
|
- Action = #{<<"rabbitmq">> => #{<<"my_action">> => rabbitmq_action()}},
|
|
|
+ Action = #{<<"rabbitmq">> => #{<<"my_action">> => rabbitmq_action(?FUNCTION_NAME)}},
|
|
|
Source = #{<<"rabbitmq">> => #{<<"my_source">> => rabbitmq_source()}},
|
|
|
ConnectorName = atom_to_binary(?MODULE),
|
|
|
Connector = #{<<"rabbitmq">> => #{ConnectorName => rabbitmq_connector(get_rabbitmq(Config))}},
|
|
|
@@ -389,6 +389,47 @@ t_replace_action_source(Config) ->
|
|
|
),
|
|
|
ok.
|
|
|
|
|
|
+t_action_dynamic(Config) ->
|
|
|
+ Name = atom_to_binary(?FUNCTION_NAME),
|
|
|
+ create_action(?FUNCTION_NAME, Name),
|
|
|
+ Actions = emqx_bridge_v2:list(actions),
|
|
|
+ Any = fun(#{name := BName}) -> BName =:= Name end,
|
|
|
+ ?assert(lists:any(Any, Actions), Actions),
|
|
|
+ Topic = <<"rabbitdynaction">>,
|
|
|
+ {ok, #{id := RuleId}} = emqx_rule_engine:create_rule(
|
|
|
+ #{
|
|
|
+ sql => <<"select * from \"", Topic/binary, "\"">>,
|
|
|
+ id => atom_to_binary(?FUNCTION_NAME),
|
|
|
+ actions => [<<"rabbitmq:", Name/binary>>],
|
|
|
+ description => <<"bridge_v2 send msg to rabbitmq action">>
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ on_exit(fun() -> emqx_rule_engine:delete_rule(RuleId) end),
|
|
|
+ {ok, C1} = emqtt:start_link([{clean_start, true}]),
|
|
|
+ {ok, _} = emqtt:connect(C1),
|
|
|
+ Payload = payload(?FUNCTION_NAME),
|
|
|
+ PayloadBin = emqx_utils_json:encode(Payload),
|
|
|
+ {ok, _} = emqtt:publish(C1, Topic, #{}, PayloadBin, [{qos, 1}, {retain, false}]),
|
|
|
+ Msg = receive_message_from_rabbitmq(Config),
|
|
|
+ ?assertMatch(Payload, Msg),
|
|
|
+ ok = emqtt:disconnect(C1),
|
|
|
+ InstanceId = instance_id(actions, Name),
|
|
|
+ #{counters := Counters} = emqx_resource:get_metrics(InstanceId),
|
|
|
+ ok = delete_action(Name),
|
|
|
+ ActionsAfterDelete = emqx_bridge_v2:list(actions),
|
|
|
+ ?assertNot(lists:any(Any, ActionsAfterDelete), ActionsAfterDelete),
|
|
|
+ ?assertMatch(
|
|
|
+ #{
|
|
|
+ dropped := 0,
|
|
|
+ success := 0,
|
|
|
+ matched := 1,
|
|
|
+ failed := 0,
|
|
|
+ received := 0
|
|
|
+ },
|
|
|
+ Counters
|
|
|
+ ),
|
|
|
+ ok.
|
|
|
+
|
|
|
waiting_for_disconnected_alarms(InstanceId) ->
|
|
|
waiting_for_disconnected_alarms(InstanceId, 0).
|
|
|
|
|
|
@@ -452,6 +493,10 @@ receive_messages(Count, Msgs) ->
|
|
|
payload() ->
|
|
|
#{<<"key">> => 42, <<"data">> => <<"RabbitMQ">>, <<"timestamp">> => 10000}.
|
|
|
|
|
|
+payload(t_action_dynamic) ->
|
|
|
+ Payload = payload(),
|
|
|
+ Payload#{<<"e">> => rabbit_mq_exchange(), <<"r">> => rabbit_mq_routing_key()}.
|
|
|
+
|
|
|
send_test_message_to_rabbitmq(Config) ->
|
|
|
#{channel := Channel} = get_channel_connection(Config),
|
|
|
MessageProperties = #'P_basic'{
|
|
|
@@ -481,3 +526,13 @@ instance_id(Type, Name) ->
|
|
|
actions -> <<"action:">>
|
|
|
end,
|
|
|
<<TypeBin/binary, BridgeId/binary, ":", ConnectorId/binary>>.
|
|
|
+
|
|
|
+rabbit_mq_exchange(t_action_dynamic) ->
|
|
|
+ <<"${payload.e}">>;
|
|
|
+rabbit_mq_exchange(_) ->
|
|
|
+ rabbit_mq_exchange().
|
|
|
+
|
|
|
+rabbit_mq_routing_key(t_action_dynamic) ->
|
|
|
+ <<"${payload.r}">>;
|
|
|
+rabbit_mq_routing_key(_) ->
|
|
|
+ rabbit_mq_routing_key().
|