summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/tests/parse.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/tests/parse.py')
-rw-r--r--bitbake/lib/bb/tests/parse.py179
1 files changed, 163 insertions, 16 deletions
diff --git a/bitbake/lib/bb/tests/parse.py b/bitbake/lib/bb/tests/parse.py
index 9e21e18425..72d1962e7e 100644
--- a/bitbake/lib/bb/tests/parse.py
+++ b/bitbake/lib/bb/tests/parse.py
@@ -98,8 +98,8 @@ exportD = "d"
98 98
99 99
100 overridetest = """ 100 overridetest = """
101RRECOMMENDS_${PN} = "a" 101RRECOMMENDS:${PN} = "a"
102RRECOMMENDS_${PN}_libc = "b" 102RRECOMMENDS:${PN}:libc = "b"
103OVERRIDES = "libc:${PN}" 103OVERRIDES = "libc:${PN}"
104PN = "gtk+" 104PN = "gtk+"
105""" 105"""
@@ -110,16 +110,16 @@ PN = "gtk+"
110 self.assertEqual(d.getVar("RRECOMMENDS"), "b") 110 self.assertEqual(d.getVar("RRECOMMENDS"), "b")
111 bb.data.expandKeys(d) 111 bb.data.expandKeys(d)
112 self.assertEqual(d.getVar("RRECOMMENDS"), "b") 112 self.assertEqual(d.getVar("RRECOMMENDS"), "b")
113 d.setVar("RRECOMMENDS_gtk+", "c") 113 d.setVar("RRECOMMENDS:gtk+", "c")
114 self.assertEqual(d.getVar("RRECOMMENDS"), "c") 114 self.assertEqual(d.getVar("RRECOMMENDS"), "c")
115 115
116 overridetest2 = """ 116 overridetest2 = """
117EXTRA_OECONF = "" 117EXTRA_OECONF = ""
118EXTRA_OECONF_class-target = "b" 118EXTRA_OECONF:class-target = "b"
119EXTRA_OECONF_append = " c" 119EXTRA_OECONF:append = " c"
120""" 120"""
121 121
122 def test_parse_overrides(self): 122 def test_parse_overrides2(self):
123 f = self.parsehelper(self.overridetest2) 123 f = self.parsehelper(self.overridetest2)
124 d = bb.parse.handle(f.name, self.d)[''] 124 d = bb.parse.handle(f.name, self.d)['']
125 d.appendVar("EXTRA_OECONF", " d") 125 d.appendVar("EXTRA_OECONF", " d")
@@ -128,7 +128,7 @@ EXTRA_OECONF_append = " c"
128 128
129 overridetest3 = """ 129 overridetest3 = """
130DESCRIPTION = "A" 130DESCRIPTION = "A"
131DESCRIPTION_${PN}-dev = "${DESCRIPTION} B" 131DESCRIPTION:${PN}-dev = "${DESCRIPTION} B"
132PN = "bc" 132PN = "bc"
133""" 133"""
134 134
@@ -136,15 +136,15 @@ PN = "bc"
136 f = self.parsehelper(self.overridetest3) 136 f = self.parsehelper(self.overridetest3)
137 d = bb.parse.handle(f.name, self.d)[''] 137 d = bb.parse.handle(f.name, self.d)['']
138 bb.data.expandKeys(d) 138 bb.data.expandKeys(d)
139 self.assertEqual(d.getVar("DESCRIPTION_bc-dev"), "A B") 139 self.assertEqual(d.getVar("DESCRIPTION:bc-dev"), "A B")
140 d.setVar("DESCRIPTION", "E") 140 d.setVar("DESCRIPTION", "E")
141 d.setVar("DESCRIPTION_bc-dev", "C D") 141 d.setVar("DESCRIPTION:bc-dev", "C D")
142 d.setVar("OVERRIDES", "bc-dev") 142 d.setVar("OVERRIDES", "bc-dev")
143 self.assertEqual(d.getVar("DESCRIPTION"), "C D") 143 self.assertEqual(d.getVar("DESCRIPTION"), "C D")
144 144
145 145
146 classextend = """ 146 classextend = """
147VAR_var_override1 = "B" 147VAR_var:override1 = "B"
148EXTRA = ":override1" 148EXTRA = ":override1"
149OVERRIDES = "nothing${EXTRA}" 149OVERRIDES = "nothing${EXTRA}"
150 150
@@ -164,6 +164,7 @@ python () {
164 # become unset/disappear. 164 # become unset/disappear.
165 # 165 #
166 def test_parse_classextend_contamination(self): 166 def test_parse_classextend_contamination(self):
167 self.d.setVar("__bbclasstype", "recipe")
167 cls = self.parsehelper(self.classextend_bbclass, suffix=".bbclass") 168 cls = self.parsehelper(self.classextend_bbclass, suffix=".bbclass")
168 #clsname = os.path.basename(cls.name).replace(".bbclass", "") 169 #clsname = os.path.basename(cls.name).replace(".bbclass", "")
169 self.classextend = self.classextend.replace("###CLASS###", cls.name) 170 self.classextend = self.classextend.replace("###CLASS###", cls.name)
@@ -185,12 +186,158 @@ deltask ${EMPTYVAR}
185""" 186"""
186 def test_parse_addtask_deltask(self): 187 def test_parse_addtask_deltask(self):
187 import sys 188 import sys
188 f = self.parsehelper(self.addtask_deltask) 189
190 with self.assertLogs() as logs:
191 f = self.parsehelper(self.addtask_deltask)
192 d = bb.parse.handle(f.name, self.d)['']
193
194 output = "".join(logs.output)
195 self.assertTrue("addtask contained multiple 'before' keywords" in output)
196 self.assertTrue("addtask contained multiple 'after' keywords" in output)
197 self.assertTrue('addtask ignored: " do_patch"' in output)
198 #self.assertTrue('dependent task do_foo for do_patch does not exist' in output)
199
200 broken_multiline_comment = """
201# First line of comment \\
202# Second line of comment \\
203
204"""
205 def test_parse_broken_multiline_comment(self):
206 f = self.parsehelper(self.broken_multiline_comment)
207 with self.assertRaises(bb.BBHandledException):
208 d = bb.parse.handle(f.name, self.d)['']
209
210
211 comment_in_var = """
212VAR = " \\
213 SOMEVAL \\
214# some comment \\
215 SOMEOTHERVAL \\
216"
217"""
218 def test_parse_comment_in_var(self):
219 f = self.parsehelper(self.comment_in_var)
220 with self.assertRaises(bb.BBHandledException):
221 d = bb.parse.handle(f.name, self.d)['']
222
223
224 at_sign_in_var_flag = """
225A[flag@.service] = "nonet"
226B[flag@.target] = "ntb"
227C[f] = "flag"
228
229unset A[flag@.service]
230"""
231 def test_parse_at_sign_in_var_flag(self):
232 f = self.parsehelper(self.at_sign_in_var_flag)
189 d = bb.parse.handle(f.name, self.d)[''] 233 d = bb.parse.handle(f.name, self.d)['']
234 self.assertEqual(d.getVar("A"), None)
235 self.assertEqual(d.getVar("B"), None)
236 self.assertEqual(d.getVarFlag("A","flag@.service"), None)
237 self.assertEqual(d.getVarFlag("B","flag@.target"), "ntb")
238 self.assertEqual(d.getVarFlag("C","f"), "flag")
239
240 def test_parse_invalid_at_sign_in_var_flag(self):
241 invalid_at_sign = self.at_sign_in_var_flag.replace("B[f", "B[@f")
242 f = self.parsehelper(invalid_at_sign)
243 with self.assertRaises(bb.parse.ParseError):
244 d = bb.parse.handle(f.name, self.d)['']
245
246 export_function_recipe = """
247inherit someclass
248"""
249
250 export_function_recipe2 = """
251inherit someclass
252
253do_compile () {
254 false
255}
256
257python do_compilepython () {
258 bb.note("Something else")
259}
260
261"""
262 export_function_class = """
263someclass_do_compile() {
264 true
265}
266
267python someclass_do_compilepython () {
268 bb.note("Something")
269}
270
271EXPORT_FUNCTIONS do_compile do_compilepython
272"""
273
274 export_function_class2 = """
275secondclass_do_compile() {
276 true
277}
278
279python secondclass_do_compilepython () {
280 bb.note("Something")
281}
282
283EXPORT_FUNCTIONS do_compile do_compilepython
284"""
190 285
191 stdout = sys.stdout.getvalue() 286 def test_parse_export_functions(self):
192 self.assertTrue("addtask contained multiple 'before' keywords" in stdout) 287 def check_function_flags(d):
193 self.assertTrue("addtask contained multiple 'after' keywords" in stdout) 288 self.assertEqual(d.getVarFlag("do_compile", "func"), 1)
194 self.assertTrue('addtask ignored: " do_patch"' in stdout) 289 self.assertEqual(d.getVarFlag("do_compilepython", "func"), 1)
195 #self.assertTrue('dependent task do_foo for do_patch does not exist' in stdout) 290 self.assertEqual(d.getVarFlag("do_compile", "python"), None)
291 self.assertEqual(d.getVarFlag("do_compilepython", "python"), "1")
292
293 with tempfile.TemporaryDirectory() as tempdir:
294 self.d.setVar("__bbclasstype", "recipe")
295 recipename = tempdir + "/recipe.bb"
296 os.makedirs(tempdir + "/classes")
297 with open(tempdir + "/classes/someclass.bbclass", "w") as f:
298 f.write(self.export_function_class)
299 f.flush()
300 with open(tempdir + "/classes/secondclass.bbclass", "w") as f:
301 f.write(self.export_function_class2)
302 f.flush()
303
304 with open(recipename, "w") as f:
305 f.write(self.export_function_recipe)
306 f.flush()
307 os.chdir(tempdir)
308 d = bb.parse.handle(recipename, bb.data.createCopy(self.d))['']
309 self.assertIn("someclass_do_compile", d.getVar("do_compile"))
310 self.assertIn("someclass_do_compilepython", d.getVar("do_compilepython"))
311 check_function_flags(d)
312
313 recipename2 = tempdir + "/recipe2.bb"
314 with open(recipename2, "w") as f:
315 f.write(self.export_function_recipe2)
316 f.flush()
317
318 d = bb.parse.handle(recipename2, bb.data.createCopy(self.d))['']
319 self.assertNotIn("someclass_do_compile", d.getVar("do_compile"))
320 self.assertNotIn("someclass_do_compilepython", d.getVar("do_compilepython"))
321 self.assertIn("false", d.getVar("do_compile"))
322 self.assertIn("else", d.getVar("do_compilepython"))
323 check_function_flags(d)
324
325 with open(recipename, "a+") as f:
326 f.write("\ninherit secondclass\n")
327 f.flush()
328 with open(recipename2, "a+") as f:
329 f.write("\ninherit secondclass\n")
330 f.flush()
331
332 d = bb.parse.handle(recipename, bb.data.createCopy(self.d))['']
333 self.assertIn("secondclass_do_compile", d.getVar("do_compile"))
334 self.assertIn("secondclass_do_compilepython", d.getVar("do_compilepython"))
335 check_function_flags(d)
336
337 d = bb.parse.handle(recipename2, bb.data.createCopy(self.d))['']
338 self.assertNotIn("someclass_do_compile", d.getVar("do_compile"))
339 self.assertNotIn("someclass_do_compilepython", d.getVar("do_compilepython"))
340 self.assertIn("false", d.getVar("do_compile"))
341 self.assertIn("else", d.getVar("do_compilepython"))
342 check_function_flags(d)
196 343