test(mqtt-bridge): test async bridge reconnects seamlessly
This commit is contained in:
parent
5ebceb20d2
commit
8a46cb974e
|
@ -735,6 +735,89 @@ t_mqtt_conn_bridge_egress_reconnect(_) ->
|
||||||
assert_mqtt_msg_received(RemoteTopic, Payload2),
|
assert_mqtt_msg_received(RemoteTopic, Payload2),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
t_mqtt_conn_bridge_egress_async_reconnect(_) ->
|
||||||
|
User1 = <<"user1">>,
|
||||||
|
BridgeIDEgress = create_bridge(
|
||||||
|
?SERVER_CONF(User1)#{
|
||||||
|
<<"type">> => ?TYPE_MQTT,
|
||||||
|
<<"name">> => ?BRIDGE_NAME_EGRESS,
|
||||||
|
<<"egress">> => ?EGRESS_CONF,
|
||||||
|
<<"resource_opts">> => #{
|
||||||
|
<<"worker_pool_size">> => 2,
|
||||||
|
<<"query_mode">> => <<"async">>,
|
||||||
|
%% using a long time so we can test recovery
|
||||||
|
<<"request_timeout">> => <<"15s">>,
|
||||||
|
%% to make it check the healthy quickly
|
||||||
|
<<"health_check_interval">> => <<"0.5s">>,
|
||||||
|
%% to make it reconnect quickly
|
||||||
|
<<"auto_restart_interval">> => <<"1s">>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
on_exit(fun() ->
|
||||||
|
%% delete the bridge
|
||||||
|
{ok, 204, <<>>} = request(delete, uri(["bridges", BridgeIDEgress]), []),
|
||||||
|
{ok, 200, <<"[]">>} = request(get, uri(["bridges"]), []),
|
||||||
|
ok
|
||||||
|
end),
|
||||||
|
|
||||||
|
Self = self(),
|
||||||
|
LocalTopic = <<?EGRESS_LOCAL_TOPIC, "/1">>,
|
||||||
|
RemoteTopic = <<?EGRESS_REMOTE_TOPIC, "/", LocalTopic/binary>>,
|
||||||
|
emqx:subscribe(RemoteTopic),
|
||||||
|
|
||||||
|
Publisher = start_publisher(LocalTopic, 200, Self),
|
||||||
|
ct:sleep(1000),
|
||||||
|
|
||||||
|
%% stop the listener 1883 to make the bridge disconnected
|
||||||
|
ok = emqx_listeners:stop_listener('tcp:default'),
|
||||||
|
ct:sleep(1500),
|
||||||
|
?assertMatch(
|
||||||
|
#{<<"status">> := Status} when Status == <<"connecting">>; Status == <<"disconnected">>,
|
||||||
|
request_bridge(BridgeIDEgress)
|
||||||
|
),
|
||||||
|
|
||||||
|
%% start the listener 1883 to make the bridge reconnected
|
||||||
|
ok = emqx_listeners:start_listener('tcp:default'),
|
||||||
|
timer:sleep(1500),
|
||||||
|
?assertMatch(
|
||||||
|
#{<<"status">> := <<"connected">>},
|
||||||
|
request_bridge(BridgeIDEgress)
|
||||||
|
),
|
||||||
|
|
||||||
|
N = stop_publisher(Publisher),
|
||||||
|
|
||||||
|
%% all those messages should eventually be delivered
|
||||||
|
[
|
||||||
|
assert_mqtt_msg_received(RemoteTopic, Payload)
|
||||||
|
|| I <- lists:seq(1, N),
|
||||||
|
Payload <- [integer_to_binary(I)]
|
||||||
|
],
|
||||||
|
|
||||||
|
ok.
|
||||||
|
|
||||||
|
start_publisher(Topic, Interval, CtrlPid) ->
|
||||||
|
spawn_link(fun() -> publisher(Topic, 1, Interval, CtrlPid) end).
|
||||||
|
|
||||||
|
stop_publisher(Pid) ->
|
||||||
|
_ = Pid ! {self(), stop},
|
||||||
|
receive
|
||||||
|
{Pid, N} -> N
|
||||||
|
after 1_000 -> ct:fail("publisher ~p did not stop", [Pid])
|
||||||
|
end.
|
||||||
|
|
||||||
|
publisher(Topic, N, Delay, CtrlPid) ->
|
||||||
|
_ = emqx:publish(emqx_message:make(Topic, integer_to_binary(N))),
|
||||||
|
receive
|
||||||
|
{CtrlPid, stop} ->
|
||||||
|
CtrlPid ! {self(), N}
|
||||||
|
after Delay ->
|
||||||
|
publisher(Topic, N + 1, Delay, CtrlPid)
|
||||||
|
end.
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
assert_mqtt_msg_received(Topic) ->
|
assert_mqtt_msg_received(Topic) ->
|
||||||
assert_mqtt_msg_received(Topic, '_', 200).
|
assert_mqtt_msg_received(Topic, '_', 200).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue