You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
6.4 KiB
177 lines
6.4 KiB
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
|