1*4882a593Smuzhiyun# Copyright (C) 2018 Wind River Systems, Inc. 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun 6*4882a593Smuzhiyunimport os 7*4882a593Smuzhiyunimport bb 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunimport layerindexlib 10*4882a593Smuzhiyunfrom layerindexlib.tests.common import LayersTest 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunclass LayerIndexCookerTest(LayersTest): 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun def setUp(self): 16*4882a593Smuzhiyun LayersTest.setUp(self) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun # Note this is NOT a comprehensive test of cooker, as we can't easily 19*4882a593Smuzhiyun # configure the test data. But we can emulate the basics of the layer.conf 20*4882a593Smuzhiyun # files, so that is what we will do. 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun new_topdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "testdata") 23*4882a593Smuzhiyun new_bbpath = os.path.join(new_topdir, "build") 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun self.d.setVar('TOPDIR', new_topdir) 26*4882a593Smuzhiyun self.d.setVar('BBPATH', new_bbpath) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun self.d = bb.parse.handle("%s/conf/bblayers.conf" % new_bbpath, self.d, True) 29*4882a593Smuzhiyun for layer in self.d.getVar('BBLAYERS').split(): 30*4882a593Smuzhiyun self.d = bb.parse.handle("%s/conf/layer.conf" % layer, self.d, True) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun self.layerindex = layerindexlib.LayerIndex(self.d) 33*4882a593Smuzhiyun self.layerindex.load_layerindex('cooker://', load=['layerDependencies']) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun def test_layerindex_is_empty(self): 36*4882a593Smuzhiyun self.assertFalse(self.layerindex.is_empty(), msg="Layerindex is not empty!") 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun def test_dependency_resolution(self): 39*4882a593Smuzhiyun # Verify depth first searching... 40*4882a593Smuzhiyun (dependencies, invalidnames) = self.layerindex.find_dependencies(names=['meta-python']) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun first = True 43*4882a593Smuzhiyun for deplayerbranch in dependencies: 44*4882a593Smuzhiyun layerBranch = dependencies[deplayerbranch][0] 45*4882a593Smuzhiyun layerDeps = dependencies[deplayerbranch][1:] 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun if not first: 48*4882a593Smuzhiyun continue 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun first = False 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun # Top of the deps should be openembedded-core, since everything depends on it. 53*4882a593Smuzhiyun self.assertEqual(layerBranch.layer.name, "openembedded-core", msg='Top dependency not openembedded-core') 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun # meta-python should cause an openembedded-core dependency, if not assert! 56*4882a593Smuzhiyun for dep in layerDeps: 57*4882a593Smuzhiyun if dep.layer.name == 'meta-python': 58*4882a593Smuzhiyun break 59*4882a593Smuzhiyun else: 60*4882a593Smuzhiyun self.assertTrue(False, msg='meta-python was not found') 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun # Only check the first element... 63*4882a593Smuzhiyun break 64*4882a593Smuzhiyun else: 65*4882a593Smuzhiyun if first: 66*4882a593Smuzhiyun # Empty list, this is bad. 67*4882a593Smuzhiyun self.assertTrue(False, msg='Empty list of dependencies') 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun # Last dep should be the requested item 70*4882a593Smuzhiyun layerBranch = dependencies[deplayerbranch][0] 71*4882a593Smuzhiyun self.assertEqual(layerBranch.layer.name, "meta-python", msg='Last dependency not meta-python') 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun def test_find_collection(self): 74*4882a593Smuzhiyun def _check(collection, expected): 75*4882a593Smuzhiyun self.logger.debug("Looking for collection %s..." % collection) 76*4882a593Smuzhiyun result = self.layerindex.find_collection(collection) 77*4882a593Smuzhiyun if expected: 78*4882a593Smuzhiyun self.assertIsNotNone(result, msg="Did not find %s when it shouldn't be there" % collection) 79*4882a593Smuzhiyun else: 80*4882a593Smuzhiyun self.assertIsNone(result, msg="Found %s when it should be there" % collection) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun tests = [ ('core', True), 83*4882a593Smuzhiyun ('openembedded-core', False), 84*4882a593Smuzhiyun ('networking-layer', True), 85*4882a593Smuzhiyun ('meta-python', True), 86*4882a593Smuzhiyun ('openembedded-layer', True), 87*4882a593Smuzhiyun ('notpresent', False) ] 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun for collection,result in tests: 90*4882a593Smuzhiyun _check(collection, result) 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun def test_find_layerbranch(self): 93*4882a593Smuzhiyun def _check(name, expected): 94*4882a593Smuzhiyun self.logger.debug("Looking for layerbranch %s..." % name) 95*4882a593Smuzhiyun result = self.layerindex.find_layerbranch(name) 96*4882a593Smuzhiyun if expected: 97*4882a593Smuzhiyun self.assertIsNotNone(result, msg="Did not find %s when it shouldn't be there" % collection) 98*4882a593Smuzhiyun else: 99*4882a593Smuzhiyun self.assertIsNone(result, msg="Found %s when it should be there" % collection) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun tests = [ ('openembedded-core', True), 102*4882a593Smuzhiyun ('core', False), 103*4882a593Smuzhiyun ('networking-layer', True), 104*4882a593Smuzhiyun ('meta-python', True), 105*4882a593Smuzhiyun ('openembedded-layer', True), 106*4882a593Smuzhiyun ('notpresent', False) ] 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun for collection,result in tests: 109*4882a593Smuzhiyun _check(collection, result) 110*4882a593Smuzhiyun 111