Skip to content

Commit f2ad598

Browse files
authored
Fix ExUnit StringIO processes leak when named device capture failed (#15621)
1 parent 1bfa86b commit f2ad598

2 files changed

Lines changed: 12 additions & 0 deletions

File tree

lib/ex_unit/lib/ex_unit/capture_server.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ defmodule ExUnit.CaptureServer do
155155
Process.register(pid, name)
156156
rescue
157157
ArgumentError ->
158+
close_string_io(pid)
158159
{:reply, {:error, :no_device}, config}
159160
else
160161
_ ->

lib/ex_unit/test/ex_unit/capture_io_test.exs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,17 @@ defmodule ExUnit.CaptureIOTest do
477477
end
478478
end
479479

480+
test "does not leak StringIO when named device does not exist" do
481+
capture_server = Process.whereis(ExUnit.CaptureServer)
482+
{:monitored_by, monitored_by} = Process.info(capture_server, :monitored_by)
483+
484+
assert_raise RuntimeError, "could not find IO device registered at :unknown_device", fn ->
485+
capture_io(:unknown_device, fn -> :ok end)
486+
end
487+
488+
assert Process.info(capture_server, :monitored_by) == {:monitored_by, monitored_by}
489+
end
490+
480491
test "no leakage on failures" do
481492
parent = self()
482493

0 commit comments

Comments
 (0)