Skip to content

Commit 8f4442f

Browse files
author
José Valim
committed
Test :sys functions with GenEvent
1 parent 598e42e commit 8f4442f

File tree

2 files changed

+67
-23
lines changed

2 files changed

+67
-23
lines changed

lib/elixir/lib/gen_event.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ defmodule GenEvent do
547547
end
548548

549549
def init_it(starter, parent, name, _, _, options) do
550+
Process.put(:"$initial_call", {__MODULE__, :init_it, 6})
550551
debug = :gen.debug_options(options)
551552
:proc_lib.init_ack(starter, {:ok, self()})
552553
loop(parent, name(name), [], debug, false)
@@ -729,8 +730,8 @@ defmodule GenEvent do
729730
end
730731

731732
[header: header,
732-
data: [{"Status", sys_state}, {"Parent", parent}],
733-
items: {"Installed handlers", formatted}]
733+
data: [{'Status', sys_state}, {'Parent', parent}],
734+
items: {'Installed handlers', formatted}]
734735
end
735736

736737
## Loop helpers

lib/elixir/test/elixir/gen_event_test.exs

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -182,27 +182,6 @@ defmodule GenEventTest do
182182
refute_received {:terminate, _}
183183
end
184184

185-
defp hibernating?(pid) do
186-
Process.info(pid, :current_function) ==
187-
{:current_function,{:erlang,:hibernate,3}}
188-
end
189-
190-
defp wait_until(fun, counter \\ 0) do
191-
cond do
192-
counter > 100 ->
193-
flunk "Waited for 1s, but #{inspect fun} never returned true"
194-
fun.() ->
195-
true
196-
true ->
197-
receive after: (10 -> wait_until(fun, counter + 1))
198-
end
199-
end
200-
201-
defp wake_up(pid) do
202-
send pid, :wake
203-
assert_receive {:info, :wake}
204-
end
205-
206185
test "hibernates" do
207186
{:ok, pid} = GenEvent.start()
208187
:ok = GenEvent.add_handler(pid, ReplyHandler, {self(), :hibernate})
@@ -483,4 +462,68 @@ defmodule GenEventTest do
483462
after
484463
Logger.add_backend(:console, flush: true)
485464
end
465+
466+
test ":sys.get_status/2" do
467+
{:ok, pid} = GenEvent.start(name: :my_gen_event_name)
468+
:ok = GenEvent.add_handler(pid, {ReplyHandler, :ok}, {self(), true})
469+
470+
self = self()
471+
status = :sys.get_status(pid)
472+
GenEvent.stop(pid)
473+
474+
assert {:status, ^pid, {:module, GenEvent},
475+
[pdict, _, ^pid, [], data]} = status
476+
assert pdict[:"$ancestors"] == [self()]
477+
assert pdict[:"$initial_call"] == {GenEvent, :init_it, 6}
478+
assert {'Installed handlers', [
479+
{:handler, ReplyHandler, {ReplyHandler, :ok}, ^self, nil, nil}]} = data[:items]
480+
end
481+
482+
test ":sys.get_state/1 and :sys.replace_state/2" do
483+
{:ok, pid} = GenEvent.start_link(name: :my_gen_event_name)
484+
self = self()
485+
486+
assert [] = :sys.get_state(pid)
487+
488+
:ok = GenEvent.add_handler(pid, ReplyHandler, {self, true})
489+
assert [{ReplyHandler, ReplyHandler, ^self}] = :sys.get_state(pid)
490+
491+
replacer = fn {ReplyHandler, ReplyHandler, _} -> {ReplyHandler, ReplyHandler, :unknown} end
492+
:sys.replace_state(pid, replacer)
493+
assert [{ReplyHandler, ReplyHandler, :unknown}] = :sys.get_state(pid)
494+
495+
# Fail while replacing does not cause a crash
496+
:sys.replace_state(pid, fn _ -> exit(:fail) end)
497+
assert [{ReplyHandler, ReplyHandler, :unknown}] = :sys.get_state(pid)
498+
499+
:ok = GenEvent.add_handler(pid, {ReplyHandler, :ok}, {self, true})
500+
assert [{ReplyHandler, {ReplyHandler, :ok}, ^self},
501+
{ReplyHandler, ReplyHandler, :unknown}] = :sys.get_state(pid)
502+
503+
:ok = :sys.suspend(pid)
504+
assert [{ReplyHandler, {ReplyHandler, :ok}, ^self},
505+
{ReplyHandler, ReplyHandler, :unknown}] = :sys.get_state(pid)
506+
:ok = :sys.resume(pid)
507+
end
508+
509+
defp hibernating?(pid) do
510+
Process.info(pid, :current_function) ==
511+
{:current_function,{:erlang,:hibernate,3}}
512+
end
513+
514+
defp wait_until(fun, counter \\ 0) do
515+
cond do
516+
counter > 100 ->
517+
flunk "Waited for 1s, but #{inspect fun} never returned true"
518+
fun.() ->
519+
true
520+
true ->
521+
receive after: (10 -> wait_until(fun, counter + 1))
522+
end
523+
end
524+
525+
defp wake_up(pid) do
526+
send pid, :wake
527+
assert_receive {:info, :wake}
528+
end
486529
end

0 commit comments

Comments
 (0)