summaryrefslogtreecommitdiff
path: root/testing
diff options
context:
space:
mode:
Diffstat (limited to 'testing')
-rw-r--r--testing/cffi0/test_function.py18
-rw-r--r--testing/cffi0/test_ownlib.py4
-rw-r--r--testing/cffi0/test_parsing.py4
-rw-r--r--testing/cffi0/test_unicode_literals.py4
-rw-r--r--testing/cffi0/test_verify.py4
-rw-r--r--testing/cffi1/test_cffi_binary.py8
-rw-r--r--testing/cffi1/test_re_python.py4
-rw-r--r--testing/cffi1/test_verify1.py4
-rw-r--r--testing/embedding/empty-test.c11
-rw-r--r--testing/embedding/empty.py9
-rw-r--r--testing/embedding/test_basic.py3
-rw-r--r--testing/support.py9
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