@@ -67,7 +67,7 @@ def test_backjumps_after_partial_satisfier(
67
67
add_to_repo (repo , "y" , "1.0.0" )
68
68
add_to_repo (repo , "y" , "2.0.0" )
69
69
70
- check_solver_result (root , provider , {"c" : "1.0.0" , "y" : "2.0.0" }, tries = 2 )
70
+ check_solver_result (root , provider , {"c" : "1.0.0" , "y" : "2.0.0" }, tries = 4 )
71
71
72
72
73
73
def test_rolls_back_leaf_versions_first (
@@ -132,32 +132,6 @@ def test_backjump_to_nearer_unsatisfied_package(
132
132
)
133
133
134
134
135
- def test_traverse_into_package_with_fewer_versions_first (
136
- root : ProjectPackage , provider : Provider , repo : Repository
137
- ) -> None :
138
- # Dependencies are ordered so that packages with fewer versions are tried
139
- # first. Here, there are two valid solutions (either a or b must be
140
- # downgraded once). The chosen one depends on which dep is traversed first.
141
- # Since b has fewer versions, it will be traversed first, which means a will
142
- # come later. Since later selections are revised first, a gets downgraded.
143
- root .add_dependency (Factory .create_dependency ("a" , "*" ))
144
- root .add_dependency (Factory .create_dependency ("b" , "*" ))
145
-
146
- add_to_repo (repo , "a" , "1.0.0" , deps = {"c" : "*" })
147
- add_to_repo (repo , "a" , "2.0.0" , deps = {"c" : "*" })
148
- add_to_repo (repo , "a" , "3.0.0" , deps = {"c" : "*" })
149
- add_to_repo (repo , "a" , "4.0.0" , deps = {"c" : "*" })
150
- add_to_repo (repo , "a" , "5.0.0" , deps = {"c" : "1.0.0" })
151
- add_to_repo (repo , "b" , "1.0.0" , deps = {"c" : "*" })
152
- add_to_repo (repo , "b" , "2.0.0" , deps = {"c" : "*" })
153
- add_to_repo (repo , "b" , "3.0.0" , deps = {"c" : "*" })
154
- add_to_repo (repo , "b" , "4.0.0" , deps = {"c" : "2.0.0" })
155
- add_to_repo (repo , "c" , "1.0.0" )
156
- add_to_repo (repo , "c" , "2.0.0" )
157
-
158
- check_solver_result (root , provider , {"a" : "4.0.0" , "b" : "4.0.0" , "c" : "2.0.0" })
159
-
160
-
161
135
def test_backjump_past_failed_package_on_disjoint_constraint (
162
136
root : ProjectPackage , provider : Provider , repo : Repository
163
137
) -> None :
@@ -176,3 +150,57 @@ def test_backjump_past_failed_package_on_disjoint_constraint(
176
150
add_to_repo (repo , "foo" , "2.0.4" )
177
151
178
152
check_solver_result (root , provider , {"a" : "1.0.0" , "foo" : "2.0.4" })
153
+
154
+
155
+ def test_backtracking_performance_level_1 (
156
+ root : ProjectPackage , provider : Provider , repo : Repository
157
+ ) -> None :
158
+ """
159
+ This test takes quite long if an unfavorable heuristics is chosen
160
+ to select the next package to resolve.
161
+
162
+ B depends on A, but does not support the latest version of A.
163
+ B has a lot more versions than A.
164
+
165
+ Test for boto3/botocore vs. urllib3 issue in its simple form.
166
+ """
167
+ root .add_dependency (Factory .create_dependency ("a" , "*" ))
168
+ root .add_dependency (Factory .create_dependency ("b" , "*" ))
169
+
170
+ add_to_repo (repo , "a" , "1" )
171
+ add_to_repo (repo , "a" , "2" )
172
+
173
+ b_max = 500
174
+ for i in range (1 , b_max + 1 ):
175
+ add_to_repo (repo , "b" , str (i ), deps = {"a" : "<=1" })
176
+
177
+ check_solver_result (root , provider , {"a" : "1" , "b" : str (b_max )})
178
+
179
+
180
+ def test_backtracking_performance_level_2 (
181
+ root : ProjectPackage , provider : Provider , repo : Repository
182
+ ) -> None :
183
+ """
184
+ Similar to test_backtracking_performance_level_1,
185
+ but with one more level of dependencies.
186
+
187
+ C depends on B depends on A, but B does not support the latest version of A.
188
+ The root dependency only requires A and C so there is no direct dependency between
189
+ these two.
190
+ B and C have a lot more versions than A.
191
+
192
+ Test for boto3/botocore vs. urllib3 issue in its more complex form.
193
+ """
194
+ root .add_dependency (Factory .create_dependency ("a" , "*" ))
195
+ root .add_dependency (Factory .create_dependency ("c" , "*" ))
196
+
197
+ add_to_repo (repo , "a" , "1" )
198
+ add_to_repo (repo , "a" , "2" )
199
+
200
+ bc_max = 500
201
+ for i in range (1 , bc_max + 1 ):
202
+ add_to_repo (repo , "b" , str (i ), deps = {"a" : "<=1" })
203
+ for i in range (1 , bc_max + 1 ):
204
+ add_to_repo (repo , "c" , str (i ), deps = {"b" : f"<={ i } " })
205
+
206
+ check_solver_result (root , provider , {"a" : "1" , "b" : str (bc_max ), "c" : str (bc_max )})
0 commit comments