Skip to content

Commit a2cc262

Browse files
committed
Stop GenServer on unknown call/cast request
1 parent 99b1d9b commit a2cc262

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

lib/elixir/lib/gen_server/behaviour.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ defmodule GenServer.Behaviour do
9494
end
9595

9696
@doc false
97-
def handle_call(_request, _from, state) do
98-
{ :noreply, state }
97+
def handle_call(request, _from, state) do
98+
{ :stop, { :bad_call, request }, state }
9999
end
100100

101101
@doc false
@@ -104,8 +104,8 @@ defmodule GenServer.Behaviour do
104104
end
105105

106106
@doc false
107-
def handle_cast(_msg, state) do
108-
{ :noreply, state }
107+
def handle_cast(msg, state) do
108+
{ :stop, { :bad_call, msg }, state }
109109
end
110110

111111
@doc false

lib/elixir/test/elixir/gen_server/behaviour_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,18 @@ defmodule GenServer.BehaviourTest do
3535
assert :gen_server.cast(pid, { :push, :world }) == :ok
3636
assert :gen_server.call(pid, :pop) == :world
3737
end
38+
39+
test "call stops server on unknown requests" do
40+
assert { :ok, pid } = :gen_server.start_link(Sample, [:hello], [])
41+
Process.unlink(pid)
42+
assert {{:bad_call, :unknown_request}, _} = catch_exit(:gen_server.call(pid, :unknown_request))
43+
end
44+
45+
test "cast stops server on unknown requests" do
46+
assert { :ok, pid } = :gen_server.start_link(Sample, [:hello], [])
47+
Process.unlink(pid)
48+
# Won't notice the server is stopped till we next send it a (valid) message
49+
assert :gen_server.cast(pid, :unknown_request) == :ok
50+
assert {{:bad_call, :unknown_request}, _} = catch_exit(:gen_server.call(pid, :pop))
51+
end
3852
end

0 commit comments

Comments
 (0)