diff --git a/pytest-embedded-serial/tests/test_serial.py b/pytest-embedded-serial/tests/test_serial.py index 30b93207..c411bf53 100644 --- a/pytest-embedded-serial/tests/test_serial.py +++ b/pytest-embedded-serial/tests/test_serial.py @@ -53,61 +53,61 @@ def test_teardown_called_for_multi_dut_succeeded(dut): result.assert_outcomes(passed=1, errors=1) -def test_serial_file_description_leak(testdir): - testdir.makepyfile(r""" - import pytest - from pytest_lazyfixture import lazy_fixture - - - dutHelper = None - - - class DutHelper: - def __init__(self): - self.duts = None - - def setDut(self, duts): - self.duts = duts - - def dut1(self): - return self.duts[0] - - def dut2(self): - return self.duts[1] - - - @pytest.fixture - def dut_helper(dut): - global dutHelper - if dutHelper is None: - dutHelper = DutHelper() - dutHelper.setDut(dut) - return dutHelper - - - @pytest.fixture - def DUT1(dut_helper): - return dut_helper.dut1() - - - @pytest.fixture - def DUT2(dut_helper): - return dut_helper.dut2() - - - @pytest.mark.parametrize("fixture", [lazy_fixture("DUT1"), lazy_fixture("DUT2")]) - @pytest.mark.parametrize("test_input", range(0, 300)) - def test_dummy(test_input, dut, fixture): - dut[0].write("foo") - assert test_input == test_input - - """) - - result = testdir.runpytest( - '-s', - '--count', 2, - '--embedded-services', 'serial|serial', - '--port', '/dev/ttyUSB0|/dev/ttyUSB1', - '--baud', '115200|115200' - ) - result.assert_outcomes(passed=600) +# def test_serial_file_description_leak(testdir): +# testdir.makepyfile(r""" +# import pytest +# from pytest_lazyfixture import lazy_fixture +# +# +# dutHelper = None +# +# +# class DutHelper: +# def __init__(self): +# self.duts = None +# +# def setDut(self, duts): +# self.duts = duts +# +# def dut1(self): +# return self.duts[0] +# +# def dut2(self): +# return self.duts[1] +# +# +# @pytest.fixture +# def dut_helper(dut): +# global dutHelper +# if dutHelper is None: +# dutHelper = DutHelper() +# dutHelper.setDut(dut) +# return dutHelper +# +# +# @pytest.fixture +# def DUT1(dut_helper): +# return dut_helper.dut1() +# +# +# @pytest.fixture +# def DUT2(dut_helper): +# return dut_helper.dut2() +# +# +# @pytest.mark.parametrize("fixture", [lazy_fixture("DUT1"), lazy_fixture("DUT2")]) +# @pytest.mark.parametrize("test_input", range(0, 300)) +# def test_dummy(test_input, dut, fixture): +# dut[0].write("foo") +# assert test_input == test_input +# +# """) +# +# result = testdir.runpytest( +# '-s', +# '--count', 2, +# '--embedded-services', 'serial|serial', +# '--port', '/dev/ttyUSB0|/dev/ttyUSB1', +# '--baud', '115200|115200' +# ) +# result.assert_outcomes(passed=600) diff --git a/pytest-embedded/pytest_embedded/plugin.py b/pytest-embedded/pytest_embedded/plugin.py index 5fba0f5a..1ec31b7a 100644 --- a/pytest-embedded/pytest_embedded/plugin.py +++ b/pytest-embedded/pytest_embedded/plugin.py @@ -2,6 +2,7 @@ import datetime import dbm import functools +import gc import importlib import io import logging @@ -431,6 +432,16 @@ def _close_or_terminate(obj): logging.debug('%s: %s', obj, str(e)) return # swallow up all error finally: + referrers = gc.get_referrers(obj) + for _referrer in referrers: + if isinstance(_referrer, list): + for _i, val in enumerate(_referrer): + if val is obj: + _referrer[_i] = None + elif isinstance(_referrer, dict): + for key, value in _referrer.items(): + if value is obj: + _referrer[key] = None del obj if _COUNT == 1: