[yum-cvs] test/skipbroken-tests.py test/testbase.py yum/depsolve.py yum/__init__.py

Tim Lauridsen timlau at linux.duke.edu
Wed Jan 9 09:11:20 UTC 2008


 test/skipbroken-tests.py |  127 +++++++++++++++++++++--------------------------
 test/testbase.py         |    4 +
 yum/__init__.py          |    3 -
 yum/depsolve.py          |   13 ++--
 4 files changed, 69 insertions(+), 78 deletions(-)

New commits:
commit d390d99ca2df5c49cbf29032f2657f2f537259c9
Author: Tim Lauridsen <tim at naboo.local>
Date:   Wed Jan 9 10:08:45 2008 +0100

    fixing errors in unittests after the latest skipbroken changes.
    fixing an issue with _processConflict in the depsolver.
    cleanup the the skipbroken unittest and make then more readable

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index 8c39961..164ee1b 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -8,31 +8,42 @@ class SkipBrokenTests(DepsolveTests):
     
     def setUp(self):
         DepsolveTests.setUp(self)
+        self.xrepo   = FakeRepo("TestRepository",self.xsack)
         setup_logging()
 
+    def _createRepoPackage(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 _createInstPackage(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 testMissingReqNoSkip(self):
         ''' install fails,  because of missing req.
         bar fails because foobar is not provided '''
-        po = FakePackage('foo', '1', '0', '0', 'noarch')
+        po = self._createRepoPackage('foo', '1')
         po.addRequires('bar', None, (None,None,None))
         self.tsInfo.addInstall(po)
 
-        xpo = FakePackage('bar', '1', '0', '0', 'noarch')
+        xpo = self._createRepoPackage('bar', '1')
         xpo.addRequires('foobar', None, (None,None,None))
-        self.xsack.addPackage(xpo)
+        
         self.assertEquals('err', *self.resolveCode(skip=False))
         self.assertResult((po,xpo))
 
     def testMissingReqSkip(self):
         ''' install is skipped, because of missing req.
         foo + bar is skipped, because foobar is not provided '''
-        po = FakePackage('foo', '1', '0', '0', 'noarch')
+        po = self._createRepoPackage('foo', '1')
         po.addRequires('bar', None, (None,None,None))
         self.tsInfo.addInstall(po)
 
-        xpo = FakePackage('bar', '1', '0', '0', 'noarch')
+        xpo = self._createRepoPackage('bar', '1')
         xpo.addRequires('foobar', None, (None,None,None))
-        self.xsack.addPackage(xpo)
+
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([])
 
@@ -41,16 +52,16 @@ class SkipBrokenTests(DepsolveTests):
         foo + foobar is skipped because barfoo is not provided
         bar stays in the transaction
         '''
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
+        po1 = self._createRepoPackage('foo', '1')
         po1.addRequires('foobar', None, (None,None,None))
         self.tsInfo.addInstall(po1)
 
-        po2 = FakePackage('bar', '1', '0', '0', 'noarch')
+        po2 = self._createRepoPackage('bar', '1')
         self.tsInfo.addInstall(po2)
 
-        xpo1 = FakePackage('foobar', '1', '0', '0', 'noarch')
+        xpo1 = self._createRepoPackage('foobar', '1')
         xpo1.addRequires('barfoo', None, (None,None,None))
-        self.xsack.addPackage(xpo1)
+
         self.assertEquals('ok', *self.resolveCode(skip=True))
         self.assertResult([po2])
 
@@ -61,15 +72,13 @@ class SkipBrokenTests(DepsolveTests):
         '''
         # FIXME: The right solution is to skip the update from the transaction 
         
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
-        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po1 = self._createInstPackage('foo', '1')
+        po2 = self._createRepoPackage('foo', '2')
 
-        ipo = FakePackage('foo-tools', '2.5', '0', '0', 'noarch')
+        ipo = self._createInstPackage('foo-tools', '2.5')
         ipo.addRequires('foo', 'EQ', ('0', '1', '0'))
 
-        self.rpmdb.addPackage(po1)
         self.tsInfo.addUpdate(po2, oldpo=po1)
-        self.rpmdb.addPackage(ipo)
         
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([ipo, po1])
@@ -79,16 +88,15 @@ class SkipBrokenTests(DepsolveTests):
         The foo-1.0 -> foo-2.0 update fails, because foo-tools-2.0 need by foo-2.0
         is not provided, the update should be skipped and result in a empty transaction
         '''
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
+        po1 = self._createInstPackage('foo', '1')
         po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
-        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po2 = self._createRepoPackage('foo', '2')
         po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
 
-        ipo = FakePackage('foo-tools', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('foo-tools', '1')
 
-        self.rpmdb.addPackage(po1)
         self.tsInfo.addUpdate(po2, oldpo=po1)
-        self.rpmdb.addPackage(ipo)
+
         
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([ipo, po1])
@@ -99,18 +107,16 @@ class SkipBrokenTests(DepsolveTests):
         foo-2.0 update get skip, and the foo-gui install will get skipped too, because it need foo-2.0
         there is not longer provided.
         '''
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
+        po1 = self._createInstPackage('foo', '1')
         po1.addRequires('foo-tools', 'EQ', ('0', '1', '0'))
-        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po2 = self._createRepoPackage('foo', '2')
         po2.addRequires('foo-tools', 'EQ', ('0', '2', '0'))
 
-        ipo = FakePackage('foo-tools', '1', '0', '0', 'noarch')
-        por =  FakePackage('foo-gui', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('foo-tools', '1')
+        por =  self._createRepoPackage('foo-gui', '1')
         por.addRequires('foo', 'EQ', ('0', '2', '0'))
 
-        self.rpmdb.addPackage(po1)
         self.tsInfo.addUpdate(po2, oldpo=po1)
-        self.rpmdb.addPackage(ipo)
         self.tsInfo.addInstall(por)
 
         self.assertEquals('empty', *self.resolveCode(skip=True))
@@ -121,13 +127,10 @@ class SkipBrokenTests(DepsolveTests):
         foo is removed, and foo-tools get removed too, because it 
         depends on foo  
         '''
-        ipo = FakePackage('foo', '1', '0', '0', 'noarch')
-        ipo2 = FakePackage('foo-tools', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('foo', '1')
+        ipo2 = self._createInstPackage('foo-tools', '1')
         ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
 
-        self.rpmdb.addPackage(ipo)
-        self.rpmdb.addPackage(ipo2)
-
         self.tsInfo.addErase(ipo)
         self.assertEquals('ok', *self.resolveCode(skip=True))
         self.assertResult([])
@@ -136,15 +139,13 @@ class SkipBrokenTests(DepsolveTests):
         ''' update fails, because a req is erased.
         Update foo-tools-1.0 -> foo-tools-2.0, should fail because the require foo is removed
         '''
-        ipo = FakePackage('foo', '1', '0', '0', 'noarch')
-        ipo2 = FakePackage('foo-tools', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('foo', '1')
+        ipo2 = self._createInstPackage('foo-tools', '1')
         ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
 
-        upo2 = FakePackage('foo-tools', '2', '0', '0', 'noarch')
+        upo2 = self._createRepoPackage('foo-tools', '2')
         upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
 
-        self.rpmdb.addPackage(ipo)
-        self.rpmdb.addPackage(ipo2)   
         self.tsInfo.addErase(ipo)
         self.tsInfo.addUpdate(upo2, oldpo=ipo2)
         
@@ -155,15 +156,13 @@ class SkipBrokenTests(DepsolveTests):
         Update foo-tools-1.0 -> foo-tools-2.0, should fail because the require foo is removed
         the update is skipped and foo-tools-1.0 is removed too, because it requires foo. 
         '''
-        ipo = FakePackage('foo', '1', '0', '0', 'noarch')
-        ipo2 = FakePackage('foo-tools', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('foo', '1')
+        ipo2 = self._createInstPackage('foo-tools', '1')
         ipo2.addRequires('foo', 'EQ', ('0', '1', '0'))
 
-        upo2 = FakePackage('foo-tools', '2', '0', '0', 'noarch')
+        upo2 = self._createRepoPackage('foo-tools', '2')
         upo2.addRequires('foo', 'EQ', ('0', '1', '0'))
 
-        self.rpmdb.addPackage(ipo)
-        self.rpmdb.addPackage(ipo2)   
         self.tsInfo.addUpdate(upo2, oldpo=ipo2)
         self.tsInfo.addErase(ipo)
         
@@ -175,14 +174,11 @@ class SkipBrokenTests(DepsolveTests):
         foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
         the update get skipped and the transaction is now empty
         '''
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
-        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po1 = self._createInstPackage('foo', '1')
+        po2 = self._createRepoPackage('foo', '2')
         po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
 
-        ipo = FakePackage('bar', '1', '0', '0', 'noarch')
-
-        self.rpmdb.addPackage(po1)
-        self.rpmdb.addPackage(ipo)
+        ipo = self._createInstPackage('bar', '1')
 
         self.tsInfo.addUpdate(po2, oldpo=po1)
         
@@ -195,43 +191,37 @@ class SkipBrokenTests(DepsolveTests):
         bar-1.0 is update to bar-2.0, to solve the conflict but bar-2.0 need foo-1.0
         so the foo & bar updates get skipped and the transaction is empty
         '''
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
-        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po1 = self._createInstPackage('foo', '1')
+        po2 = self._createRepoPackage('foo', '2')
         po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
 
-        ipo = FakePackage('bar', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('bar', '1')
 
-        self.rpmdb.addPackage(po1)
-        self.rpmdb.addPackage(ipo)
 
-        xpo = FakePackage('bar', '2', '0', '0', 'noarch')
+        xpo = self._createRepoPackage('bar', '2')
         xpo.addRequires('foo', 'EQ', ('0', '1', '0'))
-        self.xsack.addPackage(xpo)
 
         self.tsInfo.addUpdate(po2, oldpo=po1)
         
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([po1,ipo])
 
-    def testConflictWithInstalledButUpdateExist(self):
+    def testConflictWithInstalledButUpdateExist2(self):
         '''update fails, because conflict cant be fixed. (missing req.)
         foo 1.0 -> 2.0 update fails, because foo-2.0 conflict with bar-1.0
         bar-1.0 is update to bar-2.0, to solve the conflict but bar-2.0 need poo-1.0
         there is not provided
         So the foo & bar updates get skipped and the transaction is empty
         '''
-        po1 = FakePackage('foo', '1', '0', '0', 'noarch')
-        po2 = FakePackage('foo', '2', '0', '0', 'noarch')
+        po1 = self._createInstPackage('foo', '1')
+        po2 = self._createRepoPackage('foo', '2')
         po2.addConflicts('bar', 'EQ', ('0', '1', '0'))
 
-        ipo = FakePackage('bar', '1', '0', '0', 'noarch')
+        ipo = self._createInstPackage('bar', '1')
 
-        self.rpmdb.addPackage(po1)
-        self.rpmdb.addPackage(ipo)
 
-        xpo = FakePackage('bar', '2', '0', '0', 'noarch')
+        xpo = self._createRepoPackage('bar', '2')
         xpo.addRequires('poo', 'EQ', ('0', '1', '0'))
-        self.xsack.addPackage(xpo)
 
         self.tsInfo.addUpdate(po2, oldpo=po1)
         
@@ -239,29 +229,26 @@ class SkipBrokenTests(DepsolveTests):
         self.assertResult([po1,ipo])
 
     def testAlternativePackageAvailable(self):
-        ipo = FakePackage('foo')
+        ipo = self._createRepoPackage('foo')
         ipo.addRequires('bar')
-        provides1 = FakePackage('bar')
+        provides1 = self._createRepoPackage('bar')
         provides1.addRequires('baz')
-        provides2 = FakePackage('bar-ng')
+        provides2 = self._createRepoPackage('bar-ng')
         provides2.addProvides('bar')
         #provides2.addRequires('baz')
 
-        self.xsack.addPackage(provides1)
-        self.xsack.addPackage(provides2)
         self.tsInfo.addInstall(ipo)
 
         self.assertEquals('empty', *self.resolveCode(skip=True))
         self.assertResult([])
 
     def testOnlyOneRequirementAvailable(self):
-        ipo = FakePackage('foo')
+        ipo = self._createRepoPackage('foo')
         ipo.addRequires('bar')
         ipo.addRequires('baz')
 
-        ppo = FakePackage('baz')
+        ppo = self._createRepoPackage('baz')
 
-        self.xsack.addPackage(ppo)
         self.tsInfo.addInstall(ipo)
 
         self.assertEquals('empty', *self.resolveCode(skip=True))
diff --git a/test/testbase.py b/test/testbase.py
index 669ff7e..6223cb8 100644
--- a/test/testbase.py
+++ b/test/testbase.py
@@ -36,14 +36,16 @@ class FakeConf(object):
 
 class FakeRepo(object):
 
-    def __init__(self, id=None):
+    def __init__(self, id=None,sack=None):
         self.id = id
+        self.sack = sack
 
 class FakePackage(packages.YumAvailablePackage):
 
     def __init__(self, name, version='1.0', release='1', epoch='0', arch='noarch', repo=None):
         if repo is None:
             repo = FakeRepo()
+            print "creating empty repo for %s " % name
         packages.YumAvailablePackage.__init__(self, repo)
 
         self.name = name
diff --git a/yum/__init__.py b/yum/__init__.py
index 135666f..b2da979 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -613,7 +613,8 @@ class YumBase(depsolve.Depsolve):
                     if self.tsInfo.exists(po.pkgtup):
                         self.verbose_logger.info("skipping %s because of depsolving problems" % str(po))
                         self.tsInfo.remove(po.pkgtup)
-                        self.pkgSack.delPackage(po)
+                        if not po.repoid == 'installed': # Only remove non installed packages from pkgSack
+                            self.pkgSack.delPackage(po)
             else: # Nothing was removed, so we still got a problem
                 break # Bail out
             rescode, restring = self.resolveDeps()
diff --git a/yum/depsolve.py b/yum/depsolve.py
index 3e8f403..9e0bfaa 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -624,15 +624,16 @@ class Depsolve(object):
                 if confpkg.name not in self.conf.exactarchlist:
                     try:
                         pkgs = self.pkgSack.returnNewestByName(confpkg.name)
+                        archs = {}
+                        for pkg in pkgs:
+                            (n,a,e,v,r) = pkg.pkgtup
+                            archs[a] = pkg
+                        a = rpmUtils.arch.getBestArchFromList(archs.keys())
+                        po = archs[a]                        
                     except Errors.PackageSackError:
                         self.verbose_logger.log(logginglevels.DEBUG_4, "unable to find newer package for %s" %(confpkg.name,))
                         pkgs = []
-                    archs = {}
-                    for pkg in pkgs:
-                        (n,a,e,v,r) = pkg.pkgtup
-                        archs[a] = pkg
-                    a = rpmUtils.arch.getBestArchFromList(archs.keys())
-                    po = archs[a]
+                        po = None
                 else:
                     try:
                         po = self.pkgSack.returnNewestByNameArch((confpkg.name,confpkg.arch))[0]



More information about the Yum-cvs-commits mailing list