defmodule GenReset.TrackerTest do use ExUnit.Case setup do GenServer.call(GenReset.Tracker, :internal_reset) :ok end test "adding pids" do assert GenReset.Tracker.add(self()) == :ok assert GenReset.Tracker.pids == [self()] end test "removing existing pid" do assert GenReset.Tracker.add(self()) == :ok assert GenReset.Tracker.pids == [self()] assert GenReset.Tracker.remove(self()) == :ok assert GenReset.Tracker.pids == [] end test "dead pid is automatically removed" do pid = Process.spawn(fn -> receive do _ -> :ok end end, []) GenReset.Tracker.add(pid) assert GenReset.Tracker.pids == [pid] Process.exit(pid, :kill) TimeHelper.wait_until(fn -> assert GenReset.Tracker.pids == [] end) end test "resetting all pids triggers reset" do GenReset.Tracker.add(self()) Process.spawn(fn -> GenReset.Tracker.reset() end, []) assert_receive {:"$gen_call", {_pid, _ref}, :"$gen_reset"} end end defmodule TimeHelper do def wait_until(fun), do: wait_until(500, fun) def wait_until(0, fun), do: fun.() def wait_until(timeout, fun) do try do fun.() rescue ExUnit.AssertionError -> :timer.sleep(10) wait_until(max(0, timeout - 10), fun) end end end