From 4560dc0c6fe2783513827e402409ffe0d20554cf Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Fri, 8 May 2026 17:15:26 -0500 Subject: [PATCH] Add LeaderElection tests for dead-pid cleanup and registered leader pid status --- test/aprsme/cluster/leader_election_test.exs | 39 ++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/aprsme/cluster/leader_election_test.exs b/test/aprsme/cluster/leader_election_test.exs index 4b3a61c..c0e3aab 100644 --- a/test/aprsme/cluster/leader_election_test.exs +++ b/test/aprsme/cluster/leader_election_test.exs @@ -353,6 +353,45 @@ defmodule Aprsme.Cluster.LeaderElectionTest do assert Map.has_key?(status.cluster_info, :connected_nodes) end end + + test "attempt_election triggers cleanup_stale_registrations for dead-local-process" do + # Spawn a process that exits immediately, then register it globally so + # cleanup_stale_registrations sees a dead pid and cleans it up. + Application.put_env(:aprsme, :cluster_enabled, false) + :global.unregister_name(@election_key) + + dead_pid = spawn(fn -> :ok end) + Process.sleep(20) + refute Process.alive?(dead_pid) + + try do + :global.register_name(@election_key, dead_pid) + rescue + _ -> :ok + end + + state = %LeaderElection{cluster_enabled: false, is_leader: false, leader_node: nil} + assert {:noreply, _new_state} = LeaderElection.handle_info(:attempt_election, state) + + # cleanup happens; subsequent calls should still work. + :global.unregister_name(@election_key) + end + + test "clustered get_cluster_aprs_status with registered leader pid hits get_leader_node_name pid branch" do + Application.put_env(:aprsme, :cluster_enabled, true) + + # Pre-register a real pid under the @election_key so the get_leader_node_name + # branch (line 382: pid when is_pid(pid) -> pid |> node() |> to_string()). + :global.unregister_name(@election_key) + :global.register_name(@election_key, self()) + + try do + status = LeaderElection.get_cluster_aprs_status() + assert is_map(status) + after + :global.unregister_name(@election_key) + end + end end describe "handle_info(:check_cluster_and_elect) direct callback" do