Update tests to correctly enter RequirementTracker context

This commit is contained in:
Pradyun Gedam 2019-11-06 15:38:02 +05:30
parent bb197e12bf
commit f39ce3439b
No known key found for this signature in database
GPG Key ID: DA17C4B29CB32E4B
1 changed files with 91 additions and 80 deletions

View File

@ -1,3 +1,4 @@
import contextlib
import os
import shutil
import sys
@ -61,6 +62,7 @@ class TestRequirementSet(object):
def teardown(self):
shutil.rmtree(self.tempdir, ignore_errors=True)
@contextlib.contextmanager
def _basic_resolver(self, finder, require_hashes=False):
make_install_req = partial(
install_req_from_req_string,
@ -68,26 +70,28 @@ class TestRequirementSet(object):
wheel_cache=None,
use_pep517=None,
)
preparer = RequirementPreparer(
build_dir=os.path.join(self.tempdir, 'build'),
src_dir=os.path.join(self.tempdir, 'src'),
download_dir=None,
wheel_download_dir=None,
progress_bar="on",
build_isolation=True,
req_tracker=get_requirement_tracker(),
session=PipSession(),
finder=finder,
require_hashes=require_hashes,
)
return Resolver(
preparer=preparer,
make_install_req=make_install_req,
finder=finder,
use_user_site=False, upgrade_strategy="to-satisfy-only",
ignore_dependencies=False, ignore_installed=False,
ignore_requires_python=False, force_reinstall=False,
)
with get_requirement_tracker() as tracker:
preparer = RequirementPreparer(
build_dir=os.path.join(self.tempdir, 'build'),
src_dir=os.path.join(self.tempdir, 'src'),
download_dir=None,
wheel_download_dir=None,
progress_bar="on",
build_isolation=True,
req_tracker=tracker,
session=PipSession(),
finder=finder,
require_hashes=require_hashes,
)
yield Resolver(
preparer=preparer,
make_install_req=make_install_req,
finder=finder,
use_user_site=False, upgrade_strategy="to-satisfy-only",
ignore_dependencies=False, ignore_installed=False,
ignore_requires_python=False, force_reinstall=False,
)
def test_no_reuse_existing_build_dir(self, data):
"""Test prepare_files raise exception with previous build dir"""
@ -101,14 +105,14 @@ class TestRequirementSet(object):
req.is_direct = True
reqset.add_requirement(req)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
assert_raises_regexp(
PreviousBuildDirError,
r"pip can't proceed with [\s\S]*%s[\s\S]*%s" %
(req, build_dir.replace('\\', '\\\\')),
resolver.resolve,
reqset,
)
with self._basic_resolver(finder) as resolver:
assert_raises_regexp(
PreviousBuildDirError,
r"pip can't proceed with [\s\S]*%s[\s\S]*%s" %
(req, build_dir.replace('\\', '\\\\')),
resolver.resolve,
reqset,
)
# TODO: Update test when Python 2.7 is dropped.
def test_environment_marker_extras(self, data):
@ -123,8 +127,8 @@ class TestRequirementSet(object):
req.is_direct = True
reqset.add_requirement(req)
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder)
resolver.resolve(reqset)
with self._basic_resolver(finder) as resolver:
resolver.resolve(reqset)
# This is hacky but does test both case in py2 and py3
if sys.version_info[:2] == (2, 7):
assert reqset.has_requirement('simple')
@ -141,17 +145,17 @@ class TestRequirementSet(object):
))
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder, require_hashes=True)
assert_raises_regexp(
HashErrors,
r'Hashes are required in --require-hashes mode, but they are '
r'missing .*\n'
r' simple==1.0 --hash=sha256:393043e672415891885c9a2a0929b1af95'
r'fb866d6ca016b42d2e6ce53619b653$',
resolver.resolve,
reqset
)
with self._basic_resolver(finder, require_hashes=True) as resolver:
assert_raises_regexp(
HashErrors,
r'Hashes are required in --require-hashes mode, but they are '
r'missing .*\n'
r' simple==1.0 --hash=sha256:393043e672415891885c9a2a0929b1af95'
r'fb866d6ca016b42d2e6ce53619b653$',
resolver.resolve,
reqset
)
def test_missing_hash_with_require_hashes_in_reqs_file(self, data, tmpdir):
"""--require-hashes in a requirements file should make its way to the
@ -187,22 +191,25 @@ class TestRequirementSet(object):
lineno=2,
))
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder, require_hashes=True)
sep = os.path.sep
if sep == '\\':
sep = '\\\\' # This needs to be escaped for the regex
assert_raises_regexp(
HashErrors,
r"Can't verify hashes for these requirements because we don't "
r"have a way to hash version control repositories:\n"
r" git\+git://github\.com/pypa/pip-test-package \(from -r file "
r"\(line 1\)\)\n"
r"Can't verify hashes for these file:// requirements because they "
r"point to directories:\n"
r" file://.*{sep}data{sep}packages{sep}FSPkg "
r"\(from -r file \(line 2\)\)".format(sep=sep),
resolver.resolve,
reqset)
with self._basic_resolver(finder, require_hashes=True) as resolver:
assert_raises_regexp(
HashErrors,
r"Can't verify hashes for these requirements because we don't "
r"have a way to hash version control repositories:\n"
r" git\+git://github\.com/pypa/pip-test-package \(from -r file "
r"\(line 1\)\)\n"
r"Can't verify hashes for these file:// requirements because they "
r"point to directories:\n"
r" file://.*{sep}data{sep}packages{sep}FSPkg "
r"\(from -r file \(line 2\)\)".format(sep=sep),
resolver.resolve,
reqset,
)
def test_unpinned_hash_checking(self, data):
"""Make sure prepare_files() raises an error when a requirement is not
@ -221,15 +228,16 @@ class TestRequirementSet(object):
lineno=2,
))
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder, require_hashes=True)
assert_raises_regexp(
HashErrors,
# Make sure all failing requirements are listed:
r'versions pinned with ==. These do not:\n'
r' simple .* \(from -r file \(line 1\)\)\n'
r' simple2>1.0 .* \(from -r file \(line 2\)\)',
resolver.resolve,
reqset)
with self._basic_resolver(finder, require_hashes=True) as resolver:
assert_raises_regexp(
HashErrors,
# Make sure all failing requirements are listed:
r'versions pinned with ==. These do not:\n'
r' simple .* \(from -r file \(line 1\)\)\n'
r' simple2>1.0 .* \(from -r file \(line 2\)\)',
resolver.resolve,
reqset,
)
def test_hash_mismatch(self, data):
"""A hash mismatch should raise an error."""
@ -240,36 +248,39 @@ class TestRequirementSet(object):
'%s --hash=sha256:badbad' % file_url, lineno=1,
))
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder, require_hashes=True)
assert_raises_regexp(
HashErrors,
r'THESE PACKAGES DO NOT MATCH THE HASHES.*\n'
r' file:///.*/data/packages/simple-1\.0\.tar\.gz .*:\n'
r' Expected sha256 badbad\n'
r' Got 393043e672415891885c9a2a0929b1af95fb866d'
r'6ca016b42d2e6ce53619b653$',
resolver.resolve,
reqset)
with self._basic_resolver(finder, require_hashes=True) as resolver:
assert_raises_regexp(
HashErrors,
r'THESE PACKAGES DO NOT MATCH THE HASHES.*\n'
r' file:///.*/data/packages/simple-1\.0\.tar\.gz .*:\n'
r' Expected sha256 badbad\n'
r' Got 393043e672415891885c9a2a0929b1af95fb866d'
r'6ca016b42d2e6ce53619b653$',
resolver.resolve,
reqset,
)
def test_unhashed_deps_on_require_hashes(self, data):
"""Make sure unhashed, unpinned, or otherwise unrepeatable
dependencies get complained about when --require-hashes is on."""
reqset = RequirementSet()
finder = make_test_finder(find_links=[data.find_links])
resolver = self._basic_resolver(finder, require_hashes=True)
reqset.add_requirement(get_processed_req_from_line(
'TopoRequires2==0.0.1 ' # requires TopoRequires
'--hash=sha256:eaf9a01242c9f2f42cf2bd82a6a848cd'
'e3591d14f7896bdbefcf48543720c970',
lineno=1
))
assert_raises_regexp(
HashErrors,
r'In --require-hashes mode, all requirements must have their '
r'versions pinned.*\n'
r' TopoRequires from .*$',
resolver.resolve,
reqset)
with self._basic_resolver(finder, require_hashes=True) as resolver:
assert_raises_regexp(
HashErrors,
r'In --require-hashes mode, all requirements must have their '
r'versions pinned.*\n'
r' TopoRequires from .*$',
resolver.resolve,
reqset,
)
def test_hashed_deps_on_require_hashes(self):
"""Make sure hashed dependencies get installed when --require-hashes