gen_reset_tracker_test.exs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. defmodule GenReset.TrackerTest do
  2. use ExUnit.Case
  3. setup do
  4. GenServer.call(GenReset.Tracker, :internal_reset)
  5. :ok
  6. end
  7. test "adding pids" do
  8. assert GenReset.Tracker.add(self()) == :ok
  9. assert GenReset.Tracker.pids == [self()]
  10. end
  11. test "removing existing pid" do
  12. assert GenReset.Tracker.add(self()) == :ok
  13. assert GenReset.Tracker.pids == [self()]
  14. assert GenReset.Tracker.remove(self()) == :ok
  15. assert GenReset.Tracker.pids == []
  16. end
  17. test "dead pid is automatically removed" do
  18. pid = Process.spawn(fn ->
  19. receive do
  20. _ -> :ok
  21. end
  22. end, [])
  23. GenReset.Tracker.add(pid)
  24. assert GenReset.Tracker.pids == [pid]
  25. Process.exit(pid, :kill)
  26. TimeHelper.wait_until(fn ->
  27. assert GenReset.Tracker.pids == []
  28. end)
  29. end
  30. test "resetting all pids triggers reset" do
  31. GenReset.Tracker.add(self())
  32. Process.spawn(fn -> GenReset.Tracker.reset() end, [])
  33. assert_receive {:"$gen_call", {_pid, _ref}, :"$gen_reset"}
  34. end
  35. end
  36. defmodule TimeHelper do
  37. def wait_until(fun), do: wait_until(500, fun)
  38. def wait_until(0, fun), do: fun.()
  39. def wait_until(timeout, fun) do
  40. try do
  41. fun.()
  42. rescue
  43. ExUnit.AssertionError ->
  44. :timer.sleep(10)
  45. wait_until(max(0, timeout - 10), fun)
  46. end
  47. end
  48. end