diff options
Diffstat (limited to 'bitbake/lib/bb/tests/parse.py')
-rw-r--r-- | bitbake/lib/bb/tests/parse.py | 179 |
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 = """ |
101 | RRECOMMENDS_${PN} = "a" | 101 | RRECOMMENDS:${PN} = "a" |
102 | RRECOMMENDS_${PN}_libc = "b" | 102 | RRECOMMENDS:${PN}:libc = "b" |
103 | OVERRIDES = "libc:${PN}" | 103 | OVERRIDES = "libc:${PN}" |
104 | PN = "gtk+" | 104 | PN = "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 = """ |
117 | EXTRA_OECONF = "" | 117 | EXTRA_OECONF = "" |
118 | EXTRA_OECONF_class-target = "b" | 118 | EXTRA_OECONF:class-target = "b" |
119 | EXTRA_OECONF_append = " c" | 119 | EXTRA_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 = """ |
130 | DESCRIPTION = "A" | 130 | DESCRIPTION = "A" |
131 | DESCRIPTION_${PN}-dev = "${DESCRIPTION} B" | 131 | DESCRIPTION:${PN}-dev = "${DESCRIPTION} B" |
132 | PN = "bc" | 132 | PN = "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 = """ |
147 | VAR_var_override1 = "B" | 147 | VAR_var:override1 = "B" |
148 | EXTRA = ":override1" | 148 | EXTRA = ":override1" |
149 | OVERRIDES = "nothing${EXTRA}" | 149 | OVERRIDES = "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 = """ | ||
212 | VAR = " \\ | ||
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 = """ | ||
225 | A[flag@.service] = "nonet" | ||
226 | B[flag@.target] = "ntb" | ||
227 | C[f] = "flag" | ||
228 | |||
229 | unset 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 = """ | ||
247 | inherit someclass | ||
248 | """ | ||
249 | |||
250 | export_function_recipe2 = """ | ||
251 | inherit someclass | ||
252 | |||
253 | do_compile () { | ||
254 | false | ||
255 | } | ||
256 | |||
257 | python do_compilepython () { | ||
258 | bb.note("Something else") | ||
259 | } | ||
260 | |||
261 | """ | ||
262 | export_function_class = """ | ||
263 | someclass_do_compile() { | ||
264 | true | ||
265 | } | ||
266 | |||
267 | python someclass_do_compilepython () { | ||
268 | bb.note("Something") | ||
269 | } | ||
270 | |||
271 | EXPORT_FUNCTIONS do_compile do_compilepython | ||
272 | """ | ||
273 | |||
274 | export_function_class2 = """ | ||
275 | secondclass_do_compile() { | ||
276 | true | ||
277 | } | ||
278 | |||
279 | python secondclass_do_compilepython () { | ||
280 | bb.note("Something") | ||
281 | } | ||
282 | |||
283 | EXPORT_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 | ||