| 1 | import unittest
|
|---|
| 2 | import logging
|
|---|
| 3 | import sys
|
|---|
| 4 | from testbase import *
|
|---|
| 5 |
|
|---|
| 6 | class MiscTests(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 |
|
|---|
| 25 | def testLibBCD(self):
|
|---|
| 26 | '''
|
|---|
| 27 | The libABC test
|
|---|
| 28 | http://svn.labix.org/smart/trunk/README
|
|---|
| 29 | (Case Studies - Case 2)
|
|---|
| 30 |
|
|---|
| 31 | The issue is, a package named `A` requires package `BCD` explicitly, and
|
|---|
| 32 | RPM detects implicit dependencies between `A` and `libB`, `libC`, and `libD`.
|
|---|
| 33 | Package `BCD` provides `libB`, `libC`, and `libD`, but additionally there
|
|---|
| 34 | is a package `B` providing `libB`, a package `C` providing `libC`, and
|
|---|
| 35 | a package `D` providing `libD`.
|
|---|
| 36 |
|
|---|
| 37 | In other words, there's a package `A` which requires four different symbols,
|
|---|
| 38 | and one of these symbols is provided by a single package `BCD`, which happens
|
|---|
| 39 | to provide all symbols needed by `A`. There are also packages `B`, `C`, and `D`,
|
|---|
| 40 | that provide some of the symbols required by `A`, but can't satisfy all
|
|---|
| 41 | dependencies without `BCD`.
|
|---|
| 42 |
|
|---|
| 43 | The expected behavior for an operation asking to install `A` is obviously
|
|---|
| 44 | selecting `BCD` to satisfy `A`'s dependencies
|
|---|
| 45 |
|
|---|
| 46 | This fails in yum because, yum selects the packages with the shortest name
|
|---|
| 47 | if multiple packages provides the same requirements
|
|---|
| 48 |
|
|---|
| 49 | '''
|
|---|
| 50 | A = self.repoPackage('A', '1',arch='i386')
|
|---|
| 51 | A.addRequires('LibB')
|
|---|
| 52 | A.addRequires('LibC')
|
|---|
| 53 | A.addRequires('LibD')
|
|---|
| 54 | A.addRequires('BCD')
|
|---|
| 55 | BCD = self.repoPackage('BCD', '1',arch='i386')
|
|---|
| 56 | BCD.addProvides('LibB')
|
|---|
| 57 | BCD.addProvides('LibC')
|
|---|
| 58 | BCD.addProvides('LibD')
|
|---|
| 59 | B = self.repoPackage('B', '1',arch='i386')
|
|---|
| 60 | B.addProvides('LibB')
|
|---|
| 61 | C = self.repoPackage('C', '1',arch='i386')
|
|---|
| 62 | C.addProvides('LibC')
|
|---|
| 63 | D = self.repoPackage('D', '1',arch='i386')
|
|---|
| 64 | D.addProvides('LibD')
|
|---|
| 65 | self.tsInfo.addInstall(A)
|
|---|
| 66 | self.assertEquals('ok', *self.resolveCode(skip=False))
|
|---|
| 67 | # This one is disabled because, we no it fails, but we dont want it to bail out in the each testcase run
|
|---|
| 68 | # Just enable it to do the test
|
|---|
| 69 | # self.assertResult([A,BCD])
|
|---|
| 70 |
|
|---|
| 71 | def testLibBCD2(self):
|
|---|
| 72 | '''
|
|---|
| 73 | Same as above, but in this cases it is ok, because the BCD names is shorter than LibB,LibC and LibD
|
|---|
| 74 | '''
|
|---|
| 75 | A = self.repoPackage('A', '1',arch='i386')
|
|---|
| 76 | A.addRequires('LibB')
|
|---|
| 77 | A.addRequires('LibC')
|
|---|
| 78 | A.addRequires('LibD')
|
|---|
| 79 | A.addRequires('BCD')
|
|---|
| 80 | BCD = self.repoPackage('BCD', '1',arch='i386')
|
|---|
| 81 | BCD.addProvides('LibB')
|
|---|
| 82 | BCD.addProvides('LibC')
|
|---|
| 83 | BCD.addProvides('LibD')
|
|---|
| 84 | B = self.repoPackage('LibB', '1',arch='i386')
|
|---|
| 85 | B.addProvides('LibB')
|
|---|
| 86 | C = self.repoPackage('LibC', '1',arch='i386')
|
|---|
| 87 | C.addProvides('LibC')
|
|---|
| 88 | D = self.repoPackage('LibD', '1',arch='i386')
|
|---|
| 89 | D.addProvides('LibD')
|
|---|
| 90 | self.tsInfo.addInstall(A)
|
|---|
| 91 | self.assertEquals('ok', *self.resolveCode(skip=False))
|
|---|
| 92 | self.assertResult([A,BCD])
|
|---|
| 93 |
|
|---|
| 94 | def resolveCode(self,skip = False):
|
|---|
| 95 | solver = YumBase()
|
|---|
| 96 | solver.save_ts = save_ts
|
|---|
| 97 | solver.conf = FakeConf()
|
|---|
| 98 | solver.arch.setup_arch('x86_64')
|
|---|
| 99 | solver.conf.skip_broken = skip
|
|---|
| 100 | solver.tsInfo = solver._tsInfo = self.tsInfo
|
|---|
| 101 | solver.rpmdb = self.rpmdb
|
|---|
| 102 | solver.pkgSack = self.xsack
|
|---|
| 103 |
|
|---|
| 104 | for po in self.rpmdb:
|
|---|
| 105 | po.repoid = po.repo.id = "installed"
|
|---|
| 106 | for po in self.xsack:
|
|---|
| 107 | po.repoid = po.repo.id = "TestRepository"
|
|---|
| 108 | for txmbr in solver.tsInfo:
|
|---|
| 109 | if txmbr.ts_state in ('u', 'i'):
|
|---|
| 110 | txmbr.po.repoid = txmbr.po.repo.id = "TestRepository"
|
|---|
| 111 | else:
|
|---|
| 112 | txmbr.po.repoid = txmbr.po.repo.id = "installed"
|
|---|
| 113 |
|
|---|
| 114 | res, msg = solver.buildTransaction()
|
|---|
| 115 | return self.res[res], msg
|
|---|
| 116 |
|
|---|
| 117 | def setup_logging():
|
|---|
| 118 | logging.basicConfig()
|
|---|
| 119 | plainformatter = logging.Formatter("%(message)s")
|
|---|
| 120 | console_stdout = logging.StreamHandler(sys.stdout)
|
|---|
| 121 | console_stdout.setFormatter(plainformatter)
|
|---|
| 122 | verbose = logging.getLogger("yum.verbose")
|
|---|
| 123 | verbose.propagate = False
|
|---|
| 124 | verbose.addHandler(console_stdout)
|
|---|
| 125 | verbose.setLevel(2)
|
|---|
| 126 |
|
|---|