Home - Summaries: (main) : (py3.11) : (py3.12) : Everything - Nightly builds - Benchmarks - RPython - Builders - About

pypy/module/cpyext/test/test_pystate.py::AppTestThreads::()::test_thread_interrupt

self = <CallInfo when='call' exception: Subprocess failed with exit code 1:
Traceback (most recent call last):
  File "/tmp/b...x86_64/usession-py3.11-5682/src.py", line 192, in test_thread_interrupt
    assert cancelled_exception
AssertionError
>
func = <function <lambda> at 0x00007f9399f4e818>, when = 'call'

    def __init__(self, func, when):
        #: context of invocation: one of "setup", "call",
        #: "teardown", "memocollect"
        self.when = when
        self.start = time()
        try:
>           self.result = func()

../_pytest/runner.py:150: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

>   return CallInfo(lambda: ihook(item=item, **kwds), when=when)

../_pytest/runner.py:138: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_HookCaller 'pytest_runtest_call'>
kwargs = {'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={'item': <AppTestMethod 'test_thread_interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_thread_interrupt'>}

    def __call__(self, **kwargs):
        assert not self.is_historic()
>       return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)

../_pytest/vendored_packages/pluggy.py:724: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.config.PytestPluginManager object at 0x00007f93a88da598>
hook = <_HookCaller 'pytest_runtest_call'>, methods = []
kwargs = {'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={'item': <AppTestMethod 'test_thread_interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_thread_interrupt'>}

    def _hookexec(self, hook, methods, kwargs):
        # called from all hookcaller instances.
        # enable_tracing will set its own wrapping function at self._inner_hookexec
>       return self._inner_hookexec(hook, methods, kwargs)

../_pytest/vendored_packages/pluggy.py:338: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

hook = <_HookCaller 'pytest_runtest_call'>, methods = []
kwargs = {'__multicall__': <_MultiCall 0 results, 0 meths, kwargs={'item': <AppTestMethod 'test_thread_interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_thread_interrupt'>}

    self._inner_hookexec = lambda hook, methods, kwargs: \
>       _MultiCall(methods, kwargs, hook.spec_opts).execute()

../_pytest/vendored_packages/pluggy.py:333: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_MultiCall 0 results, 0 meths, kwargs={'item': <AppTestMethod 'test_thread_interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>

    def execute(self):
        all_kwargs = self.kwargs
        self.results = results = []
        firstresult = self.specopts.get("firstresult")
    
        while self.hook_impls:
            hook_impl = self.hook_impls.pop()
            args = [all_kwargs[argname] for argname in hook_impl.argnames]
            if hook_impl.hookwrapper:
>               return _wrapped_call(hook_impl.function(*args), self.execute)

../_pytest/vendored_packages/pluggy.py:595: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

wrap_controller = <generator object pytest_runtest_call at 0x00007f9390110e58>
func = <bound method _MultiCall.execute of <_MultiCall 0 results, 0 meths, kwargs={'i..._interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>>

    def _wrapped_call(wrap_controller, func):
        """ Wrap calling to a function with a generator which needs to yield
        exactly once.  The yield point will trigger calling the wrapped function
        and return its _CallOutcome to the yield point.  The generator then needs
        to finish (raise StopIteration) in order for the wrapped call to complete.
        """
        try:
            next(wrap_controller)   # first yield
        except StopIteration:
            _raise_wrapfail(wrap_controller, "did not yield")
        call_outcome = _CallOutcome(func)
        try:
            wrap_controller.send(call_outcome)
            _raise_wrapfail(wrap_controller, "has second yield")
        except StopIteration:
            pass
>       return call_outcome.get_result()

../_pytest/vendored_packages/pluggy.py:253: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0x00007f93abc867e0>

    def get_result(self):
        if self.excinfo is None:
            return self.result
        else:
            ex = self.excinfo
            if _py3:
                raise ex[1].with_traceback(ex[2])
>           _reraise(*ex)  # noqa

../_pytest/vendored_packages/pluggy.py:279: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0x00007f93abc867e0>
func = <bound method _MultiCall.execute of <_MultiCall 0 results, 0 meths, kwargs={'i..._interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>>

    def __init__(self, func):
        try:
>           self.result = func()

../_pytest/vendored_packages/pluggy.py:264: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <_MultiCall 0 results, 0 meths, kwargs={'item': <AppTestMethod 'test_thread_interrupt'>, '__multicall__': <_MultiCall 0 results, 0 meths, kwargs={...}>}>

    def execute(self):
        all_kwargs = self.kwargs
        self.results = results = []
        firstresult = self.specopts.get("firstresult")
    
        while self.hook_impls:
            hook_impl = self.hook_impls.pop()
            args = [all_kwargs[argname] for argname in hook_impl.argnames]
            if hook_impl.hookwrapper:
                return _wrapped_call(hook_impl.function(*args), self.execute)
>           res = hook_impl.function(*args)

../_pytest/vendored_packages/pluggy.py:596: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

item = <AppTestMethod 'test_thread_interrupt'>

    def pytest_runtest_call(item):
        try:
>           item.runtest()

../_pytest/runner.py:91: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <AppTestMethod 'test_thread_interrupt'>

    def runtest(self):
        target = self.obj
        src = extract_docstring_if_empty_function(target.im_func)
        space = target.im_self.space
        if self.config.option.runappdirect:
            appexec_definitions = self.parent.obj.__dict__
            spaceconfig = getattr(self.parent.obj, 'spaceconfig', None)
            usemodules = spaceconfig.get('usemodules') if spaceconfig else None
            return run_with_python(self.config.option.python, src, usemodules,
>                                  **appexec_definitions)

tool/pytest/apptest.py:327: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

python_ = '/Users/matti/build-worker-x86_64/pypy-c-jit-macos-x86-64/build/pypy/goal/pypy3.11-c'
target_ = <function test_thread_interrupt at 0x00007f9388b4ebd8>
usemodules = ['cpyext', '_thread', '_struct', 'array', 'itertools', 'time', ...]
definitions = {'compile_module': <bound method AppTestThreads.w_compile_module of <pypy.module.cpyext.test.test_pystate.AppTestThrea...Threads.w_import_extension of <pypy.module.cpyext.test.test_pystate.AppTestThreads object at 0x00007f939a133e50>>, ...}
defs = ['def w_compile_module(self, name,\n        source_files=None, source_strings=None):\n    from extbuild import get_sys...e=prologue,\n        include_dirs=include_dirs, more_init=more_init,\n        PY_SSIZE_T_CLEAN=PY_SSIZE_T_CLEAN)', ...]
symbol = 'udir', value = u'/tmp/buildbot-x86_64/usession-py3.11-5682'
code = <py._code.code.Code object at 0x00007f939a133f68>

    def run_with_python(python_, target_, usemodules, **definitions):
        if python_ is None:
            py.test.skip("Cannot find the default python3 interpreter to run with -A")
        defs = []
        for symbol, value in sorted(definitions.items()):
            if isinstance(value, tuple) and isinstance(value[0], py.code.Source):
                code, args = value
                defs.append(str(code))
                arg_repr = []
                for arg in args:
                    if isinstance(arg, types.FunctionType):
                        arg_repr.append(arg.__name__)
                    elif isinstance(arg, types.MethodType):
                        arg_repr.append(arg.__name__)
                    else:
                        arg_repr.append(py3k_repr(arg))
                args = ', '.join(arg_repr)
                defs.append("self.%s = anonymous(%s)\n" % (symbol, args))
            elif isinstance(value, types.MethodType):
                # "def w_method(self)"
                code = py.code.Code(value)
                defs.append(str(code.source()))
                defs.append("type(self).%s = %s\n" % (symbol, value.__name__))
            elif isinstance(value, types.ModuleType):
                name = value.__name__
                defs.append("import %s; self.%s = %s\n" % (name, symbol, name))
            elif isinstance(value, (str, unicode, int, long, float, list, tuple,
                                    dict)) or value is None:
                defs.append("self.%s = %s\n" % (symbol, py3k_repr(value)))
    
        check_usemodules = ''
        if usemodules:
            usemodules = [_rename_module(name) for name in usemodules]
            check_usemodules = """\
        missing = set(%r).difference(sys.builtin_module_names)
        if missing:
            if not hasattr(sys, 'pypy_version_info'):
                # They may be extension modules on CPython
                name = None
                for name in missing.copy():
                    if name in ['cpyext', '_cffi_backend', '_rawffi']:
                        missing.remove(name)
                        continue
                    try:
                        __import__(name)
                    except ImportError:
                        pass
                    else:
                        missing.remove(name)
                del name
            if missing:
                sys.exit(81)
        del missing""" % usemodules
    
        source = list(py.code.Source(target_))
        while source[0].startswith(('@py.test.mark.', '@pytest.mark.')):
            source.pop(0)
        source = source[1:]
    
        pyfile = udir.join('src.py')
        if isinstance(target_, str):
            # Special case of a docstring; the function name is the first word.
            target_name = target_.split('(', 1)[0]
        else:
            target_name = target_.__name__
        with pyfile.open('w') as f:
            f.write(helpers % (pypyroot, check_usemodules))
            f.write('\n'.join(defs))
            f.write('def %s():\n' % target_name)
            f.write('\n'.join(source))
            f.write("\ntry:\n    %s()\n" % target_name)
            f.write('finally:\n    print("===aefwuiheawiu===")')
        helper_dir = os.path.join(pypydir, 'tool', 'cpyext')
        env = os.environ.copy()
        env['PYTHONPATH'] = helper_dir
        res, stdout, stderr = run_subprocess(
            python_, [str(pyfile)], env=env)
        print pyfile.read()
        print "from", str(pyfile)
        print >> sys.stdout, stdout
        print >> sys.stderr, stderr
        if res == 81:
            py.test.skip('%r was not compiled w/ required usemodules: %r' %
                         (python_, usemodules))
        elif res != 0:
            raise AssertionError(
>               "Subprocess failed with exit code %s:\n%s" % (res, stderr))
E           AssertionError: Subprocess failed with exit code 1:
E           Traceback (most recent call last):
E             File "/tmp/buildbot-x86_64/usession-py3.11-5682/src.py", line 204, in <module>
E               test_thread_interrupt()
E             File "/tmp/buildbot-x86_64/usession-py3.11-5682/src.py", line 192, in test_thread_interrupt
E               assert cancelled_exception
E           AssertionError

tool/pytest/apptest.py:239: AssertionError
---------- Captured stdout call ----------
# -*- encoding: utf-8 -*-
if 1:
    import sys
    sys.path.append('/Users/matti/build-worker-x86_64/pypy-c-jit-macos-x86-64/build')
    missing = set(['cpyext', '_thread', '_struct', 'array', 'itertools', 'time', 'binascii', 'mmap', '_signal', '_cffi_backend']).difference(sys.builtin_module_names)
    if missing:
        if not hasattr(sys, 'pypy_version_info'):
            # They may be extension modules on CPython
            name = None
            for name in missing.copy():
                if name in ['cpyext', '_cffi_backend', '_rawffi']:
                    missing.remove(name)
                    continue
                try:
                    __import__(name)
                except ImportError:
                    pass
                else:
                    missing.remove(name)
            del name
        if missing:
            sys.exit(81)
    del missing
    def skip(message):
        print(message)
        raise SystemExit(0)
    __builtins__.skip = skip
    __builtins__.py3k_skip = skip
    class ExceptionWrapper:
        pass
    def raises(exc, *args, **kwargs):
        if not args:
            return RaisesContext(exc)
        func = args[0]
        args = args[1:]
        import os
        try:
            if isinstance(func, str):
                if func.startswith((' ', os.linesep, '\n')):
                    # it's probably an indented block, so we prefix if True:
                    # to avoid SyntaxError
                    func = "if True:\n" + func
                frame = sys._getframe(1)
                exec(func, frame.f_globals, frame.f_locals)
            else:
                func(*args, **kwargs)
        except exc as e:
            res = ExceptionWrapper()
            res.value = e
            res.traceback = e.__traceback__
            return res
        else:
            raise AssertionError("DID NOT RAISE")

    class RaisesContext(object):
        def __init__(self, expected_exception):
            self.expected_exception = expected_exception
            self.excinfo = None

        def __enter__(self):
            return self

        def __exit__(self, *tp):
            __tracebackhide__ = True
            if tp[0] is None:
                raise AssertionError("DID NOT RAISE")
            self.value = tp[1]
            return issubclass(tp[0], self.expected_exception)

    __builtins__.raises = raises
    class Test:
        pass
    self = Test()
def w_compile_module(self, name,
        source_files=None, source_strings=None):
    from extbuild import get_sys_info_app
    sys_info = get_sys_info_app(self.udir)
    return sys_info.compile_extension_module(name,
        source_files=source_files, source_strings=source_strings)
type(self).compile_module = w_compile_module

def w_debug_collect(self):
    import gc
    gc.collect()
    gc.collect()
    gc.collect()
type(self).debug_collect = w_debug_collect

self.here = '/Users/matti/build-worker-x86_64/pypy-c-jit-macos-x86-64/build/pypy/module/cpyext/test'

def w_import_extension(self, modname, functions, prologue="",
    include_dirs=None, more_init="", PY_SSIZE_T_CLEAN=False):
    from extbuild import get_sys_info_app
    sys_info = get_sys_info_app(self.udir)
    return sys_info.import_extension(
        modname, functions, prologue=prologue,
        include_dirs=include_dirs, more_init=more_init,
        PY_SSIZE_T_CLEAN=PY_SSIZE_T_CLEAN)
type(self).import_extension = w_import_extension

def w_import_module(self, name, init=None, body='', filename=None,
        include_dirs=None, PY_SSIZE_T_CLEAN=False, use_imp=False):
    from extbuild import get_sys_info_app
    sys_info = get_sys_info_app(self.udir)
    return sys_info.import_module(
        name, init=init, body=body, filename=filename,
        include_dirs=include_dirs,
        PY_SSIZE_T_CLEAN=PY_SSIZE_T_CLEAN)
type(self).import_module = w_import_module

def w_load_module(self, mod, name):
    from extbuild import get_sys_info_app
    sys_info = get_sys_info_app(self.udir)
    return sys_info.load_module(mod, name)
type(self).load_module = w_load_module

self.runappdirect = True

self.udir = '/tmp/buildbot-x86_64/usession-py3.11-5682'
def test_thread_interrupt():
    if not self.runappdirect:
        skip("test fails untranslated for obscure reasons")
    import signal # to initialize the signal infrastructure
    import _thread as thread, time

    module = self.import_extension('disruptor', [
            ("surprise", "METH_VARARGS",
             """
                 long tid;
                 PyObject *exc;
                 if (!PyArg_ParseTuple(args, "lO", &tid, &exc))
                     return NULL;
                 return PyLong_FromLong(PyThreadState_SetAsyncExc(tid, exc));
                 """),
            ("nosurprise", "METH_VARARGS",
             """
                 long tid;
                 if (!PyArg_ParseTuple(args, "l", &tid))
                     return NULL;
                 return PyLong_FromLong(PyThreadState_SetAsyncExc(tid, NULL));
                 """),
            ])
    # raise in another thread
    def f():
        try:
            childstarted.append(thread.get_ident())
            while 1:
                print("waiting in child")
                time.sleep(0.1)
        except KeyError:
            childstarted.pop()
        else:
            thread.interrupt_main() # to crash the test
    cancelled_exception = False

    for i in range(20):
        print(i)
        # first wait for the child to start
        childstarted = []
        thread.start_new_thread(f, ())
        for i in range(500):
            if childstarted:
                break
            time.sleep(0.1)
        # then interrupt it from the main thread
        res = module.surprise(childstarted[0], KeyError)
        assert res == 1

        # try to cancel the interrupt
        # this is racing! the child could either have been terminated
        # already or not
        try:
            res = module.nosurprise(childstarted[0])
            assert res in (0, 1)
        except IndexError:
            pass
        else:
            if res == 1:
                cancelled_exception = True
                # actually send exception
                res = module.surprise(childstarted[0], KeyError)
                assert res in (0, 1)
        # now wait for the exception to arrive in the child thread
        # which empties childstarted again
        for i in range(500):
            if not childstarted:
                break
            time.sleep(0.1)
        assert res == 1
    if self.runappdirect:
        # only after translation
        assert cancelled_exception
    else:
        # best we can do is check that the test ran
        pass

    # raise to main
    with raises(ValueError):
        res = module.surprise(thread.get_ident(), ValueError)
        while 1:
            print("sleeping")
            time.sleep(0.1)
try:
    test_thread_interrupt()
finally:
    print("===aefwuiheawiu===")
from /tmp/buildbot-x86_64/usession-py3.11-5682/src.py
0
waiting in child
1
waiting in child
2
waiting in child
3
waiting in child
4
waiting in child
5
waiting in child
6
waiting in child
7
waiting in child
8
waiting in child
9
waiting in child
10
waiting in child
11
waiting in child
12
waiting in child
13
waiting in child
14
waiting in child
15
waiting in child
16
waiting in child
17
waiting in child
18
waiting in child
19
waiting in child
===aefwuiheawiu===

---------- Captured stderr call ----------
Traceback (most recent call last):
  File "/tmp/buildbot-x86_64/usession-py3.11-5682/src.py", line 204, in <module>
    test_thread_interrupt()
  File "/tmp/buildbot-x86_64/usession-py3.11-5682/src.py", line 192, in test_thread_interrupt
    assert cancelled_exception
AssertionError
builder: pypy-c-jit-macos-x86-64 build #1367+
test: pypy/module/cpyext/test/test_pystate.py::AppTestThreads::()::test_thread_interrupt