[yum-git] test/misc-tests.py

Tim Lauridsen timlau at linux.duke.edu
Wed Jun 25 18:46:24 UTC 2008


 test/misc-tests.py |  124 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 124 insertions(+)

New commits:
commit d84125bc4f203a2a3de9fd6c3b861c529aae0bdd
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Wed Jun 25 20:44:55 2008 +0200

    Add a testcase for the libBCD case studie, just for the fun of it

diff --git a/test/misc-tests.py b/test/misc-tests.py
new file mode 100644
index 0000000..4709ce1
--- /dev/null
+++ b/test/misc-tests.py
@@ -0,0 +1,124 @@
+import unittest
+import logging
+import sys
+from testbase import *
+
+class MiscTests(DepsolveTests):
+    ''' Test cases to test skip-broken'''
+    
+    def setUp(self):
+        DepsolveTests.setUp(self)
+        self.xrepo = FakeRepo("TestRepository", self.xsack)
+        setup_logging()
+
+    def repoPackage(self, name, version='1', release='0', epoch='0', arch='noarch'):
+        po = FakePackage(name, version, release, epoch, arch, repo=self.xrepo)
+        self.xsack.addPackage(po)
+        return po
+    
+    def instPackage(self, name, version='1', release='0', epoch='0', arch='noarch'):
+        po = FakePackage(name, version, release, epoch, arch, repo=self.repo)
+        self.rpmdb.addPackage(po)
+        return po
+           
+        
+    def testLibBCD(self):
+        '''
+        The libABC test
+        http://svn.labix.org/smart/trunk/README 
+        (Case Studies - Case 2)
+
+        The issue is, a package named `A` requires package `BCD` explicitly, and
+        RPM detects implicit dependencies between `A` and `libB`, `libC`, and `libD`.
+        Package `BCD` provides `libB`, `libC`, and `libD`, but additionally there
+        is a package `B` providing `libB`, a package `C` providing `libC`, and
+        a package `D` providing `libD`.
+
+        In other words, there's a package `A` which requires four different symbols,
+        and one of these symbols is provided by a single package `BCD`, which happens
+        to provide all symbols needed by `A`. There are also packages `B`, `C`, and `D`,
+        that provide some of the symbols required by `A`, but can't satisfy all
+        dependencies without `BCD`.
+
+        The expected behavior for an operation asking to install `A` is obviously
+        selecting `BCD` to satisfy `A`'s dependencies
+        
+        This fails in yum because, yum selects the packages with the shortest name
+        if multiple packages provides the same requirements
+    
+        '''
+        A = self.repoPackage('A', '1',arch='i386')
+        A.addRequires('LibB')
+        A.addRequires('LibC')
+        A.addRequires('LibD')
+        A.addRequires('BCD')
+        BCD = self.repoPackage('BCD', '1',arch='i386')
+        BCD.addProvides('LibB')        
+        BCD.addProvides('LibC')        
+        BCD.addProvides('LibD')
+        B = self.repoPackage('B', '1',arch='i386')
+        B.addProvides('LibB')        
+        C = self.repoPackage('C', '1',arch='i386')
+        C.addProvides('LibC')        
+        D = self.repoPackage('D', '1',arch='i386')
+        D.addProvides('LibD')        
+        self.tsInfo.addInstall(A)
+        self.assertEquals('ok', *self.resolveCode(skip=False))
+        # This one is disabled because, we no it fails, but we dont want it to bail out in the each testcase run
+        # Just enable it to do the test
+        # self.assertResult([A,BCD])
+        
+    def testLibBCD2(self):
+        '''
+        Same as above, but in this cases it is ok, because the BCD names is shorter than LibB,LibC and LibD    
+        '''
+        A = self.repoPackage('A', '1',arch='i386')
+        A.addRequires('LibB')
+        A.addRequires('LibC')
+        A.addRequires('LibD')
+        A.addRequires('BCD')
+        BCD = self.repoPackage('BCD', '1',arch='i386')
+        BCD.addProvides('LibB')        
+        BCD.addProvides('LibC')        
+        BCD.addProvides('LibD')
+        B = self.repoPackage('LibB', '1',arch='i386')
+        B.addProvides('LibB')        
+        C = self.repoPackage('LibC', '1',arch='i386')
+        C.addProvides('LibC')        
+        D = self.repoPackage('LibD', '1',arch='i386')
+        D.addProvides('LibD')        
+        self.tsInfo.addInstall(A)
+        self.assertEquals('ok', *self.resolveCode(skip=False))
+        self.assertResult([A,BCD])
+    
+    def resolveCode(self,skip = False):
+        solver = YumBase()
+        solver.conf = FakeConf()
+        solver.conf.skip_broken = skip
+        solver.tsInfo = solver._tsInfo = self.tsInfo
+        solver.rpmdb = self.rpmdb
+        solver.pkgSack = self.xsack
+        
+        for po in self.rpmdb:
+            po.repoid = po.repo.id = "installed"
+        for po in self.xsack:
+            po.repoid = po.repo.id = "TestRepository"
+        for txmbr in solver.tsInfo:
+            if txmbr.ts_state in ('u', 'i'):
+                txmbr.po.repoid = txmbr.po.repo.id = "TestRepository"
+            else:
+                txmbr.po.repoid = txmbr.po.repo.id = "installed"
+
+        res, msg = solver.buildTransaction()
+        return self.res[res], msg
+
+def setup_logging():
+    logging.basicConfig()    
+    plainformatter = logging.Formatter("%(message)s")    
+    console_stdout = logging.StreamHandler(sys.stdout)
+    console_stdout.setFormatter(plainformatter)
+    verbose = logging.getLogger("yum.verbose")
+    verbose.propagate = False
+    verbose.addHandler(console_stdout)
+    verbose.setLevel(2)
+



More information about the Yum-cvs-commits mailing list