Skip to content

[Windows] DuplicateStdout failed without "pytest -s" (RDT-96) #61

Open
@hfudev

Description

@hfudev

error message without "-s"

pytest --junit-xml=./test_app_results.xml --port=COM25 --embedded-services esp --target=esp32
=============================================== test session starts ===============================================
platform win32 -- Python 3.8.0, pytest-7.0.1, pluggy-1.0.0
rootdir: C:\github_repos\idf-extra-components\test_app
plugins: embedded-0.6.0rc0
collected 1 item

test_app.py E                                                                                                [100%]

===================================================== ERRORS ======================================================
___________________________________________ ERROR at setup of test_app ____________________________________________

self = <pytest_embedded.plugin.PytestEmbedded object at 0x0000022693DC9E20>
fixturedef = <FixtureDef argname='serial' scope='function' baseid=''>
request = <SubRequest 'serial' for <Function test_app>>

    @pytest.hookimpl(tryfirst=True)
    def pytest_fixture_setup(self, fixturedef: FixtureDef[Any], request: SubRequest):
        if fixturedef.argname != 'serial':
            return

        # inject the cache into the serial kwargs
        kwargs = self._pytest_fixturedef_get_kwargs(fixturedef, request)
        _class_cli_options = kwargs['_fixture_classes_and_options']

        # compatible to multi-dut
        if isinstance(_class_cli_options, ClassCliOptions):
            iterable_class_cli_options = [_class_cli_options]
        else:
            iterable_class_cli_options = _class_cli_options

        for _item in iterable_class_cli_options:
            _item_cls = _item.classes.get('serial')
            _item_kwargs = _item.kwargs.get('serial')

            if _item_cls is None or _item_kwargs is None:
                continue

            if _item_cls.__name__ == 'IdfSerial':  # use str to avoid ImportError
                _item_kwargs['port_target_cache'] = self._port_target_cache
                _item_kwargs['port_app_cache'] = self._port_app_cache
            elif _item_cls.__name__ == 'EspSerial':  # use str to avoid ImportError
                _item_kwargs['port_target_cache'] = self._port_target_cache

>       return self._pytest_fixturedef_exec(fixturedef, request, kwargs)

<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\plugin.py:1089:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\plugin.py:1052: in _pytest_fixturedef_exec
    result = call_fixture_func(fixturefunc, request, kwargs)
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\plugin.py:335: in wrapper
    res = func(*args, **kwargs)
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\plugin.py:904: in serial
    return cls(**_drop_none_kwargs(kwargs))
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded_serial_esp\serial.py:50: in __init__
    self.esp: esptool.ESPLoader = esptool.get_default_connected_device(
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\esptool.py:118: in get_default_connected_device
    print("Serial port %s" % each_port)
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\log.py:195: in write
    self.pexpect_proc.write(data)
<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\log.py:105: in write
    self.send(s)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <pytest_embedded.log.PexpectProcess object at 0x0000022693E516D0>, s = b'\n'

    def send(self, s: AnyStr) -> int:
        """
        Write to the pexpect process and log.

        Args:
            s: bytes or str

        Returns:
            number of written bytes.
        """
        if not s:
            return 0

        s = self._coerce_send_string(s)
        self._log(s, 'send')

        # for pytest logging
        _temp = sys.stdout
        sys.stdout = self.STDOUT  # ensure the following print uses system sys.stdout

        _s = to_str(s)
        prefix = ''
        if self.source:
            prefix = f'[{self.source}] ' + prefix
        if self._with_timestamp:
            prefix = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ' ' + prefix

        if not self._added_prefix:
            _s = prefix + _s
            self._added_prefix = True
        _s = _s.replace('\n', '\n' + prefix)
        if _s.endswith(prefix):
            _s = _s.rsplit(prefix, maxsplit=1)[0]
            self._added_prefix = False

>       sys.stdout.write(_s)
E       OSError: [WinError 6] The handle is invalid

<USER>\.espressif\python_env\idf5.0_py3.8_env\lib\site-packages\pytest_embedded\log.py:89: OSError
------------- generated xml file: C:\github_repos\idf-extra-components\test_app\test_app_results.xml --------------
============================================= short test summary info =============================================
ERROR test_app.py::test_app - OSError: [WinError 6] The handle is invalid
================================================ 1 error in 0.44s =================================================

Everything is fine with "-s"

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingwindowswindows only

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions