| cls = <class '_pytest.runner.CallInfo'>
|
| func = <function FlakyPlugin.call_and_report.<locals>._call_runtest_hook.<locals>.<lambda> at 0x00000183366B1CF0>
|
| when = 'call'
|
| reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)
|
|
|
| @classmethod
|
| def from_call(
|
| cls,
|
| func: Callable[[], TResult],
|
| when: Literal["collect", "setup", "call", "teardown"],
|
| reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None,
|
| ) -> CallInfo[TResult]:
|
| """Call func, wrapping the result in a CallInfo.
|
|
|
| :param func:
|
| The function to call. Called without arguments.
|
| :type func: Callable[[], _pytest.runner.TResult]
|
| :param when:
|
| The phase in which the function is called.
|
| :param reraise:
|
| Exception or exceptions that shall propagate if raised by the
|
| function, instead of being wrapped in the CallInfo.
|
| """
|
| excinfo = None
|
| instant = timing.Instant()
|
| try:
|
| > result: TResult | None = func()
|
|
|
| venv\lib\site-packages\_pytest\runner.py:344:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| > lambda: ihook(item=item, **kwds), when=when, reraise=reraise
|
| )
|
|
|
| venv\lib\site-packages\flaky\flaky_pytest_plugin.py:146:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <HookCaller 'pytest_runtest_call'>
|
| kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def __call__(self, **kwargs: object) -> Any:
|
| """Call the hook.
|
|
|
| Only accepts keyword arguments, which should match the hook
|
| specification.
|
|
|
| Returns the result(s) of calling all registered plugins, see
|
| :ref:`calling`.
|
| """
|
| assert not self.is_historic(), (
|
| "Cannot directly call a historic hook - use call_historic instead."
|
| )
|
| self._verify_all_args_are_provided(kwargs)
|
| firstresult = self.spec.opts.get("firstresult", False) if self.spec else False
|
| # Copy because plugins may register other plugins during iteration (#438).
|
| > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
|
|
|
| venv\lib\site-packages\pluggy\_hooks.py:512:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <_pytest.config.PytestPluginManager object at 0x00000183324A3310>
|
| hook_name = 'pytest_runtest_call'
|
| methods = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>>]
|
| kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def _hookexec(
|
| self,
|
| hook_name: str,
|
| methods: Sequence[HookImpl],
|
| kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| # called from all hookcaller instances.
|
| # enable_tracing will set its own wrapping function at self._inner_hookexec
|
| > return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
|
|
|
| venv\lib\site-packages\pluggy\_manager.py:120:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>>]
|
| caller_kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| teardown.throw(exception)
|
| except RuntimeError as re:
|
| # StopIteration from generator causes RuntimeError
|
| # even for coroutine usage - see #544
|
| if (
|
| isinstance(exception, StopIteration)
|
| and re.__cause__ is exception
|
| ):
|
| teardown.close()
|
| continue
|
| else:
|
| raise
|
| else:
|
| teardown.send(result)
|
| # Following is unreachable for a well behaved hook wrapper.
|
| # Try to force finalizers otherwise postponed till GC action.
|
| # Note: close() may raise if generator handles GeneratorExit.
|
| teardown.close()
|
| except StopIteration as si:
|
| result = si.value
|
| exception = None
|
| continue
|
| except BaseException as e:
|
| exception = e
|
| continue
|
| _raise_wrapfail(teardown, "has second yield")
|
|
|
| if exception is not None:
|
| > raise exception
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:167:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>>]
|
| caller_kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| > teardown.throw(exception)
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:139:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>
|
| item = <Function test_fork_wall_time[True-austin-3.13-heap1]>
|
|
|
| @hookimpl(wrapper=True)
|
| def pytest_runtest_call(self, item: nodes.Item) -> Generator[None]:
|
| self.log_cli_handler.set_when("call")
|
|
|
| with self._runtest_for(item, "call"):
|
| > yield
|
|
|
| venv\lib\site-packages\_pytest\logging.py:850:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>>]
|
| caller_kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| > teardown.throw(exception)
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:139:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <CaptureManager _method='no' _global_capturing=<MultiCapture out=None err=None in_=None _state='suspended' _in_suspended=False> _capture_fixture=None>
|
| item = <Function test_fork_wall_time[True-austin-3.13-heap1]>
|
|
|
| @hookimpl(wrapper=True)
|
| def pytest_runtest_call(self, item: Item) -> Generator[None]:
|
| with self.item_capture("call", item):
|
| > return (yield)
|
|
|
| venv\lib\site-packages\_pytest\capture.py:900:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>>]
|
| caller_kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| > teardown.throw(exception)
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:139:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| item = <Function test_fork_wall_time[True-austin-3.13-heap1]>
|
|
|
| @hookimpl(wrapper=True)
|
| def pytest_runtest_call(item: Item) -> Generator[None]:
|
| xfailed = item.stash.get(xfailed_key, None)
|
| if xfailed is None:
|
| item.stash[xfailed_key] = xfailed = evaluate_xfail_marks(item)
|
|
|
| if xfailed and not item.config.option.runxfail and not xfailed.run:
|
| xfail("[NOTRUN] " + xfailed.reason)
|
|
|
| try:
|
| > return (yield)
|
|
|
| venv\lib\site-packages\_pytest\skipping.py:263:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_runtest_call'
|
| hook_impls = [<HookImpl plugin_name='threadexception', plugin=<module '_pytest.threadexception' from 'D:\\a\\austin\\austin\\venv\\...e=None>>, <HookImpl plugin_name='logging-plugin', plugin=<_pytest.logging.LoggingPlugin object at 0x00000183337B87C0>>]
|
| caller_kwargs = {'item': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = False
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| > res = hook_impl.function(*args)
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:121:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| item = <Function test_fork_wall_time[True-austin-3.13-heap1]>
|
|
|
| def pytest_runtest_call(item: Item) -> None:
|
| _update_current_test_var(item, "call")
|
| try:
|
| del sys.last_type
|
| del sys.last_value
|
| del sys.last_traceback
|
| if sys.version_info >= (3, 12, 0):
|
| del sys.last_exc # type:ignore[attr-defined]
|
| except AttributeError:
|
| pass
|
| try:
|
| > item.runtest()
|
|
|
| venv\lib\site-packages\_pytest\runner.py:178:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <Function test_fork_wall_time[True-austin-3.13-heap1]>
|
|
|
| def runtest(self) -> None:
|
| """Execute the underlying test function."""
|
| > self.ihook.pytest_pyfunc_call(pyfuncitem=self)
|
|
|
| venv\lib\site-packages\_pytest\python.py:1671:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <HookCaller 'pytest_pyfunc_call'>
|
| kwargs = {'pyfuncitem': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = True
|
|
|
| def __call__(self, **kwargs: object) -> Any:
|
| """Call the hook.
|
|
|
| Only accepts keyword arguments, which should match the hook
|
| specification.
|
|
|
| Returns the result(s) of calling all registered plugins, see
|
| :ref:`calling`.
|
| """
|
| assert not self.is_historic(), (
|
| "Cannot directly call a historic hook - use call_historic instead."
|
| )
|
| self._verify_all_args_are_provided(kwargs)
|
| firstresult = self.spec.opts.get("firstresult", False) if self.spec else False
|
| # Copy because plugins may register other plugins during iteration (#438).
|
| > return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
|
|
|
| venv\lib\site-packages\pluggy\_hooks.py:512:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| self = <_pytest.config.PytestPluginManager object at 0x00000183324A3310>
|
| hook_name = 'pytest_pyfunc_call'
|
| methods = [<HookImpl plugin_name='python', plugin=<module '_pytest.python' from 'D:\\a\\austin\\austin\\venv\\lib\\site-packages\\_pytest\\python.py'>>]
|
| kwargs = {'pyfuncitem': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = True
|
|
|
| def _hookexec(
|
| self,
|
| hook_name: str,
|
| methods: Sequence[HookImpl],
|
| kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| # called from all hookcaller instances.
|
| # enable_tracing will set its own wrapping function at self._inner_hookexec
|
| > return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
|
|
|
| venv\lib\site-packages\pluggy\_manager.py:120:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_pyfunc_call'
|
| hook_impls = [<HookImpl plugin_name='python', plugin=<module '_pytest.python' from 'D:\\a\\austin\\austin\\venv\\lib\\site-packages\\_pytest\\python.py'>>]
|
| caller_kwargs = {'pyfuncitem': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = True
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| res = hook_impl.function(*args)
|
| if res is not None:
|
| results.append(res)
|
| if firstresult: # halt further impl calls
|
| break
|
| except BaseException as exc:
|
| exception = exc
|
| finally:
|
| if firstresult: # first result hooks return a single value
|
| result = results[0] if results else None
|
| else:
|
| result = results
|
|
|
| # run all wrapper post-yield blocks
|
| for teardown in reversed(teardowns):
|
| try:
|
| if exception is not None:
|
| try:
|
| teardown.throw(exception)
|
| except RuntimeError as re:
|
| # StopIteration from generator causes RuntimeError
|
| # even for coroutine usage - see #544
|
| if (
|
| isinstance(exception, StopIteration)
|
| and re.__cause__ is exception
|
| ):
|
| teardown.close()
|
| continue
|
| else:
|
| raise
|
| else:
|
| teardown.send(result)
|
| # Following is unreachable for a well behaved hook wrapper.
|
| # Try to force finalizers otherwise postponed till GC action.
|
| # Note: close() may raise if generator handles GeneratorExit.
|
| teardown.close()
|
| except StopIteration as si:
|
| result = si.value
|
| exception = None
|
| continue
|
| except BaseException as e:
|
| exception = e
|
| continue
|
| _raise_wrapfail(teardown, "has second yield")
|
|
|
| if exception is not None:
|
| > raise exception
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:167:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| hook_name = 'pytest_pyfunc_call'
|
| hook_impls = [<HookImpl plugin_name='python', plugin=<module '_pytest.python' from 'D:\\a\\austin\\austin\\venv\\lib\\site-packages\\_pytest\\python.py'>>]
|
| caller_kwargs = {'pyfuncitem': <Function test_fork_wall_time[True-austin-3.13-heap1]>}
|
| firstresult = True
|
|
|
| def _multicall(
|
| hook_name: str,
|
| hook_impls: Sequence[HookImpl],
|
| caller_kwargs: Mapping[str, object],
|
| firstresult: bool,
|
| ) -> object | list[object]:
|
| """Execute a call into multiple python functions/methods and return the
|
| result(s).
|
|
|
| ``caller_kwargs`` comes from HookCaller.__call__().
|
| """
|
| __tracebackhide__ = True
|
| results: list[object] = []
|
| exception = None
|
| try: # run impl and wrapper setup functions in a loop
|
| teardowns: list[Teardown] = []
|
| try:
|
| for hook_impl in reversed(hook_impls):
|
| try:
|
| args = [caller_kwargs[argname] for argname in hook_impl.argnames]
|
| except KeyError as e:
|
| # coverage bug - this is tested
|
| for argname in hook_impl.argnames: # pragma: no cover
|
| if argname not in caller_kwargs:
|
| raise HookCallError(
|
| f"hook call must provide argument {argname!r}"
|
| ) from e
|
|
|
| if hook_impl.hookwrapper:
|
| function_gen = run_old_style_hookwrapper(hook_impl, hook_name, args)
|
|
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
|
|
| elif hook_impl.wrapper:
|
| try:
|
| # If this cast is not valid, a type error is raised below,
|
| # which is the desired response.
|
| res = hook_impl.function(*args)
|
| function_gen = cast(Generator[None, object, object], res)
|
| next(function_gen) # first yield
|
| teardowns.append(function_gen)
|
| except StopIteration:
|
| _raise_wrapfail(function_gen, "did not yield")
|
| else:
|
| > res = hook_impl.function(*args)
|
|
|
| venv\lib\site-packages\pluggy\_callers.py:121:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| pyfuncitem = <Function test_fork_wall_time[True-austin-3.13-heap1]>
|
|
|
| @hookimpl(trylast=True)
|
| def pytest_pyfunc_call(pyfuncitem: Function) -> object | None:
|
| testfunction = pyfuncitem.obj
|
| if is_async_function(testfunction):
|
| async_fail(pyfuncitem.nodeid)
|
| funcargs = pyfuncitem.funcargs
|
| testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames}
|
| > result = testfunction(**testargs)
|
|
|
| venv\lib\site-packages\_pytest\python.py:157:
|
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
|
|
| austin = <test.utils.Variant object at 0x000001833357A9E0>, py = '3.13'
|
| heap = ('-h', '0'), mojo = True
|
|
|
| @pytest.mark.parametrize("heap", [tuple(), ("-h", "0"), ("-h", "64")])
|
| @allpythons()
|
| @variants
|
| @mojo
|
| def test_fork_wall_time(austin, py, heap, mojo):
|
| result = austin("-i", "2ms", *heap, *python(py), target("target34.py"), mojo=mojo)
|
| > assert py in (result.stderr or result.stdout), result.stderr or result.stdout
|
| E AssertionError: [1m _ _ [0m
|
| E [1m __ _ _ _ __| |_(_)_ _ [0m
|
| E [1m/ _` | || (_-< _| | ' \ [0m
|
| E [1m\__,_|\_,_/__/\__|_|_||_| [0m [36;1m3.8.0 [0m [gcc 12.2.0]
|
| E
|
| E š¾ It looks like you are trying to profile a process that is not a Python
|
| E process. Make sure that you are targeting the right application. If the Python
|
| E process is actually a child of the target process then use the -C option to
|
| E discover it automatically.
|
| E
|
| E assert '3.13' in (("\x1b[1m _ _ \x1b[0m \r\n\x1b[1m __ _ _ _ __| |_(_)_ _ \x1b[0m\r\n\x1b[1m/ _` | || (_-< _| | ' \\ \x1b[0m\r\n\x1b[1m\\__,_|\\_,_/__/\\__|_|_||_|\x1b[0m \x1b[36;1m3.8.0\x1b[0m [gcc 12.2.0]\r\n\r\nš¾ It looks like you are trying to profile a process that is not a Python\r\nprocess. Make sure that you are targeting the right application. If the Python\r\nprocess is actually a child of the target process then use the -C option to\r\ndiscover it automatically.\r\n"))
|
| E + where "\x1b[1m _ _ \x1b[0m \r\n\x1b[1m __ _ _ _ __| |_(_)_ _ \x1b[0m\r\n\x1b[1m/ _` | || (_-< _| | ' \\ \x1b[0m\r\n\x1b[1m\\__,_|\\_,_/__/\\__|_|_||_|\x1b[0m \x1b[36;1m3.8.0\x1b[0m [gcc 12.2.0]\r\n\r\nš¾ It looks like you are trying to profile a process that is not a Python\r\nprocess. Make sure that you are targeting the right application. If the Python\r\nprocess is actually a child of the target process then use the -C option to\r\ndiscover it automatically.\r\n" = CompletedProcess(args=['src\\austin.exe', '-b', '-i', '2ms', '-h', '0', 'py', '-3.13', 'D:\\a\\austin\\austin\\test\\targets\\target34.py'], returncode=32, stdout='', stderr="\x1b[1m _ _ \x1b[0m \r\n\x1b[1m __ _ _ _ __| |_(_)_ _ \x1b[0m\r\n\x1b[1m/ _` | || (_-< _| | ' \\ \x1b[0m\r\n\x1b[1m\\__,_|\\_,_/__/\\__|_|_||_|\x1b[0m \x1b[36;1m3.8.0\x1b[0m [gcc 12.2.0]\r\n\r\nš¾ It looks like you are trying to profile a process that is not a Python\r\nprocess. Make sure that you are targeting the right application. If the Python\r\nprocess is actually a child of the target process then use the -C option to\r\ndiscover it automatically.\r\n").stderr
|
|
|
| test\functional\test_fork.py:51: AssertionError
|