@@ -8,6 +8,8 @@
import unittest
import os
+import subprocess
+import tempfile
import bb, bb.cooker
import re
import logging
@@ -69,3 +71,53 @@ class CookerTest(unittest.TestCase):
expected = []
self.assertEqual(log_handler.logdata, expected)
+
+
+class BuildFileTest(unittest.TestCase):
+ """Tests for the buildfile ("bitbake -b") mode."""
+
+ # parse-tests BBPATH: minimal bitbake.conf whose BBFILES honours
+ # EXTRA_BBFILES and already includes *.bbappend
+ _parsetests = os.path.realpath(os.path.join(os.path.dirname(__file__), "parse-tests"))
+
+ recipe = """\
+MARKER ??= "no-bbappend"
+python do_marker() {
+ with open(d.expand("${TOPDIR}/marker.log"), "w") as f:
+ f.write(d.getVar("MARKER"))
+}
+addtask marker
+"""
+
+ bbappend = 'MARKER = "bbappend-applied"\n'
+
+ def test_buildfile_applies_bbappends(self):
+ """bitbake -b must build the recipe with its bbappends applied.
+
+ buildFileInternal() looks the appends up in self.collections[mc], which
+ on the -b path is only ever populated by matchFiles().
+ """
+ with tempfile.TemporaryDirectory(prefix="buildfilerecipes") as recipes, \
+ tempfile.TemporaryDirectory(prefix="buildfiletest") as builddir:
+ recipe = os.path.join(recipes, "appendtest.bb")
+ with open(recipe, "w") as f:
+ f.write(self.recipe)
+ with open(os.path.join(recipes, "appendtest.bbappend"), "w") as f:
+ f.write(self.bbappend)
+
+ env = os.environ.copy()
+ env["BBPATH"] = self._parsetests
+ env["BB_ENV_PASSTHROUGH_ADDITIONS"] = "TOPDIR EXTRA_BBFILES"
+ env["TOPDIR"] = builddir
+ env["EXTRA_BBFILES"] = "%s/*.bb %s/*.bbappend" % (recipes, recipes)
+
+ cmd = ["bitbake", "-b", recipe, "-c", "marker"]
+ try:
+ subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,
+ universal_newlines=True, cwd=builddir)
+ except subprocess.CalledProcessError as e:
+ self.fail("Command %s failed with %s" % (cmd, e.output))
+
+ with open(os.path.join(builddir, "marker.log")) as f:
+ self.assertEqual(f.read(), "bbappend-applied",
+ "bitbake -b did not apply the recipe's bbappend")