def test_install_without_pbr(self):
        # Test easy-install of a thing that depends on a thing using pbr
        tempdir = self.useFixture(fixtures.TempDir()).path
        # A directory containing sdists of the things we're going to depend on
        # in using-package.
        dist_dir = os.path.join(tempdir, 'distdir')
        os.mkdir(dist_dir)
        self._run_cmd(sys.executable, ('setup.py', 'sdist', '-d', dist_dir),
                      allow_fail=False,
                      cwd=PBR_ROOT)
        # testpkg - this requires a pbr-using package
        test_pkg_dir = os.path.join(tempdir, 'testpkg')
        os.mkdir(test_pkg_dir)
        pkgs = {
            'pkgTest': {
                'setup.py':
                textwrap.dedent("""\
                    #!/usr/bin/env python
                    import setuptools
                    setuptools.setup(
                        name = 'pkgTest',
                        tests_require = ['pkgReq'],
                        test_suite='pkgReq'
                    )
                """),
                'setup.cfg':
                textwrap.dedent("""\
                    [easy_install]
                    find_links = %s
                """ % dist_dir)
            },
            'pkgReq': {
                'requirements.txt':
                textwrap.dedent("""\
                    pbr
                """),
                'pkgReq/__init__.py':
                textwrap.dedent("""\
                    print("FakeTest loaded and ran")
                """)
            },
        }
        pkg_dirs = self.useFixture(
            test_packaging.CreatePackages(pkgs)).package_dirs
        test_pkg_dir = pkg_dirs['pkgTest']
        req_pkg_dir = pkg_dirs['pkgReq']

        self._run_cmd(sys.executable, ('setup.py', 'sdist', '-d', dist_dir),
                      allow_fail=False,
                      cwd=req_pkg_dir)
        # A venv to test within
        venv = self.useFixture(test_packaging.Venv('nopbr', ['pip', 'wheel']))
        python = venv.python
        # Run the depending script
        self.useFixture(
            base.CapturedSubprocess('nopbr', [python] + ['setup.py', 'test'],
                                    cwd=test_pkg_dir))
 def test_lts_venv_default_versions(self):
     venv = self.useFixture(
         test_packaging.Venv('setuptools', modules=self.modules))
     bin_python = venv.python
     pbr = 'file://%s#egg=pbr' % PBR_ROOT
     # Installing PBR is a reasonable indication that we are not broken on
     # this particular combination of setuptools and pip.
     self._run_cmd(bin_python, ['-m', 'pip', 'install', pbr],
                   cwd=venv.path,
                   allow_fail=False)
 def test_lts_venv_default_versions(self):
     if (sys.version_info[0] == 3 and not self.py3support):
         self.skipTest('This combination will not install with py3, '
                       'skipping test')
     venv = self.useFixture(
         test_packaging.Venv('setuptools', modules=self.modules))
     bin_python = venv.python
     pbr = 'file://%s#egg=pbr' % PBR_ROOT
     # Installing PBR is a reasonable indication that we are not broken on
     # this particular combination of setuptools and pip.
     self._run_cmd(bin_python, ['-m', 'pip', 'install', pbr],
                   cwd=venv.path,
                   allow_fail=False)
 def test_pip_versions(self):
     pkgs = {
         'test_markers': {
             'requirements.txt':
             textwrap.dedent("""\
                 pkg_a; python_version=='1.2'
                 pkg_b; python_version!='1.2'
             """)
         },
         'pkg_a': {},
         'pkg_b': {},
     }
     pkg_dirs = self.useFixture(
         test_packaging.CreatePackages(pkgs)).package_dirs
     temp_dir = self.useFixture(fixtures.TempDir()).path
     repo_dir = os.path.join(temp_dir, 'repo')
     venv = self.useFixture(test_packaging.Venv('markers'))
     bin_python = venv.python
     os.mkdir(repo_dir)
     for module in self.modules:
         self._run_cmd(bin_python,
                       ['-m', 'pip', 'install', '--upgrade', module],
                       cwd=venv.path,
                       allow_fail=False)
     for pkg in pkg_dirs:
         self._run_cmd(bin_python, ['setup.py', 'sdist', '-d', repo_dir],
                       cwd=pkg_dirs[pkg],
                       allow_fail=False)
     self._run_cmd(bin_python, [
         '-m', 'pip', 'install', '--no-index', '-f', repo_dir,
         'test_markers'
     ],
                   cwd=venv.path,
                   allow_fail=False)
     self.assertIn(
         'pkg-b',
         self._run_cmd(bin_python, ['-m', 'pip', 'freeze'],
                       cwd=venv.path,
                       allow_fail=False)[0])
 def test_integration(self):
     # Test that we can:
     # - run sdist from the repo in a venv
     # - install the resulting tarball in a new venv
     # - pip install the repo
     # - pip install -e the repo
     # We don't break these into separate tests because we'd need separate
     # source dirs to isolate from side effects of running pip, and the
     # overheads of setup would start to beat the benefits of parallelism.
     self.useFixture(
         base.CapturedSubprocess('sync-req', [
             'python', 'update.py',
             os.path.join(REPODIR, self.short_name)
         ],
                                 cwd=os.path.join(REPODIR, 'requirements')))
     self.useFixture(
         base.CapturedSubprocess(
             'commit-requirements',
             'git diff --quiet || git commit -amrequirements',
             cwd=os.path.join(REPODIR, self.short_name),
             shell=True))
     path = os.path.join(
         self.useFixture(fixtures.TempDir()).path, 'project')
     self.useFixture(
         base.CapturedSubprocess(
             'clone',
             ['git', 'clone',
              os.path.join(REPODIR, self.short_name), path]))
     venv = self.useFixture(
         test_packaging.Venv('sdist',
                             modules=['pip', 'wheel', PBRVERSION],
                             pip_cmd=PIP_CMD))
     python = venv.python
     self.useFixture(
         base.CapturedSubprocess('sdist', [python, 'setup.py', 'sdist'],
                                 cwd=path))
     venv = self.useFixture(
         test_packaging.Venv('tarball',
                             modules=['pip', 'wheel', PBRVERSION],
                             pip_cmd=PIP_CMD))
     python = venv.python
     filename = os.path.join(path, 'dist',
                             os.listdir(os.path.join(path, 'dist'))[0])
     self.useFixture(
         base.CapturedSubprocess('tarball',
                                 [python] + PIP_CMD + [filename]))
     venv = self.useFixture(
         test_packaging.Venv('install-git',
                             modules=['pip', 'wheel', PBRVERSION],
                             pip_cmd=PIP_CMD))
     root = venv.path
     python = venv.python
     self.useFixture(
         base.CapturedSubprocess('install-git', [python] + PIP_CMD +
                                 ['git+file://' + path]))
     if self.short_name == 'nova':
         found = False
         for _, _, filenames in os.walk(root):
             if 'migrate.cfg' in filenames:
                 found = True
         self.assertTrue(found)
     venv = self.useFixture(
         test_packaging.Venv('install-e',
                             modules=['pip', 'wheel', PBRVERSION],
                             pip_cmd=PIP_CMD))
     root = venv.path
     python = venv.python
     self.useFixture(
         base.CapturedSubprocess('install-e',
                                 [python] + PIP_CMD + ['-e', path]))
    def test_integration(self):
        # Test that we can:
        # - run sdist from the repo in a venv
        # - install the resulting tarball in a new venv
        # - pip install the repo
        # - pip install -e the repo
        # We don't break these into separate tests because we'd need separate
        # source dirs to isolate from side effects of running pip, and the
        # overheads of setup would start to beat the benefits of parallelism.
        path = os.path.join(REPODIR, self.short_name)
        setup_cfg = os.path.join(path, 'setup.cfg')
        project_name = pkg_resources.safe_name(self.short_name).lower()
        # These projects should all have setup.cfg files but we'll be careful
        if os.path.exists(setup_cfg):
            config = configparser.ConfigParser()
            config.read(setup_cfg)
            if config.has_section('metadata'):
                raw_name = config.get('metadata',
                                      'name',
                                      fallback='notapackagename')
                # Technically we should really only need to use the raw
                # name because all our projects should be good and use
                # normalized names but they don't...
                project_name = pkg_resources.safe_name(raw_name).lower()
        constraints = os.path.join(REPODIR, 'requirements',
                                   'upper-constraints.txt')
        tmp_constraints = os.path.join(
            self.useFixture(fixtures.TempDir()).path, 'upper-constraints.txt')
        # We need to filter out the package we are installing to avoid
        # conflicts with the constraints.
        with open(constraints, 'r') as src:
            with open(tmp_constraints, 'w') as dest:
                for line in src:
                    constraint = line.split('===')[0]
                    if project_name != constraint:
                        dest.write(line)
        pip_cmd = PIP_CMD + ['-c', tmp_constraints]

        venv = self.useFixture(
            test_packaging.Venv('sdist',
                                modules=['pip', 'wheel', PBRVERSION],
                                pip_cmd=PIP_CMD))
        python = venv.python
        self.useFixture(
            base.CapturedSubprocess('sdist', [python, 'setup.py', 'sdist'],
                                    cwd=path))
        venv = self.useFixture(
            test_packaging.Venv('tarball',
                                modules=['pip', 'wheel', PBRVERSION],
                                pip_cmd=PIP_CMD))
        python = venv.python
        filename = os.path.join(path, 'dist',
                                os.listdir(os.path.join(path, 'dist'))[0])
        self.useFixture(
            base.CapturedSubprocess('tarball',
                                    [python] + pip_cmd + [filename]))
        venv = self.useFixture(
            test_packaging.Venv('install-git',
                                modules=['pip', 'wheel', PBRVERSION],
                                pip_cmd=PIP_CMD))
        root = venv.path
        python = venv.python
        self.useFixture(
            base.CapturedSubprocess('install-git', [python] + pip_cmd +
                                    ['git+file://' + path]))
        if self.short_name == 'nova':
            found = False
            for _, _, filenames in os.walk(root):
                if 'migrate.cfg' in filenames:
                    found = True
            self.assertTrue(found)
        venv = self.useFixture(
            test_packaging.Venv('install-e',
                                modules=['pip', 'wheel', PBRVERSION],
                                pip_cmd=PIP_CMD))
        root = venv.path
        python = venv.python
        self.useFixture(
            base.CapturedSubprocess('install-e',
                                    [python] + pip_cmd + ['-e', path]))