summaryrefslogtreecommitdiff
path: root/testing/cffi0/test_zintegration.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/cffi0/test_zintegration.py')
-rw-r--r--testing/cffi0/test_zintegration.py176
1 files changed, 176 insertions, 0 deletions
diff --git a/testing/cffi0/test_zintegration.py b/testing/cffi0/test_zintegration.py
new file mode 100644
index 0000000..d56dac2
--- /dev/null
+++ b/testing/cffi0/test_zintegration.py
@@ -0,0 +1,176 @@
+import py, os, sys, shutil
+import subprocess
+from testing.udir import udir
+
+if sys.platform == 'win32':
+ py.test.skip('snippets do not run on win32')
+if sys.version_info < (2, 7):
+ py.test.skip('fails e.g. on a Debian/Ubuntu which patches virtualenv'
+ ' in a non-2.6-friendly way')
+
+def create_venv(name):
+ tmpdir = udir.join(name)
+ try:
+ subprocess.check_call(['virtualenv',
+ #'--never-download', <= could be added, but causes failures
+ # in random cases on random machines
+ '-p', os.path.abspath(sys.executable),
+ str(tmpdir)])
+ except OSError as e:
+ py.test.skip("Cannot execute virtualenv: %s" % (e,))
+
+ site_packages = None
+ for dirpath, dirnames, filenames in os.walk(str(tmpdir)):
+ if os.path.basename(dirpath) == 'site-packages':
+ site_packages = dirpath
+ break
+ paths = ""
+ if site_packages:
+ try:
+ from cffi import _pycparser
+ modules = ('cffi', '_cffi_backend')
+ except ImportError:
+ modules = ('cffi', '_cffi_backend', 'pycparser')
+ try:
+ import ply
+ except ImportError:
+ pass
+ else:
+ modules += ('ply',) # needed for older versions of pycparser
+ paths = []
+ for module in modules:
+ target = __import__(module, None, None, [])
+ if not hasattr(target, '__file__'): # for _cffi_backend on pypy
+ continue
+ src = os.path.abspath(target.__file__)
+ for end in ['__init__.pyc', '__init__.pyo', '__init__.py']:
+ if src.lower().endswith(end):
+ src = src[:-len(end)-1]
+ break
+ paths.append(os.path.dirname(src))
+ paths = os.pathsep.join(paths)
+ return tmpdir, paths
+
+SNIPPET_DIR = py.path.local(__file__).join('..', 'snippets')
+
+def really_run_setup_and_program(dirname, venv_dir_and_paths, python_snippet):
+ venv_dir, paths = venv_dir_and_paths
+ def remove(dir):
+ dir = str(SNIPPET_DIR.join(dirname, dir))
+ shutil.rmtree(dir, ignore_errors=True)
+ remove('build')
+ remove('__pycache__')
+ for basedir in os.listdir(str(SNIPPET_DIR.join(dirname))):
+ remove(os.path.join(basedir, '__pycache__'))
+ olddir = os.getcwd()
+ python_f = udir.join('x.py')
+ python_f.write(py.code.Source(python_snippet))
+ try:
+ os.chdir(str(SNIPPET_DIR.join(dirname)))
+ if os.name == 'nt':
+ bindir = 'Scripts'
+ else:
+ bindir = 'bin'
+ vp = str(venv_dir.join(bindir).join('python'))
+ env = os.environ.copy()
+ env['PYTHONPATH'] = paths
+ subprocess.check_call((vp, 'setup.py', 'clean'), env=env)
+ subprocess.check_call((vp, 'setup.py', 'install'), env=env)
+ subprocess.check_call((vp, str(python_f)), env=env)
+ finally:
+ os.chdir(olddir)
+
+def run_setup_and_program(dirname, python_snippet):
+ venv_dir = create_venv(dirname + '-cpy')
+ really_run_setup_and_program(dirname, venv_dir, python_snippet)
+ #
+ sys._force_generic_engine_ = True
+ try:
+ venv_dir = create_venv(dirname + '-gen')
+ really_run_setup_and_program(dirname, venv_dir, python_snippet)
+ finally:
+ del sys._force_generic_engine_
+ # the two files lextab.py and yacctab.py are created by not-correctly-
+ # installed versions of pycparser.
+ assert not os.path.exists(str(SNIPPET_DIR.join(dirname, 'lextab.py')))
+ assert not os.path.exists(str(SNIPPET_DIR.join(dirname, 'yacctab.py')))
+
+class TestZIntegration(object):
+ def teardown_class(self):
+ if udir.isdir():
+ udir.remove(ignore_errors=True)
+ udir.ensure(dir=1)
+
+ def test_infrastructure(self):
+ run_setup_and_program('infrastructure', '''
+ import snip_infrastructure
+ assert snip_infrastructure.func() == 42
+ ''')
+
+ def test_distutils_module(self):
+ run_setup_and_program("distutils_module", '''
+ import snip_basic_verify
+ p = snip_basic_verify.C.getpwuid(0)
+ assert snip_basic_verify.ffi.string(p.pw_name) == b"root"
+ ''')
+
+ def test_distutils_package_1(self):
+ run_setup_and_program("distutils_package_1", '''
+ import snip_basic_verify1
+ p = snip_basic_verify1.C.getpwuid(0)
+ assert snip_basic_verify1.ffi.string(p.pw_name) == b"root"
+ ''')
+
+ def test_distutils_package_2(self):
+ run_setup_and_program("distutils_package_2", '''
+ import snip_basic_verify2
+ p = snip_basic_verify2.C.getpwuid(0)
+ assert snip_basic_verify2.ffi.string(p.pw_name) == b"root"
+ ''')
+
+ def test_setuptools_module(self):
+ run_setup_and_program("setuptools_module", '''
+ import snip_setuptools_verify
+ p = snip_setuptools_verify.C.getpwuid(0)
+ assert snip_setuptools_verify.ffi.string(p.pw_name) == b"root"
+ ''')
+
+ def test_setuptools_package_1(self):
+ run_setup_and_program("setuptools_package_1", '''
+ import snip_setuptools_verify1
+ p = snip_setuptools_verify1.C.getpwuid(0)
+ assert snip_setuptools_verify1.ffi.string(p.pw_name) == b"root"
+ ''')
+
+ def test_setuptools_package_2(self):
+ run_setup_and_program("setuptools_package_2", '''
+ import snip_setuptools_verify2
+ p = snip_setuptools_verify2.C.getpwuid(0)
+ assert snip_setuptools_verify2.ffi.string(p.pw_name) == b"root"
+ ''')
+
+ def test_set_py_limited_api(self):
+ from cffi.setuptools_ext import _set_py_limited_api
+ try:
+ import setuptools
+ except ImportError as e:
+ py.test.skip(str(e))
+ orig_version = setuptools.__version__
+ expecting_limited_api = not hasattr(sys, 'gettotalrefcount')
+ try:
+ setuptools.__version__ = '26.0.0'
+ from setuptools import Extension
+
+ kwds = _set_py_limited_api(Extension, {})
+ assert kwds.get('py_limited_api', False) == expecting_limited_api
+
+ setuptools.__version__ = '25.0'
+ kwds = _set_py_limited_api(Extension, {})
+ assert kwds.get('py_limited_api', False) == False
+
+ setuptools.__version__ = 'development'
+ kwds = _set_py_limited_api(Extension, {})
+ assert kwds.get('py_limited_api', False) == expecting_limited_api
+
+ finally:
+ setuptools.__version__ = orig_version