gen_reset_tracker_test.exs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 =
  19. Process.spawn(
  20. fn ->
  21. receive do
  22. _ -> :ok
  23. end
  24. end,
  25. []
  26. )
  27. GenReset.Tracker.add(pid)
  28. assert GenReset.Tracker.pids() == [pid]
  29. Process.exit(pid, :kill)
  30. TimeHelper.wait_until(fn ->
  31. assert GenReset.Tracker.pids() == []
  32. end)
  33. end
  34. test "resetting all pids triggers reset" do
  35. GenReset.Tracker.add(self())
  36. Process.spawn(fn -> GenReset.Tracker.reset() end, [])
  37. assert_receive {:"$gen_call", {_pid, _ref}, :"$gen_reset"}
  38. end
  39. end
  40. defmodule TimeHelper do
  41. def wait_until(fun), do: wait_until(500, fun)
  42. def wait_until(0, fun), do: fun.()
  43. def wait_until(timeout, fun) do
  44. try do
  45. fun.()
  46. rescue
  47. ExUnit.AssertionError ->
  48. :timer.sleep(10)
  49. wait_until(max(0, timeout - 10), fun)
  50. end
  51. end
  52. end