text: # Generated by pypy/tool/import_cffi.py
  import py, os, sys, shutil
  import subprocess
  from extra_tests.cffi_tests.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
  