test: Aprsme.Is reconnect success + connect-failure paths
This commit is contained in:
parent
795270c666
commit
f7a331b708
1 changed files with 76 additions and 0 deletions
|
|
@ -591,6 +591,82 @@ defmodule Aprsme.IsTest do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "handle_info(:reconnect) with mocked connection" do
|
||||||
|
# Start a listener, temporarily swap APRS-IS config to point at it,
|
||||||
|
# then trigger :reconnect so Aprsme.Is opens a real TCP connection.
|
||||||
|
setup do
|
||||||
|
{:ok, listen} = :gen_tcp.listen(0, [:binary, active: false, reuseaddr: true])
|
||||||
|
{:ok, port} = :inet.port(listen)
|
||||||
|
|
||||||
|
# Spawn an acceptor that reads the login string and closes.
|
||||||
|
spawn_link(fn ->
|
||||||
|
case :gen_tcp.accept(listen, 5_000) do
|
||||||
|
{:ok, srv} ->
|
||||||
|
_ = :gen_tcp.recv(srv, 0, 1_000)
|
||||||
|
_ = :gen_tcp.close(srv)
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
original_disabled = Application.get_env(:aprsme, :disable_aprs_connection, false)
|
||||||
|
original_env = Application.get_env(:aprsme, :env)
|
||||||
|
|
||||||
|
Application.put_env(:aprsme, :disable_aprs_connection, false)
|
||||||
|
Application.put_env(:aprsme, :env, :dev)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Application.put_env(:aprsme, :disable_aprs_connection, original_disabled)
|
||||||
|
Application.put_env(:aprsme, :env, original_env)
|
||||||
|
_ = :gen_tcp.close(listen)
|
||||||
|
end)
|
||||||
|
|
||||||
|
{:ok, port: port}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "reconnect succeeds and updates socket/timers", %{port: port} do
|
||||||
|
state = build_state(%{server: ~c"127.0.0.1", port: port, socket: nil, timer: nil, keepalive_timer: nil})
|
||||||
|
|
||||||
|
capture_log(fn ->
|
||||||
|
assert {:noreply, new_state} = Aprsme.Is.handle_info(:reconnect, state)
|
||||||
|
|
||||||
|
assert is_port(new_state.socket) or is_tuple(new_state.socket)
|
||||||
|
assert is_reference(new_state.timer)
|
||||||
|
assert is_reference(new_state.keepalive_timer)
|
||||||
|
refute new_state.backpressure_active
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
if new_state.socket, do: :gen_tcp.close(new_state.socket)
|
||||||
|
if new_state.timer, do: Process.cancel_timer(new_state.timer)
|
||||||
|
if new_state.keepalive_timer, do: Process.cancel_timer(new_state.keepalive_timer)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "handle_info(:reconnect) when connect fails" do
|
||||||
|
test "schedules another reconnect attempt on connection error" do
|
||||||
|
# Port 1 should always refuse or fail — triggers the connect-error branch.
|
||||||
|
original_disabled = Application.get_env(:aprsme, :disable_aprs_connection, false)
|
||||||
|
original_env = Application.get_env(:aprsme, :env)
|
||||||
|
|
||||||
|
Application.put_env(:aprsme, :disable_aprs_connection, false)
|
||||||
|
Application.put_env(:aprsme, :env, :dev)
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Application.put_env(:aprsme, :disable_aprs_connection, original_disabled)
|
||||||
|
Application.put_env(:aprsme, :env, original_env)
|
||||||
|
end)
|
||||||
|
|
||||||
|
state = build_state(%{server: ~c"127.0.0.1", port: 1, socket: nil, timer: nil, keepalive_timer: nil})
|
||||||
|
|
||||||
|
capture_log(fn ->
|
||||||
|
assert {:noreply, same_state} = Aprsme.Is.handle_info(:reconnect, state)
|
||||||
|
assert same_state == state
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "handle_info({:backpressure, _}) with active socket" do
|
describe "handle_info({:backpressure, _}) with active socket" do
|
||||||
setup do
|
setup do
|
||||||
{client, _listen, cleanup} = loopback_socket()
|
{client, _listen, cleanup} = loopback_socket()
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue