1*4882a593Smuzhiyun# Copyright (C) 2017-2018 Wind River Systems, Inc. 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunimport unittest 7*4882a593Smuzhiyunimport os 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunimport layerindexlib 10*4882a593Smuzhiyunfrom layerindexlib.tests.common import LayersTest 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundef skipIfNoNetwork(): 14*4882a593Smuzhiyun if os.environ.get("BB_SKIP_NETTESTS") == "yes": 15*4882a593Smuzhiyun return unittest.skip("Network tests being skipped") 16*4882a593Smuzhiyun return lambda f: f 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunclass LayerIndexWebRestApiTest(LayersTest): 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun @skipIfNoNetwork() 21*4882a593Smuzhiyun def setUp(self): 22*4882a593Smuzhiyun self.assertFalse(os.environ.get("BB_SKIP_NETTESTS") == "yes", msg="BB_SKIP_NETTESTS set, but we tried to test anyway") 23*4882a593Smuzhiyun LayersTest.setUp(self) 24*4882a593Smuzhiyun self.layerindex = layerindexlib.LayerIndex(self.d) 25*4882a593Smuzhiyun self.layerindex.load_layerindex('https://layers.openembedded.org/layerindex/api/;branch=sumo', load=['layerDependencies']) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun @skipIfNoNetwork() 28*4882a593Smuzhiyun def test_layerindex_is_empty(self): 29*4882a593Smuzhiyun self.assertFalse(self.layerindex.is_empty(), msg="Layerindex is empty") 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun @skipIfNoNetwork() 32*4882a593Smuzhiyun def test_layerindex_store_file(self): 33*4882a593Smuzhiyun self.layerindex.store_layerindex('file://%s/file.json' % self.tempdir, self.layerindex.indexes[0]) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun self.assertTrue(os.path.isfile('%s/file.json' % self.tempdir), msg="Temporary file was not created by store_layerindex") 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun reload = layerindexlib.LayerIndex(self.d) 38*4882a593Smuzhiyun reload.load_layerindex('file://%s/file.json' % self.tempdir) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun self.assertFalse(reload.is_empty(), msg="Layerindex is empty") 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun # Calculate layerItems in original index that should NOT be in reload 43*4882a593Smuzhiyun layerItemNames = [] 44*4882a593Smuzhiyun for itemId in self.layerindex.indexes[0].layerItems: 45*4882a593Smuzhiyun layerItemNames.append(self.layerindex.indexes[0].layerItems[itemId].name) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun for layerBranchId in self.layerindex.indexes[0].layerBranches: 48*4882a593Smuzhiyun layerItemNames.remove(self.layerindex.indexes[0].layerBranches[layerBranchId].layer.name) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun for itemId in reload.indexes[0].layerItems: 51*4882a593Smuzhiyun self.assertFalse(reload.indexes[0].layerItems[itemId].name in layerItemNames, msg="Item reloaded when it shouldn't have been") 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun # Compare the original to what we wrote... 54*4882a593Smuzhiyun for type in self.layerindex.indexes[0]._index: 55*4882a593Smuzhiyun if type == 'apilinks' or \ 56*4882a593Smuzhiyun type == 'layerItems' or \ 57*4882a593Smuzhiyun type in self.layerindex.indexes[0].config['local']: 58*4882a593Smuzhiyun continue 59*4882a593Smuzhiyun for id in getattr(self.layerindex.indexes[0], type): 60*4882a593Smuzhiyun self.logger.debug("type %s" % (type)) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun self.assertTrue(id in getattr(reload.indexes[0], type), msg="Id number not in reloaded index") 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun self.logger.debug("%s ? %s" % (getattr(self.layerindex.indexes[0], type)[id], getattr(reload.indexes[0], type)[id])) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun self.assertEqual(getattr(self.layerindex.indexes[0], type)[id], getattr(reload.indexes[0], type)[id], msg="Reloaded contents different") 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun @skipIfNoNetwork() 69*4882a593Smuzhiyun def test_layerindex_store_split(self): 70*4882a593Smuzhiyun self.layerindex.store_layerindex('file://%s' % self.tempdir, self.layerindex.indexes[0]) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun reload = layerindexlib.LayerIndex(self.d) 73*4882a593Smuzhiyun reload.load_layerindex('file://%s' % self.tempdir) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun self.assertFalse(reload.is_empty(), msg="Layer index is empty") 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun for type in self.layerindex.indexes[0]._index: 78*4882a593Smuzhiyun if type == 'apilinks' or \ 79*4882a593Smuzhiyun type == 'layerItems' or \ 80*4882a593Smuzhiyun type in self.layerindex.indexes[0].config['local']: 81*4882a593Smuzhiyun continue 82*4882a593Smuzhiyun for id in getattr(self.layerindex.indexes[0] ,type): 83*4882a593Smuzhiyun self.logger.debug("type %s" % (type)) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun self.assertTrue(id in getattr(reload.indexes[0], type), msg="Id number missing from reloaded data") 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun self.logger.debug("%s ? %s" % (getattr(self.layerindex.indexes[0] ,type)[id], getattr(reload.indexes[0], type)[id])) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun self.assertEqual(getattr(self.layerindex.indexes[0] ,type)[id], getattr(reload.indexes[0], type)[id], msg="reloaded data does not match original") 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun @skipIfNoNetwork() 92*4882a593Smuzhiyun def test_dependency_resolution(self): 93*4882a593Smuzhiyun # Verify depth first searching... 94*4882a593Smuzhiyun (dependencies, invalidnames) = self.layerindex.find_dependencies(names=['meta-python']) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun first = True 97*4882a593Smuzhiyun for deplayerbranch in dependencies: 98*4882a593Smuzhiyun layerBranch = dependencies[deplayerbranch][0] 99*4882a593Smuzhiyun layerDeps = dependencies[deplayerbranch][1:] 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun if not first: 102*4882a593Smuzhiyun continue 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun first = False 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun # Top of the deps should be openembedded-core, since everything depends on it. 107*4882a593Smuzhiyun self.assertEqual(layerBranch.layer.name, "openembedded-core", msg='OpenEmbedded-Core is no the first dependency') 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun # meta-python should cause an openembedded-core dependency, if not assert! 110*4882a593Smuzhiyun for dep in layerDeps: 111*4882a593Smuzhiyun if dep.layer.name == 'meta-python': 112*4882a593Smuzhiyun break 113*4882a593Smuzhiyun else: 114*4882a593Smuzhiyun self.logger.debug("meta-python was not found") 115*4882a593Smuzhiyun raise self.failureException 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun # Only check the first element... 118*4882a593Smuzhiyun break 119*4882a593Smuzhiyun else: 120*4882a593Smuzhiyun # Empty list, this is bad. 121*4882a593Smuzhiyun self.logger.debug("Empty list of dependencies") 122*4882a593Smuzhiyun self.assertIsNotNone(first, msg="Empty list of dependencies") 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun # Last dep should be the requested item 125*4882a593Smuzhiyun layerBranch = dependencies[deplayerbranch][0] 126*4882a593Smuzhiyun self.assertEqual(layerBranch.layer.name, "meta-python", msg="Last dependency not meta-python") 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun @skipIfNoNetwork() 129*4882a593Smuzhiyun def test_find_collection(self): 130*4882a593Smuzhiyun def _check(collection, expected): 131*4882a593Smuzhiyun self.logger.debug("Looking for collection %s..." % collection) 132*4882a593Smuzhiyun result = self.layerindex.find_collection(collection) 133*4882a593Smuzhiyun if expected: 134*4882a593Smuzhiyun self.assertIsNotNone(result, msg="Did not find %s when it should be there" % collection) 135*4882a593Smuzhiyun else: 136*4882a593Smuzhiyun self.assertIsNone(result, msg="Found %s when it shouldn't be there" % collection) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun tests = [ ('core', True), 139*4882a593Smuzhiyun ('openembedded-core', False), 140*4882a593Smuzhiyun ('networking-layer', True), 141*4882a593Smuzhiyun ('meta-python', True), 142*4882a593Smuzhiyun ('openembedded-layer', True), 143*4882a593Smuzhiyun ('notpresent', False) ] 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun for collection,result in tests: 146*4882a593Smuzhiyun _check(collection, result) 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun @skipIfNoNetwork() 149*4882a593Smuzhiyun def test_find_layerbranch(self): 150*4882a593Smuzhiyun def _check(name, expected): 151*4882a593Smuzhiyun self.logger.debug("Looking for layerbranch %s..." % name) 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun for index in self.layerindex.indexes: 154*4882a593Smuzhiyun for layerbranchid in index.layerBranches: 155*4882a593Smuzhiyun self.logger.debug("Present: %s" % index.layerBranches[layerbranchid].layer.name) 156*4882a593Smuzhiyun result = self.layerindex.find_layerbranch(name) 157*4882a593Smuzhiyun if expected: 158*4882a593Smuzhiyun self.assertIsNotNone(result, msg="Did not find %s when it should be there" % collection) 159*4882a593Smuzhiyun else: 160*4882a593Smuzhiyun self.assertIsNone(result, msg="Found %s when it shouldn't be there" % collection) 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun tests = [ ('openembedded-core', True), 163*4882a593Smuzhiyun ('core', False), 164*4882a593Smuzhiyun ('meta-networking', True), 165*4882a593Smuzhiyun ('meta-python', True), 166*4882a593Smuzhiyun ('meta-oe', True), 167*4882a593Smuzhiyun ('notpresent', False) ] 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun for collection,result in tests: 170*4882a593Smuzhiyun _check(collection, result) 171*4882a593Smuzhiyun 172