diff --git a/lib/gen_magic/server.ex b/lib/gen_magic/server.ex index b9a3d22..fc686b2 100644 --- a/lib/gen_magic/server.ex +++ b/lib/gen_magic/server.ex @@ -273,6 +273,16 @@ defmodule GenMagic.Server do {:next_state, :starting, %{data | port: nil, cycles: 0}} end + @doc false + @impl :gen_statem + def terminate(_, _, %{port: port}) do + Kernel.send(port, {self(), :close}) + end + + def terminate(_, _, _) do + :ok + end + defp send(port, command) do Kernel.send(port, {self(), {:command, :erlang.term_to_binary(command)}}) end diff --git a/test/gen_magic/apprentice_test.exs b/test/gen_magic/apprentice_test.exs index 8f50ea8..bffd3c7 100644 --- a/test/gen_magic/apprentice_test.exs +++ b/test/gen_magic/apprentice_test.exs @@ -6,11 +6,13 @@ defmodule GenMagic.ApprenticeTest do test "sends ready" do port = Port.open(GenMagic.Config.get_port_name(), GenMagic.Config.get_port_options([])) + on_exit(fn() -> send(port, {self(), :close}) end) assert_ready(port) end test "stops" do port = Port.open(GenMagic.Config.get_port_name(), GenMagic.Config.get_port_options([])) + on_exit(fn() -> send(port, {self(), :close}) end) assert_ready(port) send(port, {self(), {:command, :erlang.term_to_binary({:stop, :stop})}}) assert_receive {^port, {:exit_status, 0}} @@ -19,6 +21,7 @@ defmodule GenMagic.ApprenticeTest do test "exits with no database" do opts = [:use_stdio, :binary, :exit_status, {:packet, 2}, {:args, []}] port = Port.open(GenMagic.Config.get_port_name(), opts) + on_exit(fn() -> send(port, {self(), :close}) end) assert_receive {^port, {:exit_status, 1}} end @@ -32,12 +35,14 @@ defmodule GenMagic.ApprenticeTest do ] port = Port.open(GenMagic.Config.get_port_name(), opts) + on_exit(fn() -> send(port, {self(), :close}) end) assert_receive {^port, {:exit_status, 3}} end describe "port" do setup do port = Port.open(GenMagic.Config.get_port_name(), GenMagic.Config.get_port_options([])) + on_exit(fn() -> send(port, {self(), :close}) end) assert_ready(port) %{port: port} end