diff options
Diffstat (limited to 'testing')
-rw-r--r-- | testing/cffi0/test_function.py | 18 | ||||
-rw-r--r-- | testing/cffi0/test_ownlib.py | 4 | ||||
-rw-r--r-- | testing/cffi0/test_parsing.py | 4 | ||||
-rw-r--r-- | testing/cffi0/test_unicode_literals.py | 4 | ||||
-rw-r--r-- | testing/cffi0/test_verify.py | 4 | ||||
-rw-r--r-- | testing/cffi1/test_cffi_binary.py | 8 | ||||
-rw-r--r-- | testing/cffi1/test_re_python.py | 4 | ||||
-rw-r--r-- | testing/cffi1/test_verify1.py | 4 | ||||
-rw-r--r-- | testing/embedding/empty-test.c | 11 | ||||
-rw-r--r-- | testing/embedding/empty.py | 9 | ||||
-rw-r--r-- | testing/embedding/test_basic.py | 3 | ||||
-rw-r--r-- | testing/support.py | 9 |
12 files changed, 68 insertions, 14 deletions
diff --git a/testing/cffi0/test_function.py b/testing/cffi0/test_function.py index b4bb23d..84d8db6 100644 --- a/testing/cffi0/test_function.py +++ b/testing/cffi0/test_function.py @@ -5,7 +5,7 @@ import math, os, sys import ctypes.util from cffi.backend_ctypes import CTypesBackend from testing.udir import udir -from testing.support import FdWriteCapture, StdErrCapture +from testing.support import FdWriteCapture, StdErrCapture, is_musl from .backend_tests import needs_dlopen_none try: @@ -13,6 +13,12 @@ try: except ImportError: from io import StringIO +try: + from packaging.tags import platform_tags + _platform_tags_cached = set(platform_tags()) + _is_musl = any(t.startswith('musllinux') for t in _platform_tags_cached) +except ImportError: + _is_musl = False lib_m = 'm' if sys.platform == 'win32': @@ -20,6 +26,8 @@ if sys.platform == 'win32': import distutils.ccompiler if distutils.ccompiler.get_default_compiler() == 'msvc': lib_m = 'msvcrt' +elif is_musl: + lib_m = 'c' class TestFunction(object): Backend = CTypesBackend @@ -165,11 +173,15 @@ class TestFunction(object): ffi.cast("long long", 168)) ffi.C.fprintf(ffi.C.stderr, b"hello %p\n", ffi.NULL) res = fd.getvalue() + if is_musl: + nil_repr = b'0' + else: + nil_repr = b'(nil)' assert res == (b"hello with no arguments\n" b"hello, world!\n" b"hello, world2!\n" b"hello int 42 long 84 long long 168\n" - b"hello (nil)\n") + b"hello " + nil_repr + b"\n") def test_must_specify_type_of_vararg(self): ffi = FFI(backend=self.Backend()) @@ -265,7 +277,7 @@ class TestFunction(object): assert res == 5 def test_write_variable(self): - if not sys.platform.startswith('linux'): + if not sys.platform.startswith('linux') or _is_musl: py.test.skip("probably no symbol 'stdout' in the lib") ffi = FFI(backend=self.Backend()) ffi.cdef(""" diff --git a/testing/cffi0/test_ownlib.py b/testing/cffi0/test_ownlib.py index ffad879..bbdab8c 100644 --- a/testing/cffi0/test_ownlib.py +++ b/testing/cffi0/test_ownlib.py @@ -2,7 +2,7 @@ import py, sys, os import subprocess, weakref from cffi import FFI from cffi.backend_ctypes import CTypesBackend -from testing.support import u +from testing.support import u, is_musl SOURCE = """\ @@ -388,7 +388,7 @@ class TestOwnLib(object): def test_dlopen_handle(self): if self.module is None: py.test.skip("fix the auto-generation of the tiny test lib") - if sys.platform == 'win32': + if sys.platform == 'win32' or is_musl: py.test.skip("uses 'dl' explicitly") if self.__class__.Backend is CTypesBackend: py.test.skip("not for the ctypes backend") diff --git a/testing/cffi0/test_parsing.py b/testing/cffi0/test_parsing.py index a5e4587..5d93a8d 100644 --- a/testing/cffi0/test_parsing.py +++ b/testing/cffi0/test_parsing.py @@ -1,6 +1,7 @@ import py, sys, re from cffi import FFI, FFIError, CDefError, VerificationError from .backend_tests import needs_dlopen_none +from testing.support import is_musl class FakeBackend(object): @@ -80,6 +81,9 @@ if sys.platform == 'win32': import distutils.ccompiler if distutils.ccompiler.get_default_compiler() == 'msvc': lib_m = 'msvcrt' +elif is_musl: + lib_m = 'c' + def test_simple(): ffi = FFI(backend=FakeBackend()) diff --git a/testing/cffi0/test_unicode_literals.py b/testing/cffi0/test_unicode_literals.py index 7b0a5cc..8838de5 100644 --- a/testing/cffi0/test_unicode_literals.py +++ b/testing/cffi0/test_unicode_literals.py @@ -9,6 +9,8 @@ from __future__ import unicode_literals # import sys, math from cffi import FFI +from testing.support import is_musl + lib_m = "m" if sys.platform == 'win32': @@ -16,6 +18,8 @@ if sys.platform == 'win32': import distutils.ccompiler if distutils.ccompiler.get_default_compiler() == 'msvc': lib_m = 'msvcrt' +elif is_musl: + lib_m = 'c' def test_cast(): diff --git a/testing/cffi0/test_verify.py b/testing/cffi0/test_verify.py index 3a1c0b9..de1608d 100644 --- a/testing/cffi0/test_verify.py +++ b/testing/cffi0/test_verify.py @@ -3,7 +3,7 @@ import pytest import sys, os, math, weakref from cffi import FFI, VerificationError, VerificationMissing, model, FFIError from testing.support import * -from testing.support import extra_compile_args +from testing.support import extra_compile_args, is_musl lib_m = ['m'] @@ -1609,7 +1609,7 @@ def test_keepalive_ffi(): assert func() == 42 def test_FILE_stored_in_stdout(): - if not sys.platform.startswith('linux'): + if not sys.platform.startswith('linux') or is_musl: py.test.skip("likely, we cannot assign to stdout") ffi = FFI() ffi.cdef("int printf(const char *, ...); FILE *setstdout(FILE *);") diff --git a/testing/cffi1/test_cffi_binary.py b/testing/cffi1/test_cffi_binary.py index 7cfbace..45421ed 100644 --- a/testing/cffi1/test_cffi_binary.py +++ b/testing/cffi1/test_cffi_binary.py @@ -1,10 +1,11 @@ import py, sys, os import _cffi_backend +from testing.support import is_musl def test_no_unknown_exported_symbols(): if not hasattr(_cffi_backend, '__file__'): py.test.skip("_cffi_backend module is built-in") - if not sys.platform.startswith('linux'): + if not sys.platform.startswith('linux') or is_musl: py.test.skip("linux-only") g = os.popen("objdump -T '%s'" % _cffi_backend.__file__, 'r') for line in g: @@ -17,6 +18,9 @@ def test_no_unknown_exported_symbols(): name = line.split()[-1] if name.startswith('_') or name.startswith('.'): continue - if name not in ('init_cffi_backend', 'PyInit__cffi_backend'): + # a statically-linked libffi will always appear here without header hackage, ignore it if it's internal + if name.startswith('ffi_') and 'Base' in line: + continue + if name not in ('init_cffi_backend', 'PyInit__cffi_backend', 'cffistatic_ffi_call'): raise Exception("Unexpected exported name %r" % (name,)) g.close() diff --git a/testing/cffi1/test_re_python.py b/testing/cffi1/test_re_python.py index 2ae0dd1..45dd70c 100644 --- a/testing/cffi1/test_re_python.py +++ b/testing/cffi1/test_re_python.py @@ -3,7 +3,7 @@ import py from cffi import FFI from cffi import recompiler, ffiplatform, VerificationMissing from testing.udir import udir -from testing.support import u +from testing.support import u, is_musl def setup_module(mod): @@ -269,7 +269,7 @@ def test_selfref(): def test_dlopen_handle(): import _cffi_backend from re_python_pysrc import ffi - if sys.platform == 'win32': + if sys.platform == 'win32' or is_musl: py.test.skip("uses 'dl' explicitly") ffi1 = FFI() ffi1.cdef("""void *dlopen(const char *filename, int flags); diff --git a/testing/cffi1/test_verify1.py b/testing/cffi1/test_verify1.py index 33244cc..45df2b3 100644 --- a/testing/cffi1/test_verify1.py +++ b/testing/cffi1/test_verify1.py @@ -4,7 +4,7 @@ from cffi import FFI, FFIError, VerificationError, VerificationMissing, model from cffi import CDefError from cffi import recompiler from testing.support import * -from testing.support import _verify, extra_compile_args +from testing.support import _verify, extra_compile_args, is_musl import _cffi_backend lib_m = ['m'] @@ -1571,7 +1571,7 @@ def test_keepalive_ffi(): assert func() == 42 def test_FILE_stored_in_stdout(): - if not sys.platform.startswith('linux'): + if not sys.platform.startswith('linux') or is_musl: py.test.skip("likely, we cannot assign to stdout") ffi = FFI() ffi.cdef("int printf(const char *, ...); FILE *setstdout(FILE *);") diff --git a/testing/embedding/empty-test.c b/testing/embedding/empty-test.c new file mode 100644 index 0000000..b00dd50 --- /dev/null +++ b/testing/embedding/empty-test.c @@ -0,0 +1,11 @@ +#include <stdio.h> + +void initialize_my_empty_cffi(void); + +int main(void) +{ + initialize_my_empty_cffi(); + printf("OK\n"); + return 0; +} + diff --git a/testing/embedding/empty.py b/testing/embedding/empty.py index aa8d830..1093505 100644 --- a/testing/embedding/empty.py +++ b/testing/embedding/empty.py @@ -4,7 +4,14 @@ ffi = cffi.FFI() ffi.embedding_api("") -ffi.set_source("_empty_cffi", "") +ffi.set_source("_empty_cffi", """ +void initialize_my_empty_cffi(void) { + if (cffi_start_python() != 0) { + printf("oops, cffi_start_python() returned non-0\\n"); + abort(); + } +} +""") fn = ffi.compile(verbose=True) print('FILENAME: %s' % (fn,)) diff --git a/testing/embedding/test_basic.py b/testing/embedding/test_basic.py index 8d2e776..b29afd2 100644 --- a/testing/embedding/test_basic.py +++ b/testing/embedding/test_basic.py @@ -180,6 +180,9 @@ if sys.platform == 'win32': class TestBasic(EmbeddingTests): def test_empty(self): empty_cffi = self.prepare_module('empty') + self.compile('empty-test', [empty_cffi]) + output = self.execute('empty-test') + assert output == 'OK\n' def test_basic(self): add1_cffi = self.prepare_module('add1') diff --git a/testing/support.py b/testing/support.py index 6339a94..a65375e 100644 --- a/testing/support.py +++ b/testing/support.py @@ -117,3 +117,12 @@ else: extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion', '-Wno-unused-parameter', '-Wno-unreachable-code'] + +is_musl = False +if sys.platform == 'linux': + try: + from packaging.tags import platform_tags + is_musl = any(t.startswith('musllinux') for t in platform_tags()) + del platform_tags + except ImportError: + pass |