diff --git a/pypy/module/_cffi_backend/test/test_recompiler.py b/pypy/module/_cffi_backend/test/test_recompiler.py index ac0d4193e28202d200874278d4a7a4e3539a72b1..dfa0c26b9616e9c0d7a9c4fbfcbb45650a2cfbdd 100644 --- a/pypy/module/_cffi_backend/test/test_recompiler.py +++ b/pypy/module/_cffi_backend/test/test_recompiler.py @@ -11,7 +11,10 @@ def get_ext_suffix(): # soabi is None on cpython < 3.7 (incl 2.7), 'pypy-73' on pypy2 v7.3.1 # and something like 'cpython-38-x86_64-linux-gnu' on cpython 3.8 soabi = get_config_var('SOABI') or '' - ret = soabi + get_config_var('SO') + so = get_config_var('SO') + if soabi and so.startswith('.' + soabi): + return so[1:] + ret = soabi + so # either '.so' or 'pypy-73.so' if ret[0] == '.': return ret[1:] @@ -1616,6 +1619,7 @@ class AppTestRecompiler: res = lib.bok() assert [res.a, res.b, res.c] == [10, 20, 30] + @pytest.mark.xfail("'__pypy__' in sys.modules") def test_extern_python_long_double(self): ffi, lib = self.prepare(""" extern "Python" int bar(int, long double, int); diff --git a/pypy/objspace/std/test/test_newformat.py b/pypy/objspace/std/test/test_newformat.py index 1f728ad96ea904244b4f6569030522f51ed7475b..635c93638c0f4c9b4abe14bf67f833b08f5d580c 100644 --- a/pypy/objspace/std/test/test_newformat.py +++ b/pypy/objspace/std/test/test_newformat.py @@ -390,26 +390,29 @@ class AppTestFloatFormatting: locale.setlocale(locale.LC_NUMERIC, 'C') def test_locale_german(self): - import locale, sys - for name in ['de_DE', 'de_DE.utf8']: + import locale + # German and Danish use the exact same numeric separators, but + # for some reason or other, macOS disagrees, and seems to + # specify no thousand separator in German, even in CPython + # 3.8. As macOS always includes all available locales, we try + # the Danish one first. On Linux, however, locales may require + # explicit installation, so Danish may not, in fact, be + # present. Fortunately, the German locale behaves sensibly + # there, so we can safely fallback to this ever so slightly + # more prevalent language. + for name in ['da_DK', 'da_DK.UTF-8', 'de_DE', 'de_DE.UTF-8']: try: locale.setlocale(locale.LC_NUMERIC, name) break except locale.Error: pass else: - skip("no german locale") + skip("neither German or Danish locale available") x = 1234.567890 try: - if sys.platform != "darwin": - assert locale.format('%g', x, grouping=True) == '1.234,57' - assert format(x, 'n') == '1.234,57' - assert format(12345678901234, 'n') == '12.345.678.901.234' - else: - # No thousands separator on German in MacOS since 10.4 - assert locale.format('%g', x, grouping=True) == '1234,57' - assert format(x, 'n') == '1234,57' - assert format(12345678901234, 'n') == '12345678901234' + assert locale.format('%g', x, grouping=True) == '1.234,57' + assert format(x, 'n') == '1.234,57' + assert format(12345678901234, 'n') == '12.345.678.901.234' finally: locale.setlocale(locale.LC_NUMERIC, 'C') diff --git a/rpython/tool/cparser/cts.py b/rpython/tool/cparser/cts.py index 6106a65279a2366d3c10f5d071dbcd476f62d0ea..77a79754fdab12eace2d816557ac7369a6e99ff7 100644 --- a/rpython/tool/cparser/cts.py +++ b/rpython/tool/cparser/cts.py @@ -214,7 +214,7 @@ class CTypeSpace(object): return rffi.CArrayPtr(TO) elif isinstance(obj, model.FunctionPtrType): if obj.ellipsis: - raise NotImplementedError + raise NotImplementedError('cannot handle functions with variadic arguments') args = [self.convert_type(arg) for arg in obj.args] res = self.convert_type(obj.result) return lltype.Ptr(lltype.FuncType(args, res)) @@ -228,7 +228,7 @@ class CTypeSpace(object): setattr(enum, key, value) return enum else: - raise NotImplementedError + raise NotImplementedError("unsupported type %s" % (type(obj),)) def gettype(self, cdecl): try: diff --git a/testrunner/runner.py b/testrunner/runner.py index c4a05848c33b2b02f4258dc3ec2b6462407158d3..22ed0af430afb0bbffd6463ab0c45d566c599fdf 100644 --- a/testrunner/runner.py +++ b/testrunner/runner.py @@ -109,9 +109,11 @@ def getsignalname(n): return 'signal %d' % (n,) def execute_test(cwd, test, out, logfname, interp, test_driver, - do_dry_run=False, timeout=None, + do_dry_run=False, timeout=None, fail_fast=False, _win32=(sys.platform=='win32')): args = interp + test_driver + if fail_fast: + args.append('-x') args += ['-p', 'resultlog', '--resultlog=%s' % logfname, #'--junitxml=%s.junit' % logfname, @@ -167,7 +169,7 @@ def interpret_exitcode(exitcode, test, logdata=""): failure = False return failure, extralog -def worker(num, n, run_param, testdirs, result_queue): +def worker(num, n, run_param, testdirs, fail_fast, result_queue): sessdir = run_param.sessdir root = run_param.root get_test_driver = run_param.get_test_driver @@ -192,7 +194,7 @@ def worker(num, n, run_param, testdirs, result_queue): test_driver = get_test_driver(test) exitcode = execute_test(root, test, one_output, logfname, interp, test_driver, do_dry_run=dry_run, - timeout=timeout) + timeout=timeout, fail_fast=fail_fast) cleanup(test) except: @@ -219,15 +221,15 @@ def worker(num, n, run_param, testdirs, result_queue): invoke_in_thread = thread.start_new_thread -def start_workers(n, run_param, testdirs): +def start_workers(n, run_param, fail_fast, testdirs): result_queue = Queue.Queue() for i in range(n): invoke_in_thread(worker, (i, n, run_param, testdirs, - result_queue)) + fail_fast, result_queue)) return result_queue -def execute_tests(run_param, testdirs, logfile, out): +def execute_tests(run_param, testdirs, fail_fast, logfile, out): sessdir = py.path.local.make_numbered_dir(prefix='usession-testrunner-', keep=4) run_param.sessdir = sessdir @@ -248,7 +250,7 @@ def execute_tests(run_param, testdirs, logfile, out): out.write("-- %s\n" % testname) out.write("-- total: %d to run\n" % len(testdirs)) - result_queue = start_workers(N, run_param, testdirs) + result_queue = start_workers(N, run_param, fail_fast, testdirs) done = 0 started = 0 @@ -282,6 +284,9 @@ def execute_tests(run_param, testdirs, logfile, out): if logdata: logfile.write(logdata) + if fail_fast and failure: + break + run_param.shutdown() return failure @@ -297,12 +302,14 @@ class RunParam(object): test_driver = [pytestpath] parallel_runs = 1 + fail_fast = False timeout = None cherrypick = None - def __init__(self, root): + def __init__(self, root, args): self.root = root self.self = self + self.cherrypick = args def startup(self): pass @@ -369,6 +376,9 @@ def main(args): parser.add_option("--dry-run", dest="dry_run", default=False, action="store_true", help="dry run"), + parser.add_option("--fail-fast", dest="fail_fast", default=False, + action="store_true", + help="stop at the first failure or error"), parser.add_option("--timeout", dest="timeout", default=None, type="int", help="timeout in secs for test processes") @@ -389,7 +399,7 @@ def main(args): testdirs = [] - run_param = RunParam(root) + run_param = RunParam(root, args[1:]) # the config files are python files whose run overrides the content # of the run_param instance namespace # in that code function overriding method should not take self @@ -418,7 +428,7 @@ def main(args): print >>out, '\n'.join([str((k, getattr(run_param, k))) \ for k in dir(run_param) if k[:2] != '__']) - res = execute_tests(run_param, testdirs, logfile, out) + res = execute_tests(run_param, testdirs, opts.fail_fast, logfile, out) if res: sys.exit(1)