diff options
Diffstat (limited to 'lib/bb/tests/codeparser.py')
-rw-r--r-- | lib/bb/tests/codeparser.py | 106 |
1 files changed, 98 insertions, 8 deletions
diff --git a/lib/bb/tests/codeparser.py b/lib/bb/tests/codeparser.py index 826a2d2f6..c0d1362a0 100644 --- a/lib/bb/tests/codeparser.py +++ b/lib/bb/tests/codeparser.py @@ -44,6 +44,7 @@ class VariableReferenceTest(ReferenceTest): def parseExpression(self, exp): parsedvar = self.d.expandWithRefs(exp, None) self.references = parsedvar.references + self.execs = parsedvar.execs def test_simple_reference(self): self.setEmptyVars(["FOO"]) @@ -61,6 +62,11 @@ class VariableReferenceTest(ReferenceTest): self.parseExpression("${@d.getVar('BAR') + 'foo'}") self.assertReferences(set(["BAR"])) + def test_python_exec_reference(self): + self.parseExpression("${@eval('3 * 5')}") + self.assertReferences(set()) + self.assertExecs(set(["eval"])) + class ShellReferenceTest(ReferenceTest): def parseExpression(self, exp): @@ -100,6 +106,46 @@ ${D}${libdir}/pkgconfig/*.pc self.parseExpression("foo=$(echo bar)") self.assertExecs(set(["echo"])) + def test_assign_subshell_expansion_quotes(self): + self.parseExpression('foo="$(echo bar)"') + self.assertExecs(set(["echo"])) + + def test_assign_subshell_expansion_nested(self): + self.parseExpression('foo="$(func1 "$(func2 bar$(func3))")"') + self.assertExecs(set(["func1", "func2", "func3"])) + + def test_assign_subshell_expansion_multiple(self): + self.parseExpression('foo="$(func1 "$(func2)") $(func3)"') + self.assertExecs(set(["func1", "func2", "func3"])) + + def test_assign_subshell_expansion_escaped_quotes(self): + self.parseExpression('foo="\\"fo\\"o$(func1)"') + self.assertExecs(set(["func1"])) + + def test_assign_subshell_expansion_empty(self): + self.parseExpression('foo="bar$()foo"') + self.assertExecs(set()) + + def test_assign_subshell_backticks(self): + self.parseExpression("foo=`echo bar`") + self.assertExecs(set(["echo"])) + + def test_assign_subshell_backticks_quotes(self): + self.parseExpression('foo="`echo bar`"') + self.assertExecs(set(["echo"])) + + def test_assign_subshell_backticks_multiple(self): + self.parseExpression('foo="`func1 bar` `func2`"') + self.assertExecs(set(["func1", "func2"])) + + def test_assign_subshell_backticks_escaped_quotes(self): + self.parseExpression('foo="\\"fo\\"o`func1`"') + self.assertExecs(set(["func1"])) + + def test_assign_subshell_backticks_empty(self): + self.parseExpression('foo="bar``foo"') + self.assertExecs(set()) + def test_shell_unexpanded(self): self.setEmptyVars(["QT_BASE_NAME"]) self.parseExpression('echo "${QT_BASE_NAME}"') @@ -111,9 +157,9 @@ ${D}${libdir}/pkgconfig/*.pc self.assertExecs(set(["sed"])) def test_parameter_expansion_modifiers(self): - # - and + are also valid modifiers for parameter expansion, but are + # -,+ and : are also valid modifiers for parameter expansion, but are # valid characters in bitbake variable names, so are not included here - for i in ('=', ':-', ':=', '?', ':?', ':+', '#', '%', '##', '%%'): + for i in ('=', '?', '#', '%', '##', '%%'): name = "foo%sbar" % i self.parseExpression("${%s}" % name) self.assertNotIn(name, self.references) @@ -318,7 +364,7 @@ d.getVar(a(), False) "filename": "example.bb", }) - deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), self.d) + deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) self.assertEqual(deps, set(["somevar", "bar", "something", "inexpand", "test", "test2", "a"])) @@ -365,7 +411,7 @@ esac self.d.setVarFlags("FOO", {"func": True}) self.setEmptyVars(execs) - deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), self.d) + deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) self.assertEqual(deps, set(["somevar", "inverted"] + execs)) @@ -375,7 +421,7 @@ esac self.d.setVar("FOO", "foo=oe_libinstall; eval $foo") self.d.setVarFlag("FOO", "vardeps", "oe_libinstall") - deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), self.d) + deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) self.assertEqual(deps, set(["oe_libinstall"])) @@ -384,7 +430,7 @@ esac self.d.setVar("FOO", "foo=oe_libinstall; eval $foo") self.d.setVarFlag("FOO", "vardeps", "${@'oe_libinstall'}") - deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), self.d) + deps, values = bb.data.build_dependencies("FOO", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) self.assertEqual(deps, set(["oe_libinstall"])) @@ -399,7 +445,7 @@ esac # Check dependencies self.d.setVar('ANOTHERVAR', expr) self.d.setVar('TESTVAR', 'anothervalue testval testval2') - deps, values = bb.data.build_dependencies("ANOTHERVAR", set(self.d.keys()), set(), set(), self.d) + deps, values = bb.data.build_dependencies("ANOTHERVAR", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) self.assertEqual(sorted(values.splitlines()), sorted([expr, 'TESTVAR{anothervalue} = Set', @@ -412,11 +458,55 @@ esac # Check final value self.assertEqual(self.d.getVar('ANOTHERVAR').split(), ['anothervalue', 'yetanothervalue', 'lastone']) + def test_contains_vardeps_excluded(self): + # Check the ignored_vars option to build_dependencies is handled by contains functionality + varval = '${TESTVAR2} ${@bb.utils.filter("TESTVAR", "somevalue anothervalue", d)}' + self.d.setVar('ANOTHERVAR', varval) + self.d.setVar('TESTVAR', 'anothervalue testval testval2') + self.d.setVar('TESTVAR2', 'testval3') + deps, values = bb.data.build_dependencies("ANOTHERVAR", set(self.d.keys()), set(), set(), set(), set(["TESTVAR"]), self.d, self.d) + self.assertEqual(sorted(values.splitlines()), sorted([varval])) + self.assertEqual(deps, set(["TESTVAR2"])) + self.assertEqual(self.d.getVar('ANOTHERVAR').split(), ['testval3', 'anothervalue']) + + # Check the vardepsexclude flag is handled by contains functionality + self.d.setVarFlag('ANOTHERVAR', 'vardepsexclude', 'TESTVAR') + deps, values = bb.data.build_dependencies("ANOTHERVAR", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) + self.assertEqual(sorted(values.splitlines()), sorted([varval])) + self.assertEqual(deps, set(["TESTVAR2"])) + self.assertEqual(self.d.getVar('ANOTHERVAR').split(), ['testval3', 'anothervalue']) + + def test_contains_vardeps_override_operators(self): + # Check override operators handle dependencies correctly with the contains functionality + expr_plain = 'testval' + expr_prepend = '${@bb.utils.filter("TESTVAR1", "testval1", d)} ' + expr_append = ' ${@bb.utils.filter("TESTVAR2", "testval2", d)}' + expr_remove = '${@bb.utils.contains("TESTVAR3", "no-testval", "testval", "", d)}' + # Check dependencies + self.d.setVar('ANOTHERVAR', expr_plain) + self.d.prependVar('ANOTHERVAR', expr_prepend) + self.d.appendVar('ANOTHERVAR', expr_append) + self.d.setVar('ANOTHERVAR:remove', expr_remove) + self.d.setVar('TESTVAR1', 'blah') + self.d.setVar('TESTVAR2', 'testval2') + self.d.setVar('TESTVAR3', 'no-testval') + deps, values = bb.data.build_dependencies("ANOTHERVAR", set(self.d.keys()), set(), set(), set(), set(), self.d, self.d) + self.assertEqual(sorted(values.splitlines()), + sorted([ + expr_prepend + expr_plain + expr_append, + '_remove of ' + expr_remove, + 'TESTVAR1{testval1} = Unset', + 'TESTVAR2{testval2} = Set', + 'TESTVAR3{no-testval} = Set', + ])) + # Check final value + self.assertEqual(self.d.getVar('ANOTHERVAR').split(), ['testval2']) + #Currently no wildcard support #def test_vardeps_wildcards(self): # self.d.setVar("oe_libinstall", "echo test") # self.d.setVar("FOO", "foo=oe_libinstall; eval $foo") # self.d.setVarFlag("FOO", "vardeps", "oe_*") - # self.assertEquals(deps, set(["oe_libinstall"])) + # self.assertEqual(deps, set(["oe_libinstall"])) |