blob: 0b2706af02e8ad9cd6fdb2d0ad8bc11ca57d45d6 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001# ex:ts=4:sw=4:sts=4:et
2# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
3#
4# BitBake Test for lib/bb/parse/
5#
6# Copyright (C) 2015 Richard Purdie
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License version 2 as
10# published by the Free Software Foundation.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License along
18# with this program; if not, write to the Free Software Foundation, Inc.,
19# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20#
21
22import unittest
23import tempfile
24import logging
25import bb
26import os
27
28logger = logging.getLogger('BitBake.TestParse')
29
30import bb.parse
31import bb.data
32import bb.siggen
33
34class ParseTest(unittest.TestCase):
35
36 testfile = """
37A = "1"
38B = "2"
39do_install() {
40 echo "hello"
41}
42
43C = "3"
44"""
45
46 def setUp(self):
47 self.d = bb.data.init()
48 bb.parse.siggen = bb.siggen.init(self.d)
49
50 def parsehelper(self, content, suffix = ".bb"):
51
52 f = tempfile.NamedTemporaryFile(suffix = suffix)
Patrick Williamsc0f7c042017-02-23 20:41:17 -060053 f.write(bytes(content, "utf-8"))
Patrick Williamsc124f4f2015-09-15 14:41:29 -050054 f.flush()
55 os.chdir(os.path.dirname(f.name))
56 return f
57
58 def test_parse_simple(self):
59 f = self.parsehelper(self.testfile)
60 d = bb.parse.handle(f.name, self.d)['']
61 self.assertEqual(d.getVar("A", True), "1")
62 self.assertEqual(d.getVar("B", True), "2")
63 self.assertEqual(d.getVar("C", True), "3")
64
65 def test_parse_incomplete_function(self):
66 testfileB = self.testfile.replace("}", "")
67 f = self.parsehelper(testfileB)
68 with self.assertRaises(bb.parse.ParseError):
69 d = bb.parse.handle(f.name, self.d)['']
70
Patrick Williamsc0f7c042017-02-23 20:41:17 -060071 unsettest = """
72A = "1"
73B = "2"
74B[flag] = "3"
75
76unset A
77unset B[flag]
78"""
79
80 def test_parse_unset(self):
81 f = self.parsehelper(self.unsettest)
82 d = bb.parse.handle(f.name, self.d)['']
83 self.assertEqual(d.getVar("A", True), None)
84 self.assertEqual(d.getVarFlag("A","flag", True), None)
85 self.assertEqual(d.getVar("B", True), "2")
86
87
Patrick Williamsc124f4f2015-09-15 14:41:29 -050088 overridetest = """
89RRECOMMENDS_${PN} = "a"
90RRECOMMENDS_${PN}_libc = "b"
91OVERRIDES = "libc:${PN}"
92PN = "gtk+"
93"""
94
95 def test_parse_overrides(self):
96 f = self.parsehelper(self.overridetest)
97 d = bb.parse.handle(f.name, self.d)['']
98 self.assertEqual(d.getVar("RRECOMMENDS", True), "b")
99 bb.data.expandKeys(d)
100 self.assertEqual(d.getVar("RRECOMMENDS", True), "b")
101 d.setVar("RRECOMMENDS_gtk+", "c")
102 self.assertEqual(d.getVar("RRECOMMENDS", True), "c")
103
104 overridetest2 = """
105EXTRA_OECONF = ""
106EXTRA_OECONF_class-target = "b"
107EXTRA_OECONF_append = " c"
108"""
109
110 def test_parse_overrides(self):
111 f = self.parsehelper(self.overridetest2)
112 d = bb.parse.handle(f.name, self.d)['']
113 d.appendVar("EXTRA_OECONF", " d")
114 d.setVar("OVERRIDES", "class-target")
115 self.assertEqual(d.getVar("EXTRA_OECONF", True), "b c d")
116
117 overridetest3 = """
118DESCRIPTION = "A"
119DESCRIPTION_${PN}-dev = "${DESCRIPTION} B"
120PN = "bc"
121"""
122
123 def test_parse_combinations(self):
124 f = self.parsehelper(self.overridetest3)
125 d = bb.parse.handle(f.name, self.d)['']
126 bb.data.expandKeys(d)
127 self.assertEqual(d.getVar("DESCRIPTION_bc-dev", True), "A B")
128 d.setVar("DESCRIPTION", "E")
129 d.setVar("DESCRIPTION_bc-dev", "C D")
130 d.setVar("OVERRIDES", "bc-dev")
131 self.assertEqual(d.getVar("DESCRIPTION", True), "C D")
132
133
134 classextend = """
135VAR_var_override1 = "B"
136EXTRA = ":override1"
137OVERRIDES = "nothing${EXTRA}"
138
139BBCLASSEXTEND = "###CLASS###"
140"""
141 classextend_bbclass = """
142EXTRA = ""
143python () {
144 d.renameVar("VAR_var", "VAR_var2")
145}
146"""
147
148 #
149 # Test based upon a real world data corruption issue. One
150 # data store changing a variable poked through into a different data
151 # store. This test case replicates that issue where the value 'B' would
152 # become unset/disappear.
153 #
154 def test_parse_classextend_contamination(self):
155 cls = self.parsehelper(self.classextend_bbclass, suffix=".bbclass")
156 #clsname = os.path.basename(cls.name).replace(".bbclass", "")
157 self.classextend = self.classextend.replace("###CLASS###", cls.name)
158 f = self.parsehelper(self.classextend)
159 alldata = bb.parse.handle(f.name, self.d)
160 d1 = alldata['']
161 d2 = alldata[cls.name]
162 self.assertEqual(d1.getVar("VAR_var", True), "B")
163 self.assertEqual(d2.getVar("VAR_var", True), None)
164