|
6 | 6 | import pex.third_party.pkg_resources as pkg_resources
|
7 | 7 | from pex.interpreter import PythonInterpreter
|
8 | 8 | from pex.iterator import Iterator
|
9 |
| -from pex.package import Package, SourcePackage |
| 9 | +from pex.package import Package, SourcePackage, WheelPackage |
10 | 10 | from pex.resolvable import (
|
11 | 11 | Resolvable,
|
12 | 12 | ResolvableDirectory,
|
@@ -121,3 +121,26 @@ def test_resolvable_is_constraint_getter_setter():
|
121 | 121 | assert req.is_constraint is False
|
122 | 122 | req.is_constraint = True
|
123 | 123 | assert req.is_constraint is True
|
| 124 | + |
| 125 | + |
| 126 | +def test_deterministic_packages_from_multiple_crawlers(): |
| 127 | + req = 'protobuf==3.9.1' |
| 128 | + options_builder = ResolverOptionsBuilder(precedence=(WheelPackage,)) |
| 129 | + resolvable = ResolvableRequirement.from_string(req, options_builder) |
| 130 | + |
| 131 | + pypi_source = Package.from_href('https://pypi.org/simple/protobuf/protobuf-3.9.1.tar.gz') |
| 132 | + pypi_wheel = Package.from_href( |
| 133 | + 'https://pypi.org/simple/protobuf/protobuf-3.9.1-py2.py3-none-any.whl') |
| 134 | + internal_wheel = Package.from_href( |
| 135 | + 'https://packages.internal.example/simple/protobuf/protobuf-3.9.1-py2.py3-none-any.whl') |
| 136 | + |
| 137 | + # Multiple fetchers with equally-preferred packages should result in the same package every time, |
| 138 | + # regardless the order that crawlers returned them. |
| 139 | + mock_iterator = mock.create_autospec(Iterator, spec_set=True) |
| 140 | + mock_iterator.iter.return_value = iter([pypi_source, pypi_wheel, internal_wheel]) |
| 141 | + url_order_one = [r.url for r in resolvable.compatible(mock_iterator)] |
| 142 | + |
| 143 | + mock_iterator.iter.return_value = iter([pypi_source, internal_wheel, pypi_wheel]) |
| 144 | + url_order_two = [r.url for r in resolvable.compatible(mock_iterator)] |
| 145 | + |
| 146 | + assert url_order_one == url_order_two |
0 commit comments