Skip to content
Snippets Groups Projects
Select Git revision
  • d348afa15d5a997e7a8e51c0f789f41cb15cc651
  • main default protected
  • 3.10
  • 3.11
  • revert-15688-bpo-38031-_io-FileIO-opener-crash
  • 3.8
  • 3.9
  • 3.7
  • enum-fix_auto
  • branch-v3.11.0
  • backport-c3648f4-3.11
  • gh-93963/remove-importlib-resources-abcs
  • refactor-wait_for
  • shared-testcase
  • v3.12.0a2
  • v3.12.0a1
  • v3.11.0
  • v3.8.15
  • v3.9.15
  • v3.10.8
  • v3.7.15
  • v3.11.0rc2
  • v3.8.14
  • v3.9.14
  • v3.7.14
  • v3.10.7
  • v3.11.0rc1
  • v3.10.6
  • v3.11.0b5
  • v3.11.0b4
  • v3.10.5
  • v3.11.0b3
  • v3.11.0b2
  • v3.9.13
34 results

bugs.rst

Blame
  • test_cppext.py 3.50 KiB
    # gh-91321: Build a basic C++ test extension to check that the Python C API is
    # compatible with C++ and does not emit C++ compiler warnings.
    import os.path
    import sys
    import unittest
    import subprocess
    import sysconfig
    from test import support
    from test.support import os_helper
    
    
    MS_WINDOWS = (sys.platform == 'win32')
    
    
    SETUP_TESTCPPEXT = support.findfile('setup_testcppext.py')
    
    
    @support.requires_subprocess()
    class TestCPPExt(unittest.TestCase):
        def test_build_cpp11(self):
            self.check_build(False, '_testcpp11ext')
    
        def test_build_cpp03(self):
            self.check_build(True, '_testcpp03ext')
    
        # With MSVC, the linker fails with: cannot open file 'python311.lib'
        # https://github.com/python/cpython/pull/32175#issuecomment-1111175897
        @unittest.skipIf(MS_WINDOWS, 'test fails on Windows')
        # Building and running an extension in clang sanitizing mode is not
        # straightforward
        @unittest.skipIf(
            '-fsanitize' in (sysconfig.get_config_var('PY_CFLAGS') or ''),
            'test does not work with analyzing builds')
        # the test uses venv+pip: skip if it's not available
        @support.requires_venv_with_pip()
        def check_build(self, std_cpp03, extension_name):
            # Build in a temporary directory
            with os_helper.temp_cwd():
                self._check_build(std_cpp03, extension_name)
    
        def _check_build(self, std_cpp03, extension_name):
            venv_dir = 'env'
            verbose = support.verbose
    
            # Create virtual environment to get setuptools
            cmd = [sys.executable, '-X', 'dev', '-m', 'venv', venv_dir]
            if verbose:
                print()
                print('Run:', ' '.join(cmd))
            subprocess.run(cmd, check=True)
    
            # Get the Python executable of the venv
            python_exe = 'python'
            if sys.executable.endswith('.exe'):
                python_exe += '.exe'
            if MS_WINDOWS:
                python = os.path.join(venv_dir, 'Scripts', python_exe)
            else:
                python = os.path.join(venv_dir, 'bin', python_exe)
    
            def run_cmd(operation, cmd):
                if verbose:
                    print('Run:', ' '.join(cmd))
                    subprocess.run(cmd, check=True)
                else:
                    proc = subprocess.run(cmd,
                                          stdout=subprocess.PIPE,
                                          stderr=subprocess.STDOUT,
                                          text=True)
                    if proc.returncode:
                        print(proc.stdout, end='')
                        self.fail(
                            f"{operation} failed with exit code {proc.returncode}")
    
            # Build the C++ extension
            cmd = [python, '-X', 'dev',
                   SETUP_TESTCPPEXT, 'build_ext', '--verbose']
            if std_cpp03:
                cmd.append('-std=c++03')
            run_cmd('Build', cmd)
    
            # Install the C++ extension
            cmd = [python, '-X', 'dev',
                   SETUP_TESTCPPEXT, 'install']
            run_cmd('Install', cmd)
    
            # Do a reference run. Until we test that running python
            # doesn't leak references (gh-94755), run it so one can manually check
            # -X showrefcount results against this baseline.
            cmd = [python,
                   '-X', 'dev',
                   '-X', 'showrefcount',
                   '-c', 'pass']
            run_cmd('Reference run', cmd)
    
            # Import the C++ extension
            cmd = [python,
                   '-X', 'dev',
                   '-X', 'showrefcount',
                   '-c', f"import {extension_name}"]
            run_cmd('Import', cmd)
    
    
    if __name__ == "__main__":
        unittest.main()