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

Last change on this file since 6 was 2, checked in by Yuri Dario, 15 years ago

Initial import for vendor code.

  • Property svn:eol-style set to native
File size: 24.7 KB
Line 
1import unittest
2import logging
3import sys
4from testbase import *
5
6class SkipBrokenTests(DepsolveTests):
7 ''' Test cases to test skip-broken'''
8
9 def setUp(self):
10 DepsolveTests.setUp(self)
11 self.xrepo = FakeRepo("TestRepository", self.xsack)
12 setup_logging()
13
14 def repoPackage(self, name, version='1', release='0', epoch='0', arch='noarch'):
15 po = FakePackage(name, version, release, epoch, arch, repo=self.xrepo)
16 self.xsack.addPackage(po)
17 return po
18
19 def instPackage(self, name, version='1', release='0', epoch='0', arch='noarch'):
20 po = FakePackage(name, version, release, epoch, arch, repo=self.repo)
21 self.rpmdb.addPackage(po)
22 return po
23
24 def testMissingReqNoSkip(self):
25 ''' install fails, because of missing req.
26 bar fails because foobar is not provided '''
27 po = self.repoPackage('foo', '1')
28 po.addRequires('bar', None, (None,None,None))
29 self.tsInfo.addInstall(po)
30
31 xpo = self.repoPackage('bar', '1')
32 xpo.addRequires('foobar', None, (None,None,None))
33
34 self.assertEquals('err', *self.resolveCode(skip=False))
35 self.assertResult((po,xpo))
36
37 def testMissingReqSkip(self):
38 ''' install is skipped, because of missing req.
39 foo + bar is skipped, because foobar is not provided '''
40 po = self.repoPackage('foo', '1')
41 po.addRequires('bar', None, (None,None,None))
42 self.tsInfo.addInstall(po)
43
44 xpo = self.repoPackage('bar', '1')
45 xpo.addRequires('foobar', None, (None,None,None))
46
47 self.assertEquals('empty', *self.resolveCode(skip=True))
48 self.assertResult([])
49
50 def testDepWithMissingReqSkip(self):
51 ''' install is skipped, beacuse dep is missing req.
52 foo + foobar is skipped because barfoo is not provided
53 bar stays in the transaction
54 '''
55 po1 = self.repoPackage('foo', '1')
56 po1.addRequires('foobar', None, (None,None,None))
57 self.tsInfo.addInstall(po1)
58
59 po2 = self.repoPackage('bar', '1')
60 self.tsInfo.addInstall(po2)
61
62 xpo1 = self.repoPackage('foobar', '1')
63 xpo1.addRequires('barfoo', None, (None,None,None))
64
65 self.assertEquals('ok', *self.resolveCode(skip=True))
66 self.assertResult([po2])
67
68 def testUpdateOldRequired(self):
69 ''' update breaking req. of installed package is skipped
70 foo-1.0 -> foo-2.0 breaks the installed foo-tools needing foo-1.0
71 so skip the update and we have and empty transaction
72 '''
73 # FIXME: The right solution is to skip the update from the transaction
74
75 po1 = self.instPackage('foo', '1')
76 po2 = self.repoPackage('foo', '2')
77
78 ipo = self.instPackage('foo-tools', '2.5')
79 ipo.addRequires('foo', 'EQ', ('0', '1', '0'))
80
81 self.tsInfo.addUpdate(po2, oldpo=po1)
82
83 self.assertEquals('empty', *self.resolveCode(skip=True))
84 self.assertResult([ipo, po1])
85
86 def testUpdateRequireOld(self):
87 '''update with missing req. is skipped
88 The foo-1.0 -> foo-2.0 update fails, because foo-tools-2.0 need by foo-2.0
89 is not provided, the update should be skipped and result in a empty transaction
90 '''
91 po1 = self.instPackage('foo', '1')
92 po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
93 po2 = self.repoPackage('foo', '2')
94 po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
95
96 ipo = self.instPackage('foo-tools', '1')
97
98 self.tsInfo.addUpdate(po2, oldpo=po1)
99
100
101 self.assertEquals('empty', *self.resolveCode(skip=True))
102 self.assertResult([ipo, po1])
103
104 def testUpdateRequireBoth(self):
105 ''' install + update skipped, because of missing req.
106 foo-1.0 -> foo-2.0 update, fails because foo-tools-2.0, needed by foo-2.0 is not provided.
107 foo-2.0 update get skip, and the foo-gui install will get skipped too, because it need foo-2.0
108 there is not longer provided.
109 '''
110 po1 = self.instPackage('foo', '1')
111 po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
112 po2 = self.repoPackage('foo', '2')
113 po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
114
115 ipo = self.instPackage('foo-tools', '1')
116 por = self.repoPackage('foo-gui', '1')
117 por.addRequires('foo', 'EQ', ('0', '2', '0'))
118
119 self.tsInfo.addUpdate(po2, oldpo=po1)
120 self.tsInfo.addInstall(por)
121
122 self.assertEquals('empty', *self.resolveCode(skip=True))
123 self.assertResult([ipo, po1])
124
125 def testEraseDep(self):
126 ''' remove a package that someone depends on
127 foo is removed, and foo-tools get removed too, because it
128 depends on foo
129 '''
130 ipo = self.instPackage('foo', '1')
131 ipo2 = self.instPackage('foo-tools', '1')
132 ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
133
134 self.tsInfo.addErase(ipo)
135 self.assertEquals('ok', *self.resolveCode(skip=True))
136 self.assertResult([])
137
138 def testEraseReqByUpdateNoSkip(self):
139 ''' update fails, because a req is erased.
140 Update foo-tools-1.0 -> foo-tools-2.0, should fail because the require foo is removed
141 '''
142 ipo = self.instPackage('foo', '1')
143 ipo2 = self.instPackage('foo-tools', '1')
144 ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
145
146 upo2 = self.repoPackage('foo-tools', '2')
147 upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
148
149 self.tsInfo.addErase(ipo)
150 self.tsInfo.addUpdate(upo2, oldpo=ipo2)
151
152 self.assertEquals('err', *self.resolveCode(skip=False))
153
154 def testEraseReqByUpdateSkip(self):
155 ''' update is skipped, because a req is erased.
156 Update foo-tools-1.0 -> foo-tools-2.0, should fail because the require foo is removed
157 the update is skipped and foo-tools-1.0 is removed too, because it requires foo.
158 '''
159 ipo = self.instPackage('foo', '1')
160 ipo2 = self.instPackage('foo-tools', '1')
161 ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
162
163 upo2 = self.repoPackage('foo-tools', '2')
164 upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
165
166 self.tsInfo.addUpdate(upo2, oldpo=ipo2)
167 self.tsInfo.addErase(ipo)
168
169 self.assertEquals('ok', *self.resolveCode(skip=True))
170 self.assertResult([])
171
172 def testConflictWithInstalled(self):
173 ''' update fails, because it conflicts with installed
174 foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
175 the update get skipped and the transaction is now empty
176 '''
177 po1 = self.instPackage('foo', '1')
178 po2 = self.repoPackage('foo', '2')
179 po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
180
181 ipo = self.instPackage('bar', '1')
182
183 self.tsInfo.addUpdate(po2, oldpo=po1)
184
185 self.assertEquals('empty', *self.resolveCode(skip=True))
186 self.assertResult([ipo, po1])
187
188 def testConflictWithInstalledButUpdateExist(self):
189 ''' update fails, because conflict cant be fixed. (req. loop)
190 foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
191 bar-1.0 is update to bar-2.0, to solve the conflict but bar-2.0 need foo-1.0
192 so the foo & bar updates get skipped and the transaction is empty
193 '''
194 po1 = self.instPackage('foo', '1')
195 po2 = self.repoPackage('foo', '2')
196 po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
197
198 ipo = self.instPackage('bar', '1')
199
200
201 xpo = self.repoPackage('bar', '2')
202 xpo.addRequires('foo', 'EQ', ('0', '1', '0'))
203
204 self.tsInfo.addUpdate(po2, oldpo=po1)
205
206 self.assertEquals('empty', *self.resolveCode(skip=True))
207 self.assertResult([po1,ipo])
208
209 def testConflictWithInstalledButUpdateExist2(self):
210 '''update fails, because conflict cant be fixed. (missing req.)
211 foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
212 bar-1.0 is update to bar-2.0, to solve the conflict but bar-2.0 need poo-1.0
213 there is not provided
214 So the foo & bar updates get skipped and the transaction is empty
215 '''
216 po1 = self.instPackage('foo', '1')
217 po2 = self.repoPackage('foo', '2')
218 po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
219
220 ipo = self.instPackage('bar', '1')
221
222
223 xpo = self.repoPackage('bar', '2')
224 xpo.addRequires('poo', 'EQ', ('0', '1', '0'))
225
226 self.tsInfo.addUpdate(po2, oldpo=po1)
227
228 self.assertEquals('empty', *self.resolveCode(skip=True))
229 self.assertResult([po1,ipo])
230
231 def testAlternativePackageAvailable(self):
232 ipo = self.repoPackage('foo')
233 ipo.addRequires('bar')
234 provides1 = self.repoPackage('bar')
235 provides1.addRequires('baz')
236 provides2 = self.repoPackage('bar-ng')
237 provides2.addProvides('bar')
238 #provides2.addRequires('baz')
239
240 self.tsInfo.addInstall(ipo)
241
242 self.assertEquals('ok', *self.resolveCode(skip=True))
243 self.assertResult([ipo, provides2])
244
245 def testOnlyOneRequirementAvailable(self):
246 ipo = self.repoPackage('foo')
247 ipo.addRequires('bar')
248 ipo.addRequires('baz')
249
250 ppo = self.repoPackage('baz')
251
252 self.tsInfo.addInstall(ipo)
253
254 self.assertEquals('empty', *self.resolveCode(skip=True))
255 self.assertResult([])
256
257 def test2PkgReqSameDep(self):
258 po1 = self.repoPackage('foo')
259 po1.addRequires('bar')
260 po1.addRequires('foobar')
261 po2 = self.repoPackage('bar')
262 po2.addRequires('zzzz')
263 po3 = self.repoPackage('barfoo')
264 po3.addRequires('foobar')
265 po4 = self.repoPackage('foobar')
266 self.tsInfo.addInstall(po1)
267 self.tsInfo.addInstall(po3)
268
269 self.assertEquals('ok', *self.resolveCode(skip=True))
270 self.assertResult([po3,po4])
271
272 def testProvidesAndDepsGetRemoved(self):
273 po1 = self.repoPackage('Spaceman')
274 po1.addProvides('money')
275 po2 = self.repoPackage('GutlessGibbon')
276 po2.addRequires('money')
277 po2.addRequires('nice')
278 po2.addRequires('features')
279 self.tsInfo.addInstall(po2)
280 self.assertEquals('empty', *self.resolveCode(skip=True))
281
282 def testSecondStepRequiresUpdate(self):
283 po1 = self.repoPackage('foo')
284 po1.addRequires('xxx')
285 po1.addRequires('bar')
286 self.tsInfo.addInstall(po1)
287
288 po2 = self.repoPackage('bar')
289 po2.addRequires('baz', 'EQ', (None, '2', '1'))
290
291 ipo = self.instPackage('baz')
292 upo = self.repoPackage('baz', '2', '1')
293
294 self.assertEquals('empty', *self.resolveCode(skip=True))
295 self.assertResult([ipo])
296
297
298 def testDepCycle1(self):
299 po0 = self.repoPackage('leaf')
300
301 po1 = self.repoPackage('foo')
302 po1.addRequires('bar')
303 po1.addRequires('xxx')
304 po2 = self.repoPackage('bar')
305 po2.addRequires('baz')
306 po3 = self.repoPackage('baz')
307 po3.addRequires('foo')
308 po3.addRequires('leaf')
309
310 self.tsInfo.addInstall(po1)
311
312 self.assertEquals('empty', *self.resolveCode(skip=True))
313
314 def testDepCycle2(self):
315 po0 = self.repoPackage('leaf')
316
317 po1 = self.repoPackage('foo')
318 po1.addRequires('bar')
319 po2 = self.repoPackage('bar')
320 po2.addRequires('baz')
321 po2.addRequires('xxx')
322 po3 = self.repoPackage('baz')
323 po3.addRequires('foo')
324 po3.addRequires('leaf')
325
326 self.tsInfo.addInstall(po1)
327
328 self.assertEquals('empty', *self.resolveCode(skip=True))
329
330 def testDepCycle3(self):
331 po0 = self.repoPackage('leaf')
332
333 po1 = self.repoPackage('foo')
334 po1.addRequires('bar')
335 po2 = self.repoPackage('bar')
336 po2.addRequires('baz')
337 po3 = self.repoPackage('baz')
338 po3.addRequires('foo')
339 po3.addRequires('leaf')
340 po3.addRequires('xxx')
341
342 self.tsInfo.addInstall(po1)
343
344 self.assertEquals('empty', *self.resolveCode(skip=True))
345
346 def testMultiLibUpdate(self):
347 '''
348 foo-1.i386 & foo-1.x86_64 is updated by foo-2.i386 & foo-2.x86_64
349 foo-2.x86_64 has a missing req, and gets skipped, foo-2.i386 has to be
350 skipped too or it will fail in the rpm test transaction
351 '''
352 ipo1 = self.instPackage('foo', '1',arch='i386')
353 ipo2 = self.instPackage('foo', '1',arch='x86_64')
354 po1 = self.repoPackage('foo', '2',arch='i386')
355 po2 = self.repoPackage('foo', '2',arch='x86_64')
356 po2.addRequires('notfound', 'EQ', ('0', '1', '0'))
357 self.tsInfo.addUpdate(po1, oldpo=ipo1)
358 self.tsInfo.addUpdate(po2, oldpo=ipo2)
359 self.assertEquals('empty', *self.resolveCode(skip=True))
360 self.assertResult([ipo1,ipo2])
361
362 def testInstReqOldVer1(self):
363 """
364 zap-2.0 updates zap-1.0, but zap-2.0 needs barlib-2.0 provided by
365 bar-2.0, but the installed foo, needs barlib-1.0, so it need to be updated to
366 foo-2.0, that requires barlib-2.0
367 But it only work if foo-1.0 -> foo-2.0 is added as an update, it is not
368 pulled in by it self.
369 """
370 ipo1 = self.instPackage('foo', '1')
371 ipo1.addRequires('barlib', 'EQ', ('0', '1', '0'))
372 ipo2 = self.instPackage('bar', '1')
373 ipo2.addProvides('barlib', 'EQ', ('0', '1', '0'))
374 ipo3 = self.instPackage('zap', '1')
375 po1 = self.repoPackage('foo', '2')
376 po1.addRequires('barlib', 'EQ', ('0', '2', '0'))
377 po2 = self.repoPackage('bar', '2')
378 po2.addProvides('barlib', 'EQ', ('0', '2', '0'))
379 po3 = self.repoPackage('zap', '2')
380 po3.addRequires('barlib', 'EQ', ('0', '2', '0'))
381 #FIXME: Find out why this line is needed, it should be auto updated by the solver.
382 self.tsInfo.addUpdate(po1, oldpo=ipo1) # why is this needed, it should work without ?
383 self.tsInfo.addUpdate(po3, oldpo=ipo3)
384 self.assertEquals('ok', *self.resolveCode(skip=True))
385 self.assertResult([po1,po2,po3])
386
387
388 def testBumpedSoName1(self):
389 """
390 d2 need a lib from b1, so the update fails.
391 d2 and b2 get skipped, but the installed b1 needs a
392 lib from a1, but it has been updated to a2, so it is
393 no longer there. so a2 needs to be skipped to
394 """
395 a1 = self.instPackage('a', '1', arch='x86_64')
396 a1.addProvides("liba.so.1()(64bit)")
397 a2 = self.repoPackage('a', '2', arch='x86_64')
398 a2.addProvides("liba.so.2()(64bit)")
399
400 b1 = self.instPackage('b', '1', arch='x86_64')
401 b1.addProvides("libb.so.1()(64bit)")
402 b1.addRequires("liba.so.1()(64bit)")
403 b2 = self.repoPackage('b', '2', arch='x86_64')
404 b2.addProvides("libb.so.2()(64bit)")
405 b2.addRequires("liba.so.2()(64bit)")
406
407 c1 = self.instPackage('c', '1', arch='x86_64')
408 c1.addRequires("liba.so.1()(64bit)")
409 c2 = self.repoPackage('c', '2', arch='x86_64')
410 c2.addRequires("liba.so.2()(64bit)")
411
412 d1 = self.instPackage('d', '1', arch='x86_64')
413 d1.addRequires("libb.so.1()(64bit)")
414 d2 = self.repoPackage('d', '2', arch='x86_64')
415 d2.addRequires("libb.so.1()(64bit)")
416
417 e1 = self.instPackage('e', '1', arch='x86_64')
418 e2 = self.repoPackage('e', '2', arch='x86_64')
419
420 f1 = self.instPackage('f', '1', arch='x86_64')
421 f2 = self.repoPackage('f', '2', arch='x86_64')
422
423 self.tsInfo.addUpdate(a2, oldpo=a1)
424 self.tsInfo.addUpdate(b2, oldpo=b1)
425 self.tsInfo.addUpdate(c2, oldpo=c1)
426 self.tsInfo.addUpdate(d2, oldpo=d1)
427 self.tsInfo.addUpdate(e2, oldpo=e1)
428 self.tsInfo.addUpdate(f2, oldpo=f1)
429 self.assertEquals('ok', *self.resolveCode(skip=True))
430 self.assertResult([a1,b1,c1,d1,e2,f2])
431
432 def testBumpedSoName2(self):
433 """
434 https://bugzilla.redhat.com/show_bug.cgi?id=468785
435 """
436 c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18")
437 c1.addRequires("libdb-4.3.so")
438
439 d1 = self.instPackage('compat-db', '4.6.21',"4")
440 d1.addProvides("libdb-4.3.so")
441 od1 = self.repoPackage('compat-db46', '4.6.21',"5")
442 od1.addProvides("libdb-4.6.so")
443 od1.addObsoletes("compat-db")
444 od2 = self.repoPackage('compat-db45', '4.6.21',"5")
445 od2.addProvides("libdb-4.5.so")
446 od2.addObsoletes("compat-db")
447
448 r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3')
449 r1.addRequires("libdb-4.5.so")
450 r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3')
451 r2.addRequires("libdb-4.5.so")
452 r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3')
453 r3.addRequires("libdb-4.5.so")
454 r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3')
455 r4.addRequires("libdb-4.5.so")
456
457 ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5')
458 ur1.addRequires("libdb-4.5.so")
459 ur1.addRequires("compat-db45")
460 ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5')
461 ur2.addRequires("libdb-4.5.so")
462 ur2.addRequires("compat-db45")
463 ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5')
464 ur3.addRequires("libdb-4.5.so")
465 ur3.addRequires("compat-db45")
466 ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5')
467 ur4.addRequires("libdb-4.5.so")
468 ur4.addRequires("compat-db45")
469
470 self.tsInfo.addObsoleting(od2, oldpo=d1)
471 self.tsInfo.addObsoleted(d1, od2)
472 self.tsInfo.addObsoleting(od1, oldpo=d1)
473 self.tsInfo.addObsoleted(d1, od1)
474 self.tsInfo.addUpdate(ur1, oldpo=r1)
475 self.tsInfo.addUpdate(ur2, oldpo=r2)
476 self.tsInfo.addUpdate(ur3, oldpo=r3)
477 self.tsInfo.addUpdate(ur4, oldpo=r4)
478
479 self.assertEquals('empty', *self.resolveCode(skip=True))
480 self.assertResult([c1,d1,r1,r2,r3,r4])
481
482 def testBumpedSoName3(self):
483 """
484 https://bugzilla.redhat.com/show_bug.cgi?id=468785
485 yum update compat-db46
486 """
487 c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18")
488 c1.addRequires("libdb-4.3.so")
489
490 d1 = self.instPackage('compat-db', '4.6.21',"4")
491 d1.addProvides("libdb-4.3.so")
492 od1 = self.repoPackage('compat-db46', '4.6.21',"5")
493 od1.addProvides("libdb-4.6.so")
494 od1.addObsoletes("compat-db")
495 od2 = self.repoPackage('compat-db45', '4.6.21',"5")
496 od2.addProvides("libdb-4.5.so")
497 od2.addObsoletes("compat-db")
498
499 r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3')
500 r1.addRequires("libdb-4.5.so")
501 r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3')
502 r2.addRequires("libdb-4.5.so")
503 r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3')
504 r3.addRequires("libdb-4.5.so")
505 r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3')
506 r4.addRequires("libdb-4.5.so")
507
508 ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5')
509 ur1.addRequires("libdb-4.5.so")
510 ur1.addRequires("compat-db45")
511 ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5')
512 ur2.addRequires("libdb-4.5.so")
513 ur2.addRequires("compat-db45")
514 ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5')
515 ur3.addRequires("libdb-4.5.so")
516 ur3.addRequires("compat-db45")
517 ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5')
518 ur4.addRequires("libdb-4.5.so")
519 ur4.addRequires("compat-db45")
520
521 self.tsInfo.addObsoleting(od1, oldpo=d1)
522 self.tsInfo.addObsoleted(d1, od1)
523 self.tsInfo.addUpdate(ur1, oldpo=r1)
524 self.tsInfo.addUpdate(ur2, oldpo=r2)
525 self.tsInfo.addUpdate(ur3, oldpo=r3)
526 self.tsInfo.addUpdate(ur4, oldpo=r4)
527
528 self.assertEquals('err', *self.resolveCode(skip=False))
529
530 def testBumpedSoNameMultiArch(self):
531 """
532 if compat-db45.x86_64 get skipped, then compat-db45.i386 should not
533 get pulled in instead
534 """
535 c1 = self.instPackage('cyrus-sasl-lib', '2.1.22',"18", arch='x86_64')
536 c1.addRequires("libdb-4.3.so")
537
538 d1 = self.instPackage('compat-db', '4.6.21',"4", arch='x86_64')
539 d1.addProvides("libdb-4.3.so")
540 od1 = self.repoPackage('compat-db46', '4.6.21',"5", arch='x86_64')
541 od1.addProvides("libdb-4.6.so")
542 od1.addObsoletes("compat-db")
543 od2 = self.repoPackage('compat-db45', '4.6.21',"5", arch='x86_64')
544 od2.addProvides("libdb-4.5.so")
545 od2.addObsoletes("compat-db")
546 od3 = self.repoPackage('compat-db45', '4.6.21',"5", arch='i386')
547 od3.addProvides("libdb-4.5.so")
548 od3.addObsoletes("compat-db")
549
550 r1 = self.instPackage('rpm', '4.6.0-0','0.rc1.3', arch='x86_64')
551 r1.addRequires("libdb-4.5.so")
552 r2 = self.instPackage('rpm-libs', '4.6.0-0','0.rc1.3', arch='x86_64')
553 r2.addRequires("libdb-4.5.so")
554 r3 = self.instPackage('rpm-build', '4.6.0-0','0.rc1.3', arch='x86_64')
555 r3.addRequires("libdb-4.5.so")
556 r4 = self.instPackage('rpm-python', '4.6.0-0','0.rc1.3', arch='x86_64')
557 r4.addRequires("libdb-4.5.so")
558
559 ur1 = self.repoPackage('rpm', '4.6.0-0','0.rc1.5', arch='x86_64')
560 ur1.addRequires("libdb-4.5.so")
561 ur1.addRequires("compat-db45")
562 ur2 = self.repoPackage('rpm-libs', '4.6.0-0','0.rc1.5', arch='x86_64')
563 ur2.addRequires("libdb-4.5.so")
564 ur2.addRequires("compat-db45")
565 ur3 = self.repoPackage('rpm-build', '4.6.0-0','0.rc1.5', arch='x86_64')
566 ur3.addRequires("libdb-4.5.so")
567 ur3.addRequires("compat-db45")
568 ur4 = self.repoPackage('rpm-python', '4.6.0-0','0.rc1.5', arch='x86_64')
569 ur4.addRequires("libdb-4.5.so")
570 ur4.addRequires("compat-db45")
571
572
573 self.tsInfo.addObsoleting(od2, oldpo=d1)
574 self.tsInfo.addObsoleted(d1, od2)
575 self.tsInfo.addObsoleting(od1, oldpo=d1)
576 self.tsInfo.addObsoleted(d1, od1)
577 self.tsInfo.addUpdate(ur1, oldpo=r1)
578 self.tsInfo.addUpdate(ur2, oldpo=r2)
579 self.tsInfo.addUpdate(ur3, oldpo=r3)
580 self.tsInfo.addUpdate(ur4, oldpo=r4)
581
582 self.assertEquals('empty', *self.resolveCode(skip=True))
583 self.assertResult([c1,d1,r1,r2,r3,r4])
584
585 def testDualPackageUpdate(self):
586 '''
587 RHBZ #522112
588 two version of the same package installed on the system
589 and update will update both, but if it fail some dep only
590 One of the updated packages will be removed from the
591 transaction.
592 '''
593 i1 = self.instPackage('xorg-x11-server-Xorg','1.6.99.900')
594 i2 = self.instPackage('xorg-x11-server-Xorg','1.6.3')
595 u1 = self.repoPackage('xorg-x11-server-Xorg', '1.6.99.901')
596 u1.addRequires("notfound")
597 self.tsInfo.addUpdate(u1, oldpo=i1)
598 self.tsInfo.addUpdate(u1, oldpo=i2)
599 self.assertEquals('empty', *self.resolveCode(skip=True))
600 self.assertResult([i1,i2])
601
602
603 def testMissingfileReqIptabes(self):
604 '''
605 RHBZ #555528
606 iptables-0:1.4.5-1.fc12.i686 provides /usr/lib/libxtables.so.2
607 is updated to
608 iptables-0:1.4.6-1.fc13.i686 provides /usr/lib/libxtables.so.4
609 so libguestfs-1:1.0.81-1.fc13.i686 that requires /usr/lib/libxtables.so.2
610 breaks because /usr/lib/libxtables.so.2 no longer exists.
611
612 It fails in real life but not in the testcase :(
613
614 '''
615 i1 = self.instPackage('iptables','1.4.5', arch='x86_64')
616 i1.addFile("/usr/lib64/libxtables.so.2")
617 i2 = self.instPackage('libguestfs','1.0.81', arch='x86_64')
618 i2.addRequires("/usr/lib64/libxtables.so.2")
619 u1 = self.repoPackage('iptables','1.4.6', arch='x86_64')
620 u1.addFile("/usr/lib64/libxtables.so.4")
621 self.tsInfo.addUpdate(u1, oldpo=i1)
622 self.assertEquals('empty', *self.resolveCode(skip=True))
623 self.assertResult([i1,i2])
624
625
626
627 def resolveCode(self,skip = False):
628 solver = YumBase()
629 solver.arch.setup_arch('x86_64')
630 solver.conf = FakeConf()
631 solver.conf.skip_broken = skip
632 solver.tsInfo = solver._tsInfo = self.tsInfo
633 solver.rpmdb = self.rpmdb
634 solver.pkgSack = self.xsack
635 solver.dsCallback = DepSolveProgressCallBack()
636
637 for po in self.rpmdb:
638 po.repoid = po.repo.id = "installed"
639 for po in self.xsack:
640 po.repoid = po.repo.id = "TestRepository"
641 for txmbr in solver.tsInfo:
642 if txmbr.ts_state in ('u', 'i'):
643 txmbr.po.repoid = txmbr.po.repo.id = "TestRepository"
644 else:
645 txmbr.po.repoid = txmbr.po.repo.id = "installed"
646
647 res, msg = solver.buildTransaction()
648 return self.res[res], msg
649
650def setup_logging():
651 logging.basicConfig()
652 plainformatter = logging.Formatter("%(message)s")
653 console_stdout = logging.StreamHandler(sys.stdout)
654 console_stdout.setFormatter(plainformatter)
655 verbose = logging.getLogger("yum.verbose")
656 verbose.propagate = False
657 verbose.addHandler(console_stdout)
658 verbose.setLevel(2)
Note: See TracBrowser for help on using the repository browser.