From a12121b74d94097a52c8117fb24ff5ae54bf70a9 Mon Sep 17 00:00:00 2001 From: David Shrewsbury Date: Thu, 8 Sep 2022 06:26:30 -0400 Subject: [PATCH] [bp/2.2] Make sure we close stdout/stderr in Runner.run() --- ansible_runner/runner.py | 5 ++++- test/unit/test_runner.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ansible_runner/runner.py b/ansible_runner/runner.py index 16653dcfc..737d557fd 100644 --- a/ansible_runner/runner.py +++ b/ansible_runner/runner.py @@ -275,6 +275,9 @@ def run(self): if isinstance(stderr_response, bytes): stderr_response = stderr_response.decode() stderr_handle.write(stderr_response) + + stdout_handle.close() + stderr_handle.close() else: try: child = pexpect.spawn( @@ -336,8 +339,8 @@ def _decode(x): Runner.handle_termination(child.pid, is_cancel=False) self.timed_out = True - stdout_handle.flush() stdout_handle.close() + stderr_handle.close() child.close() self.rc = child.exitstatus if not (self.timed_out or self.canceled) else 254 diff --git a/test/unit/test_runner.py b/test/unit/test_runner.py index 208c86c4d..ed42e5879 100644 --- a/test/unit/test_runner.py +++ b/test/unit/test_runner.py @@ -188,3 +188,19 @@ def test_multiline_blank_write(rc, runner_mode): assert status == 'successful' stdout_path = Path(rc.artifact_dir) / 'stdout' assert stdout_path.read_text() == 'hello_world_marker\n\n\n\n' # one extra newline okay + + +@pytest.mark.parametrize('runner_mode', ['subprocess']) +@pytest.mark.filterwarnings("error") +def test_no_ResourceWarning_error(rc, runner_mode): + """ + Test that no ResourceWarning error is propogated up with warnings-as-errors enabled. + + Not properly closing stdout/stderr in Runner.run() will cause a ResourceWarning + error that is only seen when we treat warnings as an error. + """ + rc.command = ['echo', 'Hello World'] + rc.runner_mode = runner_mode + runner = Runner(config=rc) + status, exitcode = runner.run() + assert status == 'successful'