OCRmyPDF icon indicating copy to clipboard operation
OCRmyPDF copied to clipboard

[Bug]: test_malformed_docinfo fails with spectacular INTERNALERROR

Open mcepl opened this issue 1 year ago • 3 comments

What were you trying to do?

In the end of the run of the test suite (while packaging OCRmyPDF for openSUSE/Factory) I see this:

[   30s] INTERNALERROR> def worker_internal_error(
[   30s] INTERNALERROR>         self, node: WorkerController, formatted_error: str
[   30s] INTERNALERROR>     ) -> None:
[   30s] INTERNALERROR>         """
[   30s] INTERNALERROR>         pytest_internalerror() was called on the worker.
[   30s] INTERNALERROR>     
[   30s] INTERNALERROR>         pytest_internalerror() arguments are an excinfo and an excrepr, which can't
[   30s] INTERNALERROR>         be serialized, so we go with a poor man's solution of raising an exception
[   30s] INTERNALERROR>         here ourselves using the formatted message.
[   30s] INTERNALERROR>         """
[   30s] INTERNALERROR>         self._active_nodes.remove(node)
[   30s] INTERNALERROR>         try:
[   30s] INTERNALERROR> >           assert False, formatted_error
[   30s] INTERNALERROR> E           AssertionError: Traceback (most recent call last):
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/main.py", line 283, in wrap_session
[   30s] INTERNALERROR> E                 session.exitstatus = doit(config, session) or 0
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/main.py", line 337, in _main
[   30s] INTERNALERROR> E                 config.hook.pytest_runtestloop(session=session)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_hooks.py", line 513, in __call__
[   30s] INTERNALERROR> E                 return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_manager.py", line 120, in _hookexec
[   30s] INTERNALERROR> E                 return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 139, in _multicall
[   30s] INTERNALERROR> E                 raise exception.with_traceback(exception.__traceback__)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   30s] INTERNALERROR> E                 teardown.throw(exception)  # type: ignore[union-attr]
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/logging.py", line 803, in pytest_runtestloop
[   30s] INTERNALERROR> E                 return (yield)  # Run all the tests.
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   30s] INTERNALERROR> E                 teardown.throw(exception)  # type: ignore[union-attr]
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/terminal.py", line 673, in pytest_runtestloop
[   30s] INTERNALERROR> E                 result = yield
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 103, in _multicall
[   30s] INTERNALERROR> E                 res = hook_impl.function(*args)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/xdist/remote.py", line 174, in pytest_runtestloop
[   30s] INTERNALERROR> E                 self.run_one_test()
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/xdist/remote.py", line 195, in run_one_test
[   30s] INTERNALERROR> E                 self.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_hooks.py", line 513, in __call__
[   30s] INTERNALERROR> E                 return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_manager.py", line 120, in _hookexec
[   30s] INTERNALERROR> E                 return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 139, in _multicall
[   30s] INTERNALERROR> E                 raise exception.with_traceback(exception.__traceback__)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   30s] INTERNALERROR> E                 teardown.throw(exception)  # type: ignore[union-attr]
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/warnings.py", line 112, in pytest_runtest_protocol
[   30s] INTERNALERROR> E                 return (yield)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   30s] INTERNALERROR> E                 teardown.throw(exception)  # type: ignore[union-attr]
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/assertion/__init__.py", line 176, in pytest_runtest_protocol
[   30s] INTERNALERROR> E                 return (yield)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   30s] INTERNALERROR> E                 teardown.throw(exception)  # type: ignore[union-attr]
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/unittest.py", line 429, in pytest_runtest_protocol
[   30s] INTERNALERROR> E                 res = yield
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   30s] INTERNALERROR> E                 teardown.throw(exception)  # type: ignore[union-attr]
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/faulthandler.py", line 88, in pytest_runtest_protocol
[   30s] INTERNALERROR> E                 return (yield)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 103, in _multicall
[   30s] INTERNALERROR> E                 res = hook_impl.function(*args)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/runner.py", line 113, in pytest_runtest_protocol
[   30s] INTERNALERROR> E                 runtestprotocol(item, nextitem=nextitem)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/runner.py", line 132, in runtestprotocol
[   30s] INTERNALERROR> E                 reports.append(call_and_report(item, "call", log))
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/runner.py", line 246, in call_and_report
[   30s] INTERNALERROR> E                 ihook.pytest_runtest_logreport(report=report)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_hooks.py", line 513, in __call__
[   30s] INTERNALERROR> E                 return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_manager.py", line 120, in _hookexec
[   30s] INTERNALERROR> E                 return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 139, in _multicall
[   30s] INTERNALERROR> E                 raise exception.with_traceback(exception.__traceback__)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 103, in _multicall
[   30s] INTERNALERROR> E                 res = hook_impl.function(*args)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/terminal.py", line 635, in pytest_runtest_logreport
[   30s] INTERNALERROR> E                 reason = _get_raw_skip_reason(rep)
[   30s] INTERNALERROR> E               File "/usr/lib/python3.10/site-packages/_pytest/terminal.py", line 1566, in _get_raw_skip_reason
[   30s] INTERNALERROR> E                 if reason.startswith("reason: "):
[   30s] INTERNALERROR> E             AttributeError: 'tuple' object has no attribute 'startswith'
[   30s] INTERNALERROR> E           assert False
[   30s] INTERNALERROR> 
[   30s] INTERNALERROR> /usr/lib/python3.10/site-packages/xdist/dsession.py:232: AssertionError
[   30s] INTERNALERROR> Traceback (most recent call last):
[   30s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/_pytest/main.py", line 283, in wrap_session
[   30s] INTERNALERROR>     session.exitstatus = doit(config, session) or 0
[   30s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/_pytest/main.py", line 337, in _main
[   30s] INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
[   30s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/pluggy/_hooks.py", line 513, in __call__
[   30s] INTERNALERROR>     return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/pluggy/_manager.py", line 120, in _hookexec
[   38s] INTERNALERROR>     return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 139, in _multicall
[   38s] INTERNALERROR>     raise exception.with_traceback(exception.__traceback__)
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   38s] INTERNALERROR>     teardown.throw(exception)  # type: ignore[union-attr]
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/_pytest/logging.py", line 803, in pytest_runtestloop
[   38s] INTERNALERROR>     return (yield)  # Run all the tests.
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 122, in _multicall
[   38s] INTERNALERROR>     teardown.throw(exception)  # type: ignore[union-attr]
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/_pytest/terminal.py", line 673, in pytest_runtestloop
[   38s] INTERNALERROR>     result = yield
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/pluggy/_callers.py", line 103, in _multicall
[   38s] INTERNALERROR>     res = hook_impl.function(*args)
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/xdist/dsession.py", line 138, in pytest_runtestloop
[   38s] INTERNALERROR>     self.loop_once()
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/xdist/dsession.py", line 163, in loop_once
[   38s] INTERNALERROR>     call(**kwargs)
[   38s] INTERNALERROR>   File "/usr/lib/python3.10/site-packages/xdist/dsession.py", line 217, in worker_workerfinished
[   38s] INTERNALERROR>     assert not crashitem, (crashitem, node)
[   38s] INTERNALERROR> AssertionError: ('tests/test_metadata.py::test_malformed_docinfo', <WorkerController gw11>)
[   38s] INTERNALERROR> assert not 'tests/test_metadata.py::test_malformed_docinfo'
[   38s] 
[   38s] ================== 71 passed, 13 skipped, 2 xfailed in 14.91s ==================

Where are you installing/running from?

source build

OCRmyPDF version

16.6.0

What operating system are you working on?

Linux

Operating system details and version

openSUSE/Factory (development rolling distro)

Simple sanity checks

  • [X] Operating system is currently supported by its vendor (not end of life)
  • [X] Python version is compatible with OCRmyPDF
  • [X] This issue is not about a specific input file

Relevant log output

No response

mcepl avatar Nov 06 '24 15:11 mcepl

Complete build log with all packages used and steps taken to reproduce.

mcepl avatar Nov 06 '24 15:11 mcepl

Try changing the build settings to run pytest-3.10 -n0 which will disable distributing the test to multiple workers with xdist. Alternatively, remove the package pytest-xdist. Then see if the error is reproducible then. I suspect the issue has to do with pytest-xdist -- perhaps there is a breaking upgrade or something of that nature.

I do appreciate getting the full build log but I'm still not sure how I would go about reproducing this and you're probably able to do more easily.

jbarlow83 avatar Nov 06 '24 21:11 jbarlow83

~~Yes, switching of parallel testing works around the problem.~~

No, it doesn’t. Even when I switched off parallelization and test coverage (useless for the distribution packaging) and uninstall particular supporting packages (coverage, pytest-cov, pytest-xdist), the test suite still fails until I skip test_malformed_docinfo test.

# Switch off parallelization of testing in the config file
# and getting coverage for our tests (useless for packaging)
sed -i -e '/addopts = "-n auto"/d' \
       -e '/^\[tool.coverage\./,/^[[:blank:]]*$/d' \
    pyproject.toml

I do appreciate getting the full build log but I'm still not sure how I would go about reproducing this and you're probably able to do more easily.

I absolutely didn’t mean like I wouldn’t like to do testing. Just trying to provide you with as much information as possible (and to preserve it for future).

mcepl avatar Nov 06 '24 21:11 mcepl