# ex:ts=4:sw=4:sts=4:et # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- # # BitBake Test for lib/bb/parse/ # # Copyright (C) 2015 Richard Purdie # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import unittest import tempfile import logging import bb import os logger = logging.getLogger('BitBake.TestParse') import bb.parse import bb.data import bb.siggen class ParseTest(unittest.TestCase): testfile = """ A = "1" B = "2" do_install() { echo "hello" } C = "3" """ def setUp(self): self.d = bb.data.init() bb.parse.siggen = bb.siggen.init(self.d) def parsehelper(self, content, suffix = ".bb"): f = tempfile.NamedTemporaryFile(suffix = suffix) f.write(content) f.flush() os.chdir(os.path.dirname(f.name)) return f def test_parse_simple(self): f = self.parsehelper(self.testfile) d = bb.parse.handle(f.name, self.d)[''] self.assertEqual(d.getVar("A", True), "1") self.assertEqual(d.getVar("B", True), "2") self.assertEqual(d.getVar("C", True), "3") def test_parse_incomplete_function(self): testfileB = self.testfile.replace("}", "") f = self.parsehelper(testfileB) with self.assertRaises(bb.parse.ParseError): d = bb.parse.handle(f.name, self.d)[''] overridetest = """ RRECOMMENDS_${PN} = "a" RRECOMMENDS_${PN}_libc = "b" OVERRIDES = "libc:${PN}" PN = "gtk+" """ def test_parse_overrides(self): f = self.parsehelper(self.overridetest) d = bb.parse.handle(f.name, self.d)[''] self.assertEqual(d.getVar("RRECOMMENDS", True), "b") bb.data.expandKeys(d) self.assertEqual(d.getVar("RRECOMMENDS", True), "b") d.setVar("RRECOMMENDS_gtk+", "c") self.assertEqual(d.getVar("RRECOMMENDS", True), "c") overridetest2 = """ EXTRA_OECONF = "" EXTRA_OECONF_class-target = "b" EXTRA_OECONF_append = " c" """ def test_parse_overrides(self): f = self.parsehelper(self.overridetest2) d = bb.parse.handle(f.name, self.d)[''] d.appendVar("EXTRA_OECONF", " d") d.setVar("OVERRIDES", "class-target") self.assertEqual(d.getVar("EXTRA_OECONF", True), "b c d") overridetest3 = """ DESCRIPTION = "A" DESCRIPTION_${PN}-dev = "${DESCRIPTION} B" PN = "bc" """ def test_parse_combinations(self): f = self.parsehelper(self.overridetest3) d = bb.parse.handle(f.name, self.d)[''] bb.data.expandKeys(d) self.assertEqual(d.getVar("DESCRIPTION_bc-dev", True), "A B") d.setVar("DESCRIPTION", "E") d.setVar("DESCRIPTION_bc-dev", "C D") d.setVar("OVERRIDES", "bc-dev") self.assertEqual(d.getVar("DESCRIPTION", True), "C D") classextend = """ VAR_var_override1 = "B" EXTRA = ":override1" OVERRIDES = "nothing${EXTRA}" BBCLASSEXTEND = "###CLASS###" """ classextend_bbclass = """ EXTRA = "" python () { d.renameVar("VAR_var", "VAR_var2") } """ # # Test based upon a real world data corruption issue. One # data store changing a variable poked through into a different data # store. This test case replicates that issue where the value 'B' would # become unset/disappear. # def test_parse_classextend_contamination(self): cls = self.parsehelper(self.classextend_bbclass, suffix=".bbclass") #clsname = os.path.basename(cls.name).replace(".bbclass", "") self.classextend = self.classextend.replace("###CLASS###", cls.name) f = self.parsehelper(self.classextend) alldata = bb.parse.handle(f.name, self.d) d1 = alldata[''] d2 = alldata[cls.name] self.assertEqual(d1.getVar("VAR_var", True), "B") self.assertEqual(d2.getVar("VAR_var", True), None)