| 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 |