コード例 #1
0
class ProductStackTestCase(unittest.TestCase):

    def setUp(self):
        self.dbpath = os.path.join(testEupsStack, "ups_db")
        self.stack = ProductStack(self.dbpath, autosave=False)
        self.stack.addProduct(Product("fw", "1.2", "Darwin", 
                                      "/opt/sw/Darwin/fw/1.2", "none"))

    def testMisc(self):
        self.assertEquals(ProductStack.persistFilename("Linux"),
                          "Linux.pickleDB1_3_0")
        self.assertEquals(self.stack.getDbPath(), 
                          os.path.join(testEupsStack, "ups_db"))

    def testGetProductNames(self):
        prods = self.stack.getProductNames()
        self.assertEquals(len(prods), 1)
        self.assertEquals(prods[0], 'fw')

        self.stack.addProduct(Product("afw", "1.2", "Linux", 
                                      "/opt/sw/Linux/afw/1.2", "none"))
        prods = self.stack.getProductNames()
        self.assertEquals(len(prods), 2)
        expected = "fw afw".split()
        for prod in expected:
            self.assert_(prod in prods)
        prods = self.stack.getProductNames("Linux")
        self.assertEquals(len(prods), 1)
        self.assertEquals(prods[0], 'afw')

        self.stack.addProduct(Product("fw", "1.2", "Linux", 
                                      "/opt/sw/Linux/fw/1.2", "none"))
        prods = self.stack.getProductNames()
        self.assertEquals(len(prods), 2)
        for prod in expected:
            self.assert_(prod in prods)

    def testGetVersions(self):
        vers = self.stack.getVersions("afw")
        self.assertEquals(len(vers), 0)

        vers = self.stack.getVersions("fw")
        self.assertEquals(len(vers), 1)
        self.assertEquals(vers[0], '1.2')

        self.stack.addProduct(Product("fw", "1.3", "Linux", 
                                      "/opt/sw/Linux/fw/1.3", "none"))
        vers = self.stack.getVersions("fw")
        self.assertEquals(len(vers), 2)
        expected = "1.2 1.3".split()
        for ver in expected:
            self.assert_(ver in vers)

        vers = self.stack.getVersions("fw", "Linux")
        self.assertEquals(len(vers), 1)
        self.assertEquals(vers[0], '1.3')

        self.stack.addProduct(Product("fw", "1.2", "Linux", 
                                      "/opt/sw/Linux/fw/1.2", "none"))
        vers = self.stack.getVersions("fw")
        self.assertEquals(len(vers), 2)
        for ver in expected:
            self.assert_(ver in vers)
        vers = self.stack.getVersions("fw", "Linux")
        self.assertEquals(len(vers), 2)
        for ver in expected:
            self.assert_(ver in vers)

    def testAutoSave(self):
        self.assert_(self.stack.saveNeeded())

        cache = os.path.join(os.environ["PWD"],
                             ProductStack.persistFilename("Darwin"))
        if os.path.exists(cache):  os.remove(cache)

        stack = ProductStack(os.path.join(testEupsStack, "ups_db"), 
                             os.environ["PWD"], autosave=True)
        self.assert_(not stack.saveNeeded())
        stack.addProduct(Product("fw", "1.2", "Darwin", 
                                 "/opt/sw/Darwin/fw/1.2", "none"))
        self.assert_(not stack.saveNeeded())
        self.assert_(os.path.exists(cache))
        if os.path.exists(cache):  os.remove(cache)

    def testHasProduct(self):
        self.assert_(self.stack.hasProduct("fw"))
        self.assert_(not self.stack.hasProduct("afw"))
        self.assert_(self.stack.hasProduct("fw", "Darwin"))
        self.assert_(not self.stack.hasProduct("fw", "Linux"))
        self.assert_(self.stack.hasProduct("fw", "Darwin", "1.2"))
        self.assert_(not self.stack.hasProduct("fw", "Darwin", "1.3"))
        self.assert_(not self.stack.hasProduct("afw", "Darwin", "1.2"))
        self.assert_(not self.stack.hasProduct("fw", "Linux", "1.2"))
        self.assert_(self.stack.hasProduct("fw", version="1.2"))
        self.assert_(not self.stack.hasProduct("fw", version="1.3"))

    def testAddProduct(self):
        self.assertRaises(TypeError, 
                          self.stack.addProduct, "fw", "1.2", "Linux")
        self.assertRaises(TypeError, self.stack.addProduct, "fw")
        prod = Product("fw", "1.2")
        self.assertRaises(UnderSpecifiedProduct, self.stack.addProduct, prod)

        prod = Product("afw", "1.2", "Darwin", "/opt/sw/Darwin/afw/1.2", "none")
        self.stack.addProduct(prod)
        self.assert_(self.stack.hasProduct("afw"))
        p = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assertEquals(p.name, prod.name)
        self.assertEquals(p.version, prod.version)
        self.assertEquals(p.flavor, prod.flavor)
        self.assertEquals(p.dir, prod.dir)
        self.assertEquals(p.tablefile, prod.tablefile)
        self.assertEquals(p.db, os.path.join(testEupsStack, "ups_db"))
        self.assertEquals(len(p.tags), 0)

        self.assertRaises(ProductNotFound, 
                          self.stack.getProduct, "afw", "1.2", "Linux")
        self.assertRaises(ProductNotFound, 
                          self.stack.getProduct, "afw", "1.3", "Darwin")

        self.stack.removeProduct("afw", "Darwin", "1.2")
        self.assert_(not self.stack.hasProduct("afw"))
        self.assert_(not self.stack.removeProduct("afw", "Darwin", "1.2"))

    def testGetFlavors(self):
        flavors = self.stack.getFlavors()
        self.assertEquals(len(flavors), 1)
        self.assertEquals(flavors[0], "Darwin")
        prod = Product("afw", "1.2", "Linux", "/opt/sw/Linux/afw/1.2", "none")
        self.stack.addProduct(prod)
        flavors = self.stack.getFlavors()
        self.assertEquals(len(flavors), 2)
        expected = "Darwin Linux".split()
        for flav in expected:
            self.assert_(flav in flavors)

    def testAddFlavor(self):
        flavors = self.stack.getFlavors()
        self.assertEquals(len(flavors), 1)
        self.assertEquals(flavors[0], "Darwin")
        self.stack.addFlavor("Darwin")

        flavors = self.stack.getFlavors()
        self.assertEquals(len(flavors), 1)
        self.assertEquals(flavors[0], "Darwin")
        self.assert_(self.stack.lookup["Darwin"])

        self.stack.addFlavor("Linux")
        flavors = self.stack.getFlavors()
        self.assertEquals(len(flavors), 2)
        expected = "Darwin Linux".split()
        for flav in expected:
            self.assert_(flav in flavors)
        self.assertEquals(len(self.stack.getProductNames("Linux")), 0)
        self.assert_(not self.stack.lookup["Linux"])

    def testTags(self):
        self.assertEquals(len(self.stack.getTags()), 0)

        prod = Product("afw", "1.2", "Linux", "/opt/sw/Linux/afw/1.2", "none")
        prod.tags = ["current", "beta"]
        self.stack.addProduct(prod)
        self.assertEquals(len(self.stack.getTags()), 2)
        prod.version = "1.3"
        prod.tags = []
        self.stack.addProduct(prod)
        tags = self.stack.getTags()
        self.assertEquals(len(tags), 2)
        self.assertEquals(tags[0], "beta")
        self.assertEquals(tags[1], "current")
        prod = self.stack.getTaggedProduct("afw", "Linux", "stable")
        self.assert_(prod is None)
        prod = self.stack.getTaggedProduct("afw", "Linux", "beta")
        self.assertEqual(prod.version, "1.2")
        self.assertEqual(prod.flavor, "Linux")
        self.assertEqual(prod.db, self.dbpath)

        self.assertRaises(ProductNotFound, 
                          self.stack.assignTag, "gurn", "goober", "2")
        self.stack.assignTag("beta", "afw", "1.3")
        tags = self.stack.getTags()
        self.assertEquals(len(tags), 2)
        self.assertEquals(tags[0], "beta")
        self.assertEquals(tags[1], "current")
        prod = self.stack.getTaggedProduct("afw", "Linux", "beta")
        self.assertEqual(prod.version, "1.3")
        self.assertEqual(prod.flavor, "Linux")
        self.assertEqual(prod.db, self.dbpath)

        self.assert_(not self.stack.unassignTag("gurn", "afw", "Linux"))
        self.assert_(self.stack.unassignTag("beta", "afw"))
        tags = self.stack.getTags()
        self.assertEquals(len(tags), 1)
        self.assertEquals(tags[0], "current")

    def testSaveEmptyFlavor(self):
        self.stack.clearCache("Linux")
        cache = os.path.join(self.dbpath, 
                             ProductStack.persistFilename("Linux"))
        self.assert_(not os.path.exists(cache))

        try: 
            self.stack.save("Linux")
            self.assert_(os.path.exists(cache))
            self.stack.reload("Linux")
            flavors = self.stack.getFlavors()
            self.assertEquals(len(flavors), 2)
            expected = "Darwin Linux".split()
            for flav in expected:
                self.assert_(flav in flavors)
            self.assertEquals(len(self.stack.getProductNames("Linux")), 0)

        finally:
            if os.path.exists(cache):
                os.remove(cache)

    def testSave(self):
        self.assert_(self.stack.saveNeeded())

        self.stack.clearCache("Linux Linux64 Darwin DarwinX86 generic".split())
        self.assertEquals(len(ProductStack.findCachedFlavors(self.dbpath)),0)

        cache = os.path.join(self.dbpath, 
                             ProductStack.persistFilename("Darwin"))
        self.assert_(not os.path.exists(cache))

        self.stack.save()
        self.assert_(not self.stack.saveNeeded())
        self.assert_(os.path.exists(cache))

        saved = ProductStack.findCachedFlavors(self.dbpath)
        self.assertEquals(len(saved), 1)
        self.assertEquals(saved[0], "Darwin")

        self.stack.reload("Darwin")
        self.assertEquals(len(self.stack.getProductNames("Darwin")), 1)
        p = self.stack.getProduct("fw", "1.2", "Darwin")
        self.assertEquals(p.name, "fw")
        self.assertEquals(p.version, "1.2")
        self.assertEquals(p.flavor, "Darwin")
        self.assertEquals(p.dir, "/opt/sw/Darwin/fw/1.2")
        self.assertEquals(p.tablefile, "none")
        self.assertEquals(p.db, self.dbpath)
        

        self.stack.clearCache()
        self.assertEquals(len(ProductStack.findCachedFlavors(self.dbpath)),0)
        self.assert_(not os.path.exists(cache))

    def testLoadTable(self):
        tablefile = os.path.join(testEupsStack,"mwi.table")
        prod = Product("afw", "1.2", "Darwin", "/opt/sw/Darwin/afw/1.2", 
                       tablefile)
        self.stack.addProduct(prod)

        self.stack.loadTableFor(prod.name, prod.version, prod.flavor)
        prod = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assert_(prod._table is not None)

    def testLoadTables(self):
        tablefile = os.path.join(testEupsStack,"mwi.table")
        prod = Product("afw", "1.2", "Darwin", "/opt/sw/Darwin/afw/1.2", 
                       tablefile)
        self.stack.addProduct(prod)

        self.stack.loadTables()
        prod = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assert_(prod._table is not None)

    def testLoadTablesForFlavor(self):
        tablefile = os.path.join(testEupsStack,"mwi.table")
        prod = Product("afw", "1.2", "Darwin", "/opt/sw/Darwin/afw/1.2", 
                       tablefile)
        self.stack.addProduct(prod)

        self.stack.loadTables(flavors="Linux")
        prod = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assert_(prod._table is None)

        self.stack.loadTables(flavors="Darwin")
        prod = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assert_(prod._table is not None)

    def testLoadTablesForProd(self):
        tablefile = os.path.join(testEupsStack,"mwi.table")
        prod = Product("afw", "1.2", "Darwin", "/opt/sw/Darwin/afw/1.2", 
                       tablefile)
        self.stack.addProduct(prod)

        self.stack.loadTables("newprod")
        prod = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assert_(prod._table is None)

        self.stack.loadTables("afw")
        prod = self.stack.getProduct("afw", "1.2", "Darwin")
        self.assert_(prod._table is not None)