source: yum/trunk/test/skipbroken-tests.py@ 1569

Last change on this file since 1569 was 516, checked in by Yuri Dario, 11 years ago

yum: update trunk to 3.4.3.

  • Property svn:eol-style set to native
File size: 32.5 KB
Line 
1import unittest
2import logging
3import sys
4import re
5from testbase import *
6
7REGEX_PKG = re.compile(r"(\d*):?(.*)-(.*)-(.*)\.(.*)$")
8
9class SkipBrokenTests(DepsolveTests):
10 ''' Test cases to test skip-broken'''
11
12 def setUp(self):
13 DepsolveTests.setUp(self)
14 self.xrepo = FakeRepo("TestRepository", self.xsack)
15 setup_logging()
16
17 def repoPackage(self, name, version='1', release='0', epoch='0', arch='noarch'):
18 po = FakePackage(name, version, release, epoch, arch, repo=self.xrepo)
19 self.xsack.addPackage(po)
20 return po
21
22 def instPackage(self, name, version='1', release='0', epoch='0', arch='noarch'):
23 po = FakePackage(name, version, release, epoch, arch, repo=self.repo)
24 self.rpmdb.addPackage(po)
25 return po
26
27 def _pkgstr_to_nevra(self, pkg_str):
28 '''
29 Get a nevra from from a epoch:name-version-release.arch string
30 @param pkg_str: package string
31 '''
32 res = REGEX_PKG.search(pkg_str)
33 if res:
34 (e,n,v,r,a) = res.groups()
35 if e == "":
36 e = "0"
37 return (n,e,v,r,a)
38 else:
39 raise AttributeError("Illegal package string : %s" % pkg_str)
40
41 def repoString(self, pkg_str):
42 '''
43 Add an available package from a epoch:name-version-release.arch string
44 '''
45 (n,e,v,r,a) = self._pkgstr_to_nevra(pkg_str)
46 return self.repoPackage(n,v,r,e,a)
47
48
49 def instString(self, pkg_str):
50 '''
51 Add an installed package from a epoch:name-version-release.arch string
52 '''
53 (n,e,v,r,a) = self._pkgstr_to_nevra(pkg_str)
54 return self.instPackage(n,v,r,e,a)
55
56
57 def testMissingReqNoSkip(self):
58 ''' install fails, because of missing req.
59 bar fails because foobar is not provided '''
60 po = self.repoPackage('foo', '1')
61 po.addRequires('bar', None, (None,None,None))
62 self.tsInfo.addInstall(po)
63
64 xpo = self.repoPackage('bar', '1')
65 xpo.addRequires('foobar', None, (None,None,None))
66
67 self.assertEquals('err', *self.resolveCode(skip=False))
68 self.assertResult((po,xpo))
69
70 def testMissingReqSkip(self):
71 ''' install is skipped, because of missing req.
72 foo + bar is skipped, because foobar is not provided '''
73 po = self.repoPackage('foo', '1')
74 po.addRequires('bar', None, (None,None,None))
75 self.tsInfo.addInstall(po)
76
77 xpo = self.repoPackage('bar', '1')
78 xpo.addRequires('foobar', None, (None,None,None))
79
80 self.assertEquals('empty', *self.resolveCode(skip=True))
81 self.assertResult([])
82
83 def testDepWithMissingReqSkip(self):
84 ''' install is skipped, beacuse dep is missing req.
85 foo + foobar is skipped because barfoo is not provided
86 bar stays in the transaction
87 '''
88 po1 = self.repoPackage('foo', '1')
89 po1.addRequires('foobar', None, (None,None,None))
90 self.tsInfo.addInstall(po1)
91
92 po2 = self.repoPackage('bar', '1')
93 self.tsInfo.addInstall(po2)
94
95 xpo1 = self.repoPackage('foobar', '1')
96 xpo1.addRequires('barfoo', None, (None,None,None))
97
98 self.assertEquals('ok', *self.resolveCode(skip=True))
99 self.assertResult([po2])
100
101 def testUpdateOldRequired(self):
102 ''' update breaking req. of installed package is skipped
103 foo-1.0 -> foo-2.0 breaks the installed foo-tools needing foo-1.0
104 so skip the update and we have and empty transaction
105 '''
106 # FIXME: The right solution is to skip the update from the transaction
107
108 po1 = self.instPackage('foo', '1')
109 po2 = self.repoPackage('foo', '2')
110
111 ipo = self.instPackage('foo-tools', '2.5')
112 ipo.addRequires('foo', 'EQ', ('0', '1', '0'))
113
114 self.tsInfo.addUpdate(po2, oldpo=po1)
115
116 self.assertEquals('empty', *self.resolveCode(skip=True))
117 self.assertResult([ipo, po1])
118
119 def testUpdateRequireOld(self):
120 '''update with missing req. is skipped
121 The foo-1.0 -> foo-2.0 update fails, because foo-tools-2.0 need by foo-2.0
122 is not provided, the update should be skipped and result in a empty transaction
123 '''
124 po1 = self.instPackage('foo', '1')
125 po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
126 po2 = self.repoPackage('foo', '2')
127 po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
128
129 ipo = self.instPackage('foo-tools', '1')
130
131 self.tsInfo.addUpdate(po2, oldpo=po1)
132
133
134 self.assertEquals('empty', *self.resolveCode(skip=True))
135 self.assertResult([ipo, po1])
136
137 def testUpdateRequireBoth(self):
138 ''' install + update skipped, because of missing req.
139 foo-1.0 -> foo-2.0 update, fails because foo-tools-2.0, needed by foo-2.0 is not provided.
140 foo-2.0 update get skip, and the foo-gui install will get skipped too, because it need foo-2.0
141 there is not longer provided.
142 '''
143 po1 = self.instPackage('foo', '1')
144 po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
145 po2 = self.repoPackage('foo', '2')
146 po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
147
148 ipo = self.instPackage('foo-tools', '1')
149 por = self.repoPackage('foo-gui', '1')
150 por.addRequires('foo', 'EQ', ('0', '2', '0'))
151
152 self.tsInfo.addUpdate(po2, oldpo=po1)
153 self.tsInfo.addInstall(por)
154
155 self.assertEquals('empty', *self.resolveCode(skip=True))
156 self.assertResult([ipo, po1])
157
158 def testEraseDep(self):
159 ''' remove a package that someone depends on
160 foo is removed, and foo-tools get removed too, because it
161 depends on foo
162 '''
163 ipo = self.instPackage('foo', '1')
164 ipo2 = self.instPackage('foo-tools', '1')
165 ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
166
167 self.tsInfo.addErase(ipo)
168 self.assertEquals('ok', *self.resolveCode(skip=True))
169 self.assertResult([])
170
171 def testEraseReqByUpdateNoSkip(self):
172 ''' update fails, because a req is erased.
173 Update foo-tools-1.0 -> foo-tools-2.0, should fail because the require foo is removed
174 '''
175 ipo = self.instPackage('foo', '1')
176 ipo2 = self.instPackage('foo-tools', '1')
177 ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
178
179 upo2 = self.repoPackage('foo-tools', '2')
180 upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
181
182 self.tsInfo.addErase(ipo)
183 self.tsInfo.addUpdate(upo2, oldpo=ipo2)
184
185 self.assertEquals('err', *self.resolveCode(skip=False))
186
187 def testEraseReqByUpdateSkip(self):
188 ''' update is skipped, because a req is erased.
189 Update foo-tools-1.0 -> foo-tools-2.0, should fail because the require foo is removed
190 the update is skipped and foo-tools-1.0 is removed too, because it requires foo.
191 '''
192 ipo = self.instPackage('foo', '1')
193 ipo2 = self.instPackage('foo-tools', '1')
194 ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
195
196 upo2 = self.repoPackage('foo-tools', '2')
197 upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
198
199 self.tsInfo.addUpdate(upo2, oldpo=ipo2)
200 self.tsInfo.addErase(ipo)
201
202 self.assertEquals('ok', *self.resolveCode(skip=True))
203 self.assertResult([])
204
205 def testConflictWithInstalled(self):
206 ''' update fails, because it conflicts with installed
207 foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
208 the update get skipped and the transaction is now empty
209 '''
210 po1 = self.instPackage('foo', '1')
211 po2 = self.repoPackage('foo', '2')
212 po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
213
214 ipo = self.instPackage('bar', '1')
215
216 self.tsInfo.addUpdate(po2, oldpo=po1)
217
218 self.assertEquals('empty', *self.resolveCode(skip=True))
219 self.assertResult([ipo, po1])
220
221 def testConflictWithInstalledButUpdateExist(self):
222 ''' update fails, because conflict cant be fixed. (req. loop)
223 foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
224 bar-1.0 is update to bar-2.0, to solve the conflict but bar-2.0 need foo-1.0
225 so the foo & bar updates get skipped and the transaction is empty
226 '''
227 po1 = self.instPackage('foo', '1')
228 po2 = self.repoPackage('foo', '2')
229 po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
230
231 ipo = self.instPackage('bar', '1')
232
233
234 xpo = self.repoPackage('bar', '2')
235 xpo.addRequires('foo', 'EQ', ('0', '1', '0'))
236
237 self.tsInfo.addUpdate(po2, oldpo=po1)
238
239 self.assertEquals('empty', *self.resolveCode(skip=True))
240 self.assertResult([po1,ipo])
241
242 def testConflictWithInstalledButUpdateExist2(self):
243 '''update fails, because conflict cant be fixed. (missing req.)
244 foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
245 bar-1.0 is update to bar-2.0, to solve the conflict but bar-2.0 need poo-1.0
246 there is not provided
247 So the foo & bar updates get skipped and the transaction is empty
248 '''
249 po1 = self.instPackage('foo', '1')
250 po2 = self.repoPackage('foo', '2')
251 po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
252
253 ipo = self.instPackage('bar', '1')
254
255
256 xpo = self.repoPackage('bar', '2')
257 xpo.addRequires('poo', 'EQ', ('0', '1', '0'))
258
259 self.tsInfo.addUpdate(po2, oldpo=po1)
260
261 self.assertEquals('empty', *self.resolveCode(skip=True))
262 self.assertResult([po1,ipo])
263
264 def testAlternativePackageAvailable(self):
265 ipo = self.repoPackage('foo')
266 ipo.addRequires('bar')
267 provides1 = self.repoPackage('bar')
268 provides1.addRequires('baz')
269 provides2 = self.repoPackage('bar-ng')
270 provides2.addProvides('bar')
271 #provides2.addRequires('baz')
272
273 self.tsInfo.addInstall(ipo)
274
275 self.assertEquals('ok', *self.resolveCode(skip=True))
276 self.assertResult([ipo, provides2])
277
278 def testOnlyOneRequirementAvailable(self):
279 ipo = self.repoPackage('foo')
280 ipo.addRequires('bar')
281 ipo.addRequires('baz')
282
283 ppo = self.repoPackage('baz')
284
285 self.tsInfo.addInstall(ipo)
286
287 self.assertEquals('empty', *self.resolveCode(skip=True))
288 self.assertResult([])
289
290 def test2PkgReqSameDep(self):
291 po1 = self.repoPackage('foo')
292 po1.addRequires('bar')
293 po1.addRequires('foobar')
294 po2 = self.repoPackage('bar')
295 po2.addRequires('zzzz')
296 po3 = self.repoPackage('barfoo')
297 po3.addRequires('foobar')
298 po4 = self.repoPackage('foobar')
299 self.tsInfo.addInstall(po1)
300 self.tsInfo.addInstall(po3)
301
302 self.assertEquals('ok', *self.resolveCode(skip=True))
303 self.assertResult([po3,po4])
304
305 def testProvidesAndDepsGetRemoved(self):
306 po1 = self.repoPackage('Spaceman')
307 po1.addProvides('money')
308 po2 = self.repoPackage('GutlessGibbon')
309 po2.addRequires('money')
310 po2.addRequires('nice')
311 po2.addRequires('features')
312 self.tsInfo.addInstall(po2)
313 self.assertEquals('empty', *self.resolveCode(skip=True))
314
315 def testSecondStepRequiresUpdate(self):
316 po1 = self.repoPackage('foo')
317 po1.addRequires('xxx')
318 po1.addRequires('bar')
319 self.tsInfo.addInstall(po1)
320
321 po2 = self.repoPackage('bar')
322 po2.addRequires('baz', 'EQ', (None, '2', '1'))
323
324 ipo = self.instPackage('baz')
325 upo = self.repoPackage('baz', '2', '1')
326
327 self.assertEquals('empty', *self.resolveCode(skip=True))
328 self.assertResult([ipo])
329
330
331 def testDepCycle1(self):
332 po0 = self.repoPackage('leaf')
333
334 po1 = self.repoPackage('foo')
335 po1.addRequires('bar')
336 po1.addRequires('xxx')
337 po2 = self.repoPackage('bar')
338 po2.addRequires('baz')
339 po3 = self.repoPackage('baz')
340 po3.addRequires('foo')
341 po3.addRequires('leaf')
342
343 self.tsInfo.addInstall(po1)
344
345 self.assertEquals('empty', *self.resolveCode(skip=True))
346
347 def testDepCycle2(self):
348 po0 = self.repoPackage('leaf')
349
350 po1 = self.repoPackage('foo')
351 po1.addRequires('bar')
352 po2 = self.repoPackage('bar')
353 po2.addRequires('baz')
354 po2.addRequires('xxx')
355 po3 = self.repoPackage('baz')
356 po3.addRequires('foo')
357 po3.addRequires('leaf')
358
359 self.tsInfo.addInstall(po1)
360
361 self.assertEquals('empty', *self.resolveCode(skip=True))
362
363 def testDepCycle3(self):
364 po0 = self.repoPackage('leaf')
365
366 po1 = self.repoPackage('foo')
367 po1.addRequires('bar')
368 po2 = self.repoPackage('bar')
369 po2.addRequires('baz')
370 po3 = self.repoPackage('baz')
371 po3.addRequires('foo')
372 po3.addRequires('leaf')
373 po3.addRequires('xxx')
374
375 self.tsInfo.addInstall(po1)
376
377 self.assertEquals('empty', *self.resolveCode(skip=True))
378
379 def testMultiLibUpdate(self):
380 '''
381 foo-1.i386 & foo-1.x86_64 is updated by foo-2.i386 & foo-2.x86_64
382 foo-2.x86_64 has a missing req, and gets skipped, foo-2.i386 has to be
383 skipped too or it will fail in the rpm test transaction
384 '''
385 ipo1 = self.instPackage('foo', '1',arch='i386')
386 ipo2 = self.instPackage('foo', '1',arch='x86_64')
387 po1 = self.repoPackage('foo', '2',arch='i386')
388 po2 = self.repoPackage('foo', '2',arch='x86_64')
389 po2.addRequires('notfound', 'EQ', ('0', '1', '0'))
390 self.tsInfo.addUpdate(po1, oldpo=ipo1)
391 self.tsInfo.addUpdate(po2, oldpo=ipo2)
392 self.assertEquals('empty', *self.resolveCode(skip=True))
393 self.assertResult([ipo1,ipo2])
394
395 def testInstReqOldVer1(self):
396 """
397 zap-2.0 updates zap-1.0, but zap-2.0 needs barlib-2.0 provided by
398 bar-2.0, but the installed foo, needs barlib-1.0, so it need to be updated to
399 foo-2.0, that requires barlib-2.0
400 But it only work if foo-1.0 -> foo-2.0 is added as an update, it is not
401 pulled in by it self.
402 """
403 ipo1 = self.instPackage('foo', '1')
404 ipo1.addRequires('barlib', 'EQ', ('0', '1', '0'))
405 ipo2 = self.instPackage('bar', '1')
406 ipo2.addProvides('barlib', 'EQ', ('0', '1', '0'))
407 ipo3 = self.instPackage('zap', '1')
408 po1 = self.repoPackage('foo', '2')
409 po1.addRequires('barlib', 'EQ', ('0', '2', '0'))
410 po2 = self.repoPackage('bar', '2')
411 po2.addProvides('barlib', 'EQ', ('0', '2', '0'))
412 po3 = self.repoPackage('zap', '2')
413 po3.addRequires('barlib', 'EQ', ('0', '2', '0'))
414 #FIXME: Find out why this line is needed, it should be auto updated by the solver.
415 self.tsInfo.addUpdate(po1, oldpo=ipo1) # why is this needed, it should work without ?
416 self.tsInfo.addUpdate(po3, oldpo=ipo3)
417 self.assertEquals('ok', *self.resolveCode(skip=True))
418 self.assertResult([po1,po2,po3])
419
420
421 def testBumpedSoName1(self):
422 """
423 d2 need a lib from b1, so the update fails.
424 d2 and b2 get skipped, but the installed b1 needs a
425 lib from a1, but it has been updated to a2, so it is
426 no longer there. so a2 needs to be skipped to
427 """
428 a1 = self.instPackage('a', '1', arch='x86_64')
429 a1.addProvides("liba.so.1()(64bit)")
430 a2 = self.repoPackage('a', '2', arch='x86_64')
431 a2.addProvides("liba.so.2()(64bit)")
432
433 b1 = self.instPackage('b', '1', arch='x86_64')
434 b1.addProvides("libb.so.1()(64bit)")
435 b1.addRequires("liba.so.1()(64bit)")
436 b2 = self.repoPackage('b', '2', arch='x86_64')
437 b2.addProvides("libb.so.2()(64bit)")
438 b2.addRequires("liba.so.2()(64bit)")
439
440 c1 = self.instPackage('c', '1', arch='x86_64')
441 c1.addRequires("liba.so.1()(64bit)")
442 c2 = self.repoPackage('c', '2', arch='x86_64')
443 c2.addRequires("liba.so.2()(64bit)")
444
445 d1 = self.instPackage('d', '1', arch='x86_64')
446 d1.addRequires("libb.so.1()(64bit)")
447 d2 = self.repoPackage('d', '2', arch='x86_64')
448 d2.addRequires("libb.so.1()(64bit)")
449
450 e1 = self.instPackage('e', '1', arch='x86_64')
451 e2 = self.repoPackage('e', '2', arch='x86_64')
452
453 f1 = self.instPackage('f', '1', arch='x86_64')
454 f2 = self.repoPackage('f', '2', arch='x86_64')
455
456 self.tsInfo.addUpdate(a2, oldpo=a1)
457 self.tsInfo.addUpdate(b2, oldpo=b1)
458 self.tsInfo.addUpdate(c2, oldpo=c1)
459 self.tsInfo.addUpdate(d2, oldpo=d1)
460 self.tsInfo.addUpdate(e2, oldpo=e1)
461 self.tsInfo.addUpdate(f2, oldpo=f1)
462 self.assertEquals('ok', *self.resolveCode(skip=True))
463 self.assertResult([a1,b1,c1,d1,e2,f2])
464
465 def testBumpedSoName2(self):
466 """
467 https://bugzilla.redhat.com/show_bug.cgi?id=468785
468 """
469 c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18")
470 c1.addRequires("libdb-4.3.so")
471
472 d1 = self.instPackage('compat-db', '4.6.21',"4")
473 d1.addProvides("libdb-4.3.so")
474 od1 = self.repoPackage('compat-db46', '4.6.21',"5")
475 od1.addProvides("libdb-4.6.so")
476 od1.addObsoletes("compat-db")
477 od2 = self.repoPackage('compat-db45', '4.6.21',"5")
478 od2.addProvides("libdb-4.5.so")
479 od2.addObsoletes("compat-db")
480
481 r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3')
482 r1.addRequires("libdb-4.5.so")
483 r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3')
484 r2.addRequires("libdb-4.5.so")
485 r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3')
486 r3.addRequires("libdb-4.5.so")
487 r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3')
488 r4.addRequires("libdb-4.5.so")
489
490 ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5')
491 ur1.addRequires("libdb-4.5.so")
492 ur1.addRequires("compat-db45")
493 ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5')
494 ur2.addRequires("libdb-4.5.so")
495 ur2.addRequires("compat-db45")
496 ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5')
497 ur3.addRequires("libdb-4.5.so")
498 ur3.addRequires("compat-db45")
499 ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5')
500 ur4.addRequires("libdb-4.5.so")
501 ur4.addRequires("compat-db45")
502
503 self.tsInfo.addObsoleting(od2, oldpo=d1)
504 self.tsInfo.addObsoleted(d1, od2)
505 self.tsInfo.addObsoleting(od1, oldpo=d1)
506 self.tsInfo.addObsoleted(d1, od1)
507 self.tsInfo.addUpdate(ur1, oldpo=r1)
508 self.tsInfo.addUpdate(ur2, oldpo=r2)
509 self.tsInfo.addUpdate(ur3, oldpo=r3)
510 self.tsInfo.addUpdate(ur4, oldpo=r4)
511
512 self.assertEquals('empty', *self.resolveCode(skip=True))
513 self.assertResult([c1,d1,r1,r2,r3,r4])
514
515 def testBumpedSoName3(self):
516 """
517 https://bugzilla.redhat.com/show_bug.cgi?id=468785
518 yum update compat-db46
519 """
520 c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18")
521 c1.addRequires("libdb-4.3.so")
522
523 d1 = self.instPackage('compat-db', '4.6.21',"4")
524 d1.addProvides("libdb-4.3.so")
525 od1 = self.repoPackage('compat-db46', '4.6.21',"5")
526 od1.addProvides("libdb-4.6.so")
527 od1.addObsoletes("compat-db")
528 od2 = self.repoPackage('compat-db45', '4.6.21',"5")
529 od2.addProvides("libdb-4.5.so")
530 od2.addObsoletes("compat-db")
531
532 r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3')
533 r1.addRequires("libdb-4.5.so")
534 r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3')
535 r2.addRequires("libdb-4.5.so")
536 r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3')
537 r3.addRequires("libdb-4.5.so")
538 r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3')
539 r4.addRequires("libdb-4.5.so")
540
541 ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5')
542 ur1.addRequires("libdb-4.5.so")
543 ur1.addRequires("compat-db45")
544 ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5')
545 ur2.addRequires("libdb-4.5.so")
546 ur2.addRequires("compat-db45")
547 ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5')
548 ur3.addRequires("libdb-4.5.so")
549 ur3.addRequires("compat-db45")
550 ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5')
551 ur4.addRequires("libdb-4.5.so")
552 ur4.addRequires("compat-db45")
553
554 self.tsInfo.addObsoleting(od1, oldpo=d1)
555 self.tsInfo.addObsoleted(d1, od1)
556 self.tsInfo.addUpdate(ur1, oldpo=r1)
557 self.tsInfo.addUpdate(ur2, oldpo=r2)
558 self.tsInfo.addUpdate(ur3, oldpo=r3)
559 self.tsInfo.addUpdate(ur4, oldpo=r4)
560
561 self.assertEquals('err', *self.resolveCode(skip=False))
562
563 def testBumpedSoNameMultiArch(self):
564 """
565 if compat-db45.x86_64 get skipped, then compat-db45.i386 should not
566 get pulled in instead
567 """
568 c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18", arch='x86_64')
569 c1.addRequires("libdb-4.3.so")
570
571 d1 = self.instPackage('compat-db', '4.6.21',"4", arch='x86_64')
572 d1.addProvides("libdb-4.3.so")
573 od1 = self.repoPackage('compat-db46', '4.6.21',"5", arch='x86_64')
574 od1.addProvides("libdb-4.6.so")
575 od1.addObsoletes("compat-db")
576 od2 = self.repoPackage('compat-db45', '4.6.21',"5", arch='x86_64')
577 od2.addProvides("libdb-4.5.so")
578 od2.addObsoletes("compat-db")
579 od3 = self.repoPackage('compat-db45', '4.6.21',"5", arch='i386')
580 od3.addProvides("libdb-4.5.so")
581 od3.addObsoletes("compat-db")
582
583 r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3', arch='x86_64')
584 r1.addRequires("libdb-4.5.so")
585 r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3', arch='x86_64')
586 r2.addRequires("libdb-4.5.so")
587 r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3', arch='x86_64')
588 r3.addRequires("libdb-4.5.so")
589 r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3', arch='x86_64')
590 r4.addRequires("libdb-4.5.so")
591
592 ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5', arch='x86_64')
593 ur1.addRequires("libdb-4.5.so")
594 ur1.addRequires("compat-db45")
595 ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5', arch='x86_64')
596 ur2.addRequires("libdb-4.5.so")
597 ur2.addRequires("compat-db45")
598 ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5', arch='x86_64')
599 ur3.addRequires("libdb-4.5.so")
600 ur3.addRequires("compat-db45")
601 ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5', arch='x86_64')
602 ur4.addRequires("libdb-4.5.so")
603 ur4.addRequires("compat-db45")
604
605
606 self.tsInfo.addObsoleting(od2, oldpo=d1)
607 self.tsInfo.addObsoleted(d1, od2)
608 self.tsInfo.addObsoleting(od1, oldpo=d1)
609 self.tsInfo.addObsoleted(d1, od1)
610 self.tsInfo.addUpdate(ur1, oldpo=r1)
611 self.tsInfo.addUpdate(ur2, oldpo=r2)
612 self.tsInfo.addUpdate(ur3, oldpo=r3)
613 self.tsInfo.addUpdate(ur4, oldpo=r4)
614
615 self.assertEquals('empty', *self.resolveCode(skip=True))
616 self.assertResult([c1,d1,r1,r2,r3,r4])
617
618 def testDualPackageUpdate(self):
619 '''
620 RHBZ #522112
621 two version of the same package installed on the system
622 and update will update both, but if it fail some dep only
623 One of the updated packages will be removed from the
624 transaction.
625 '''
626 i1 = self.instPackage('xorg-x11-server-Xorg','1.6.99.900')
627 i2 = self.instPackage('xorg-x11-server-Xorg','1.6.3')
628 u1 = self.repoPackage('xorg-x11-server-Xorg', '1.6.99.901')
629 u1.addRequires("notfound")
630 self.tsInfo.addUpdate(u1, oldpo=i1)
631 self.tsInfo.addUpdate(u1, oldpo=i2)
632 self.assertEquals('empty', *self.resolveCode(skip=True))
633 self.assertResult([i1,i2])
634
635 def testDowngrade1(self):
636 '''
637 bar require foolib=2.0 provided by foo-1.2
638 foo-1.2 is downgraded to foo-1.1 there only contains foolib=1.0
639 so bar requirement is broken and the downgrade should be removed from
640 transaction
641 '''
642 i1 = self.instPackage('foo', '1.2')
643 i1.addProvides('foolib', 'EQ', ('0', '2', '0'))
644 i2 = self.instPackage('bar', '1.0')
645 i2.addRequires('foolib', 'EQ', ('0', '2', '0'))
646 d1 = self.repoPackage('foo', '1.1')
647 d1.addProvides('foolib', 'EQ', ('0', '1', '0'))
648 self.tsInfo.addDowngrade(d1, oldpo=i1)
649 self.assertEquals('empty', *self.resolveCode(skip=True))
650 self.assertResult([i1, i2])
651
652
653 def testMissingfileReqIptabes(self):
654 '''
655 RHBZ #555528
656 iptables-0:1.4.5-1.fc12.i686 provides /usr/lib/libxtables.so.2
657 is updated to
658 iptables-0:1.4.6-1.fc13.i686 provides /usr/lib/libxtables.so.4
659 so libguestfs-1:1.0.81-1.fc13.i686 that requires /usr/lib/libxtables.so.2
660 breaks because /usr/lib/libxtables.so.2 no longer exists.
661
662 It fails in real life but not in the testcase :(
663
664 '''
665 i1 = self.instPackage('iptables','1.4.5', arch='x86_64')
666 i1.addFile("/usr/lib64/libxtables.so.2")
667 i2 = self.instPackage('libguestfs','1.0.81', arch='x86_64')
668 i2.addRequires("/usr/lib64/libxtables.so.2")
669 u1 = self.repoPackage('iptables','1.4.6', arch='x86_64')
670 u1.addFile("/usr/lib64/libxtables.so.4")
671 self.tsInfo.addUpdate(u1, oldpo=i1)
672 self.assertEquals('empty', *self.resolveCode(skip=True))
673 self.assertResult([i1,i2])
674
675 def testTransactionOutput(self):
676 '''
677 Test that skip-broken transaction dump output dont show the
678 dependon: xxx once.
679 '''
680 i1 = self.repoPackage('bar1', '1')
681 i1.addRequires('foo1', 'EQ', ('0', '1', '0'))
682 i1.addRequires('foo2', 'EQ', ('0', '1', '0'))
683 i1.addRequires('foo3', 'EQ', ('0', '1', '0'))
684 i1.addRequires('foo4', 'EQ', ('0', '1', '0'))
685 i1.addRequires('foo5', 'EQ', ('0', '1', '0'))
686 i1.addRequires('foo6', 'EQ', ('0', '1', '0'))
687 i2 = self.repoPackage('fooA', '1')
688 i2.addProvides('foo1', 'EQ', ('0', '1', '0'))
689 i3 = self.repoPackage('fooB', '1')
690 i3.addProvides('foo2', 'EQ', ('0', '1', '0'))
691 i4 = self.repoPackage('fooC', '1')
692 i4.addProvides('foo3', 'EQ', ('0', '1', '0'))
693 i5 = self.repoPackage('fooD', '1')
694 i5.addProvides('foo4', 'EQ', ('0', '1', '0'))
695 i6 = self.repoPackage('fooE', '1')
696 i6.addProvides('foo5', 'EQ', ('0', '1', '0'))
697 i7 = self.instPackage('fooF', '1')
698 i7.addProvides('foo6', 'EQ', ('0', '1', '0'))
699 u7 = self.instPackage('fooF', '2')
700 u7.addProvides('foo6', 'EQ', ('0', '2', '0'))
701 self.tsInfo.addInstall(i1)
702 self.tsInfo.addUpdate(u7, oldpo=i7)
703 self.assertEquals('ok', *self.resolveCode(skip=True))
704 # uncomment this line and the test will fail and you can see the output
705 # self.assertResult([i1])
706
707 def test_conflict_looping(self):
708 '''
709 Skip-broken is looping
710 https://bugzilla.redhat.com/show_bug.cgi?id=681806
711 '''
712 members = [] # the result after the transaction
713 # Installed package conflicts with u1
714 i0 = self.instString('kde-l10n-4.6.0-3.fc15.1.noarch')
715 i0.addConflicts('kdepim', 'GT', ('6', '4.5.9', '0'))
716 members.append(i0)
717 i1 = self.instString('6:kdepim-4.5.94.1-1.fc14.x86_64')
718 u1 = self.repoString('7:kdepim-4.4.10-1.fc15.x86_64')
719 self.tsInfo.addUpdate(u1, oldpo=i1)
720 # u1 should be removed, because of the conflict
721 members.append(i1)
722 i2 = self.instString('6:kdepim-libs-4.5.94.1-1.fc14.x86_64')
723 u2 = self.repoString('7:kdepim-libs-4.4.10-1.fc15.x86_64')
724 self.tsInfo.addUpdate(u2, oldpo=i2)
725 members.append(u2)
726 i3 = self.instString('kdepim-runtime-libs-4.5.94.1-2.fc14.x86_64')
727 u3 = self.repoString('1:kdepim-runtime-libs-4.4.10-2.fc15.x86_64')
728 self.tsInfo.addUpdate(u3, oldpo=i3)
729 members.append(u3)
730 i4 = self.instString('kdepim-runtime-4.5.94.1-2.fc14.x86_64')
731 u4 = self.repoString('1:kdepim-runtime-4.4.10-2.fc15.x86_64')
732 self.tsInfo.addUpdate(u4, oldpo=i4)
733 members.append(u4)
734 self.assertEquals('ok', *self.resolveCode(skip=True))
735 self.assertResult(members)
736
737 def test_skipbroken_001(self):
738 '''
739 this will pass
740 https://bugzilla.redhat.com/show_bug.cgi?id=656057
741 '''
742 members = []
743 # Installed package conflicts with ux1
744 ix0 = self.instString('1:libguestfs-1.6.0-1.fc14.1.i686')
745 ix0.addRequires('/usr/lib/.libssl.so.1.0.0a.hmac')
746 members.append(ix0)
747 ix1 = self.instString('openssl-1.0.0a-2.fc14.i686')
748 ix1.addFile("/usr/lib/.libssl.so.1.0.0a.hmac")
749 ux1 = self.repoString('openssl-1.0.0b-1.fc14.i686')
750 ux1.addFile("/usr/lib/.libssl.so.1.0.0b.hmac")
751 self.tsInfo.addUpdate(ux1, oldpo=ix1)
752 members.append(ix1)
753 self.assertEquals('empty', *self.resolveCode(skip=True))
754 self.assertResult(members)
755
756
757 def test_skipbroken_002(self):
758 '''
759 this will pass
760 https://bugzilla.redhat.com/show_bug.cgi?id=656057
761 '''
762 members = []
763 # Installed package conflicts with ux1
764 ix0 = self.instString('1:libguestfs-1.6.0-1.fc14.1.i686')
765 ix0.addRequires('/usr/lib/.libssl.so.1.0.0a.hmac')
766 members.append(ix0)
767 ix1 = self.instString('openssl-1.0.0a-2.fc14.i686')
768 ix1.addFile("/usr/lib/.libssl.so.1.0.0a.hmac")
769 ux1 = self.repoString('openssl-1.0.0b-1.fc14.i686')
770 ux1.addFile("/usr/lib/.libssl.so.1.0.0b.hmac")
771 self.tsInfo.addUpdate(ux1, oldpo=ix1)
772 members.append(ix1)
773 # this is just junk to make the transaction big
774 i1 = self.instString('afoobar-0.4.12-2.fc12.noarch')
775 u1 = self.repoString('afoobar-0.4.14-1.fc14.noarch')
776 self.tsInfo.addUpdate(u1, oldpo=i1)
777 members.append(u1)
778 self.assertEquals('ok', *self.resolveCode(skip=True))
779 self.assertResult(members)
780
781 def test_skipbroken_003(self):
782 '''
783 this will fail, because of a bug in the skip-broken code.
784 it will remove the wrong package (zfoobar) instead of openssl.
785 the problem is that self._working_po is not set with the right value
786 when checking file requires for installed packages after the transaction
787 if resolved. (_resolveRequires)
788 if fails because self._working_po contains the last package processed in the transaction
789 zfoobar, so it will be removed.
790 https://bugzilla.redhat.com/show_bug.cgi?id=656057
791
792 This should not fail anymore, after the the self._working_po is reset in depsolver
793 '''
794 members = []
795 # Installed package conflicts with ux1
796 ix0 = self.instString('1:libguestfs-1.6.0-1.fc14.1.i686')
797 ix0.addRequires('/usr/lib/.libssl.so.1.0.0a.hmac')
798 members.append(ix0)
799 ix1 = self.instString('openssl-1.0.0a-2.fc14.i686')
800 ix1.addFile("/usr/lib/.libssl.so.1.0.0a.hmac")
801 ux1 = self.repoString('openssl-1.0.0b-1.fc14.i686')
802 ux1.addFile("/usr/lib/.libssl.so.1.0.0b.hmac")
803 self.tsInfo.addUpdate(ux1, oldpo=ix1)
804 members.append(ix1)
805 # this is just junk to make the transaction big
806 i1 = self.instString('zfoobar-0.4.12-2.fc12.noarch')
807 u1 = self.repoString('zfoobar-0.4.14-1.fc14.noarch')
808 self.tsInfo.addUpdate(u1, oldpo=i1)
809 members.append(u1)
810 self.assertEquals('ok', *self.resolveCode(skip=True))
811 self.assertResult(members)
812
813
814 def resolveCode(self,skip = False):
815 solver = YumBase()
816 solver.save_ts = save_ts
817 solver.arch.setup_arch('x86_64')
818 solver.conf = FakeConf()
819 solver.conf.skip_broken = skip
820 solver.tsInfo = solver._tsInfo = self.tsInfo
821 solver.rpmdb = self.rpmdb
822 solver.pkgSack = self.xsack
823 solver.dsCallback = DepSolveProgressCallBack()
824
825 for po in self.rpmdb:
826 po.repoid = po.repo.id = "installed"
827 for po in self.xsack:
828 po.repoid = po.repo.id = "TestRepository"
829 for txmbr in solver.tsInfo:
830 if txmbr.ts_state in ('u', 'i'):
831 txmbr.po.repoid = txmbr.po.repo.id = "TestRepository"
832 else:
833 txmbr.po.repoid = txmbr.po.repo.id = "installed"
834
835 res, msg = solver.buildTransaction()
836 return self.res[res], msg
837
838def setup_logging():
839 logging.basicConfig()
840 plainformatter = logging.Formatter("%(message)s")
841 console_stdout = logging.StreamHandler(sys.stdout)
842 console_stdout.setFormatter(plainformatter)
843 verbose = logging.getLogger("yum.verbose")
844 verbose.propagate = False
845 verbose.addHandler(console_stdout)
846 verbose.setLevel(2)
Note: See TracBrowser for help on using the repository browser.