diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-07-10 14:26:37 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-07-15 10:28:12 +0100 |
commit | 7484fb49a4fb2e84729ce11c4c8c0433a8365dc3 (patch) | |
tree | 0e481bb23c29983e597985445b01a3d296636012 /bitbake/lib | |
parent | 39ef064da5998b1bf1d47d10a9622e9fe4107796 (diff) | |
download | poky-7484fb49a4fb2e84729ce11c4c8c0433a8365dc3.tar.gz |
bitbake: tests: Add initial scenario based test for runqueue
We need some tests for runqueue, its been something which has been hard to test
for a long time. Add some dummy metadata to allow this, mirroring the OE
structure in spirit.
(Bitbake rev: 37564d7440c5d7aa05ec537f3b79026b1c83bb68)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
9 files changed, 441 insertions, 0 deletions
diff --git a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass new file mode 100644 index 0000000000..e174c02dd6 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass | |||
@@ -0,0 +1,219 @@ | |||
1 | SLOWTASKS ??= "" | ||
2 | SSTATEVALID ??= "" | ||
3 | |||
4 | def stamptask(d): | ||
5 | import time | ||
6 | |||
7 | thistask = d.expand("${PN}:${BB_CURRENTTASK}") | ||
8 | if thistask in d.getVar("SLOWTASKS").split(): | ||
9 | bb.note("Slowing task %s" % thistask) | ||
10 | time.sleep(0.5) | ||
11 | |||
12 | with open(d.expand("${TOPDIR}/task.log"), "a+") as f: | ||
13 | f.write(thistask + "\n") | ||
14 | |||
15 | python do_fetch() { | ||
16 | stamptask(d) | ||
17 | } | ||
18 | python do_unpack() { | ||
19 | stamptask(d) | ||
20 | } | ||
21 | python do_patch() { | ||
22 | stamptask(d) | ||
23 | } | ||
24 | python do_populate_lic() { | ||
25 | stamptask(d) | ||
26 | } | ||
27 | python do_prepare_recipe_sysroot() { | ||
28 | stamptask(d) | ||
29 | } | ||
30 | python do_configure() { | ||
31 | stamptask(d) | ||
32 | } | ||
33 | python do_compile() { | ||
34 | stamptask(d) | ||
35 | } | ||
36 | python do_install() { | ||
37 | stamptask(d) | ||
38 | } | ||
39 | python do_populate_sysroot() { | ||
40 | stamptask(d) | ||
41 | } | ||
42 | python do_package() { | ||
43 | stamptask(d) | ||
44 | } | ||
45 | python do_package_write_ipk() { | ||
46 | stamptask(d) | ||
47 | } | ||
48 | python do_package_write_rpm() { | ||
49 | stamptask(d) | ||
50 | } | ||
51 | python do_packagedata() { | ||
52 | stamptask(d) | ||
53 | } | ||
54 | python do_package_qa() { | ||
55 | stamptask(d) | ||
56 | } | ||
57 | python do_build() { | ||
58 | stamptask(d) | ||
59 | } | ||
60 | do_prepare_recipe_sysroot[deptask] = "do_populate_sysroot" | ||
61 | do_package[deptask] += "do_packagedata" | ||
62 | do_build[recrdeptask] += "do_deploy" | ||
63 | do_build[recrdeptask] += "do_package_write_ipk" | ||
64 | do_build[recrdeptask] += "do_package_write_rpm" | ||
65 | do_package_qa[rdeptask] = "do_packagedata" | ||
66 | do_populate_lic_deploy[recrdeptask] += "do_populate_lic do_deploy" | ||
67 | |||
68 | DEBIANRDEP = "do_packagedata" | ||
69 | oo_package_write_ipk[rdeptask] = "${DEBIANRDEP}" | ||
70 | do_package_write_rpm[rdeptask] = "${DEBIANRDEP}" | ||
71 | |||
72 | addtask fetch | ||
73 | addtask unpack after do_fetch | ||
74 | addtask patch after do_unpack | ||
75 | addtask prepare_recipe_sysroot after do_patch | ||
76 | addtask configure after do_prepare_recipe_sysroot | ||
77 | addtask compile after do_configure | ||
78 | addtask install after do_compile | ||
79 | addtask populate_sysroot after do_install | ||
80 | addtask package after do_install | ||
81 | addtask package_write_ipk after do_packagedata do_package | ||
82 | addtask package_write_rpm after do_packagedata do_package | ||
83 | addtask packagedata after do_package | ||
84 | addtask package_qa after do_package | ||
85 | addtask build after do_package_qa do_package_write_rpm do_package_write_ipk do_populate_sysroot | ||
86 | |||
87 | python do_package_setscene() { | ||
88 | stamptask(d) | ||
89 | } | ||
90 | python do_package_qa_setscene() { | ||
91 | stamptask(d) | ||
92 | } | ||
93 | python do_package_write_ipk_setscene() { | ||
94 | stamptask(d) | ||
95 | } | ||
96 | python do_package_write_rpm_setscene() { | ||
97 | stamptask(d) | ||
98 | } | ||
99 | python do_packagedata_setscene() { | ||
100 | stamptask(d) | ||
101 | } | ||
102 | python do_populate_lic_setscene() { | ||
103 | stamptask(d) | ||
104 | } | ||
105 | python do_populate_sysroot_setscene() { | ||
106 | stamptask(d) | ||
107 | } | ||
108 | |||
109 | addtask package_setscene | ||
110 | addtask package_qa_setscene | ||
111 | addtask package_write_ipk_setscene | ||
112 | addtask package_write_rpm_setscene | ||
113 | addtask packagedata_setscene | ||
114 | addtask populate_lic_setscene | ||
115 | addtask populate_sysroot_setscene | ||
116 | |||
117 | BB_SETSCENE_DEPVALID = "setscene_depvalid" | ||
118 | |||
119 | def setscene_depvalid(task, taskdependees, notneeded, d, log=None): | ||
120 | # taskdependees is a dict of tasks which depend on task, each being a 3 item list of [PN, TASKNAME, FILENAME] | ||
121 | # task is included in taskdependees too | ||
122 | # Return - False - We need this dependency | ||
123 | # - True - We can skip this dependency | ||
124 | import re | ||
125 | |||
126 | def logit(msg, log): | ||
127 | if log is not None: | ||
128 | log.append(msg) | ||
129 | else: | ||
130 | bb.debug(2, msg) | ||
131 | |||
132 | logit("Considering setscene task: %s" % (str(taskdependees[task])), log) | ||
133 | |||
134 | def isNativeCross(x): | ||
135 | return x.endswith("-native") or "-cross-" in x or "-crosssdk" in x or x.endswith("-cross") | ||
136 | |||
137 | # We only need to trigger populate_lic through direct dependencies | ||
138 | if taskdependees[task][1] == "do_populate_lic": | ||
139 | return True | ||
140 | |||
141 | # We only need to trigger packagedata through direct dependencies | ||
142 | # but need to preserve packagedata on packagedata links | ||
143 | if taskdependees[task][1] == "do_packagedata": | ||
144 | for dep in taskdependees: | ||
145 | if taskdependees[dep][1] == "do_packagedata": | ||
146 | return False | ||
147 | return True | ||
148 | |||
149 | for dep in taskdependees: | ||
150 | logit(" considering dependency: %s" % (str(taskdependees[dep])), log) | ||
151 | if task == dep: | ||
152 | continue | ||
153 | if dep in notneeded: | ||
154 | continue | ||
155 | # do_package_write_* and do_package doesn't need do_package | ||
156 | if taskdependees[task][1] == "do_package" and taskdependees[dep][1] in ['do_package', 'do_package_write_ipk', 'do_package_write_rpm', 'do_packagedata', 'do_package_qa']: | ||
157 | continue | ||
158 | # do_package_write_* need do_populate_sysroot as they're mainly postinstall dependencies | ||
159 | if taskdependees[task][1] == "do_populate_sysroot" and taskdependees[dep][1] in ['do_package_write_ipk', 'do_package_write_rpm']: | ||
160 | return False | ||
161 | # do_package/packagedata/package_qa don't need do_populate_sysroot | ||
162 | if taskdependees[task][1] == "do_populate_sysroot" and taskdependees[dep][1] in ['do_package', 'do_packagedata', 'do_package_qa']: | ||
163 | continue | ||
164 | # Native/Cross packages don't exist and are noexec anyway | ||
165 | if isNativeCross(taskdependees[dep][0]) and taskdependees[dep][1] in ['do_package_write_ipk', 'do_package_write_rpm', 'do_packagedata', 'do_package', 'do_package_qa']: | ||
166 | continue | ||
167 | |||
168 | # This is due to the [depends] in useradd.bbclass complicating matters | ||
169 | # The logic *is* reversed here due to the way hard setscene dependencies are injected | ||
170 | if (taskdependees[task][1] == 'do_package' or taskdependees[task][1] == 'do_populate_sysroot') and taskdependees[dep][0].endswith(('shadow-native', 'shadow-sysroot', 'base-passwd', 'pseudo-native')) and taskdependees[dep][1] == 'do_populate_sysroot': | ||
171 | continue | ||
172 | |||
173 | # Consider sysroot depending on sysroot tasks | ||
174 | if taskdependees[task][1] == 'do_populate_sysroot' and taskdependees[dep][1] == 'do_populate_sysroot': | ||
175 | # Native/Cross populate_sysroot need their dependencies | ||
176 | if isNativeCross(taskdependees[task][0]) and isNativeCross(taskdependees[dep][0]): | ||
177 | return False | ||
178 | # Target populate_sysroot depended on by cross tools need to be installed | ||
179 | if isNativeCross(taskdependees[dep][0]): | ||
180 | return False | ||
181 | # Native/cross tools depended upon by target sysroot are not needed | ||
182 | # Add an exception for shadow-native as required by useradd.bbclass | ||
183 | if isNativeCross(taskdependees[task][0]) and taskdependees[task][0] != 'shadow-native': | ||
184 | continue | ||
185 | # Target populate_sysroot need their dependencies | ||
186 | return False | ||
187 | |||
188 | |||
189 | if taskdependees[dep][1] == "do_populate_lic": | ||
190 | continue | ||
191 | |||
192 | # Safe fallthrough default | ||
193 | logit(" Default setscene dependency fall through due to dependency: %s" % (str(taskdependees[dep])), log) | ||
194 | return False | ||
195 | return True | ||
196 | |||
197 | BB_HASHCHECK_FUNCTION = "sstate_checkhashes" | ||
198 | |||
199 | def sstate_checkhashes(sq_fn, sq_task, sq_hash, sq_hashfn, d, siginfo=False, *, sq_unihash=None): | ||
200 | |||
201 | ret = [] | ||
202 | missed = [] | ||
203 | |||
204 | valid = d.getVar("SSTATEVALID").split() | ||
205 | |||
206 | for task in range(len(sq_fn)): | ||
207 | n = os.path.basename(sq_fn[task]).rsplit(".", 1)[0] + ":" + sq_task[task] | ||
208 | if n in valid: | ||
209 | bb.note("SState: Found valid sstate for %s" % n) | ||
210 | ret.append(task) | ||
211 | else: | ||
212 | missed.append(task) | ||
213 | bb.note("SState: Found no valid sstate for %s" % n) | ||
214 | |||
215 | if hasattr(bb.parse.siggen, "checkhashes"): | ||
216 | bb.parse.siggen.checkhashes(missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d) | ||
217 | |||
218 | return ret | ||
219 | |||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/classes/image.bbclass b/bitbake/lib/bb/tests/runqueue-tests/classes/image.bbclass new file mode 100644 index 0000000000..da9ff11064 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/classes/image.bbclass | |||
@@ -0,0 +1,5 @@ | |||
1 | do_rootfs[recrdeptask] += "do_package_write_deb do_package_qa" | ||
2 | do_rootfs[recrdeptask] += "do_package_write_ipk do_package_qa" | ||
3 | do_rootfs[recrdeptask] += "do_package_write_rpm do_package_qa | ||
4 | do_rootfs[recrdeptask] += "do_packagedata" | ||
5 | do_rootfs[recrdeptask] += "do_populate_lic" | ||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/classes/native.bbclass b/bitbake/lib/bb/tests/runqueue-tests/classes/native.bbclass new file mode 100644 index 0000000000..7eaaee54ad --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/classes/native.bbclass | |||
@@ -0,0 +1,2 @@ | |||
1 | RECIPERDEPTASK = "do_populate_sysroot" | ||
2 | do_populate_sysroot[rdeptask] = "${RECIPERDEPTASK}" | ||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf b/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf new file mode 100644 index 0000000000..8c7b754dab --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf | |||
@@ -0,0 +1,11 @@ | |||
1 | CACHE = "${TOPDIR}/cache" | ||
2 | THISDIR = "${@os.path.dirname(d.getVar('FILE'))}" | ||
3 | COREBASE := "${@os.path.normpath(os.path.dirname(d.getVar('FILE')+'/../../'))}" | ||
4 | BBFILES = "${COREBASE}/recipes/*.bb" | ||
5 | PROVIDES = "${PN}" | ||
6 | PN = "${@bb.parse.vars_from_file(d.getVar('FILE', False),d)[0]}" | ||
7 | PF = "${BB_CURRENT_MC}:${PN}" | ||
8 | export PATH | ||
9 | STAMP = "${TOPDIR}/stamps/${PN}" | ||
10 | T = "${TOPDIR}/workdir/${PN}/temp" | ||
11 | BB_NUMBER_THREADS = "4" | ||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/recipes/a1.bb b/bitbake/lib/bb/tests/runqueue-tests/recipes/a1.bb new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/recipes/a1.bb | |||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/recipes/b1.bb b/bitbake/lib/bb/tests/runqueue-tests/recipes/b1.bb new file mode 100644 index 0000000000..c0b288e5bc --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/recipes/b1.bb | |||
@@ -0,0 +1 @@ | |||
DEPENDS = "a1" \ No newline at end of file | |||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/recipes/c1.bb b/bitbake/lib/bb/tests/runqueue-tests/recipes/c1.bb new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/recipes/c1.bb | |||
diff --git a/bitbake/lib/bb/tests/runqueue-tests/recipes/d1.bb b/bitbake/lib/bb/tests/runqueue-tests/recipes/d1.bb new file mode 100644 index 0000000000..5ba197515b --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue-tests/recipes/d1.bb | |||
@@ -0,0 +1,3 @@ | |||
1 | DEPENDS = "a1" | ||
2 | |||
3 | do_package_setscene[depends] = "a1:do_populate_sysroot_setscene" | ||
diff --git a/bitbake/lib/bb/tests/runqueue.py b/bitbake/lib/bb/tests/runqueue.py new file mode 100644 index 0000000000..4a65b5b6e7 --- /dev/null +++ b/bitbake/lib/bb/tests/runqueue.py | |||
@@ -0,0 +1,200 @@ | |||
1 | # | ||
2 | # BitBake Tests for runqueue task processing | ||
3 | # | ||
4 | # Copyright (C) 2019 Richard Purdie | ||
5 | # | ||
6 | # SPDX-License-Identifier: GPL-2.0-only | ||
7 | # | ||
8 | |||
9 | import unittest | ||
10 | import bb | ||
11 | import os | ||
12 | import tempfile | ||
13 | import subprocess | ||
14 | |||
15 | # | ||
16 | # TODO: | ||
17 | # Add tests on task ordering (X happens before Y after Z) | ||
18 | # | ||
19 | |||
20 | class RunQueueTests(unittest.TestCase): | ||
21 | |||
22 | alltasks = ['package', 'fetch', 'unpack', 'patch', 'prepare_recipe_sysroot', 'configure', | ||
23 | 'compile', 'install', 'packagedata', 'package_qa', 'package_write_rpm', 'package_write_ipk', | ||
24 | 'populate_sysroot', 'build'] | ||
25 | a1_sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_package_write_rpm a1:do_populate_lic a1:do_populate_sysroot" | ||
26 | b1_sstatevalid = "b1:do_package b1:do_package_qa b1:do_packagedata b1:do_package_write_ipk b1:do_package_write_rpm b1:do_populate_lic b1:do_populate_sysroot" | ||
27 | |||
28 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None): | ||
29 | env = os.environ.copy() | ||
30 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) | ||
31 | env["BB_ENV_EXTRAWHITE"] = "SSTATEVALID SLOWTASKS" | ||
32 | env["SSTATEVALID"] = sstatevalid | ||
33 | env["SLOWTASKS"] = slowtasks | ||
34 | if extraenv: | ||
35 | for k in extraenv: | ||
36 | env[k] = extraenv[k] | ||
37 | env["BB_ENV_EXTRAWHITE"] = env["BB_ENV_EXTRAWHITE"] + " " + k | ||
38 | try: | ||
39 | output = subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,universal_newlines=True, cwd=builddir) | ||
40 | except subprocess.CalledProcessError as e: | ||
41 | self.fail("Command %s failed with %s" % (cmd, e.output)) | ||
42 | tasks = [] | ||
43 | with open(builddir + "/task.log", "r") as f: | ||
44 | tasks = [line.rstrip() for line in f] | ||
45 | return tasks | ||
46 | |||
47 | def test_no_setscenevalid(self): | ||
48 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
49 | cmd = ["bitbake", "a1"] | ||
50 | sstatevalid = "" | ||
51 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
52 | expected = ['a1:' + x for x in self.alltasks] | ||
53 | self.assertEqual(set(tasks), set(expected)) | ||
54 | |||
55 | def test_single_setscenevalid(self): | ||
56 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
57 | cmd = ["bitbake", "a1"] | ||
58 | sstatevalid = "a1:do_package" | ||
59 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
60 | expected = ['a1:package_setscene', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure', | ||
61 | 'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_qa', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
62 | 'a1:populate_sysroot', 'a1:build'] | ||
63 | self.assertEqual(set(tasks), set(expected)) | ||
64 | |||
65 | def test_intermediate_setscenevalid(self): | ||
66 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
67 | cmd = ["bitbake", "a1"] | ||
68 | sstatevalid = "a1:do_package a1:do_populate_sysroot" | ||
69 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
70 | expected = ['a1:package_setscene', 'a1:packagedata', 'a1:package_qa', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
71 | 'a1:populate_sysroot_setscene', 'a1:build'] | ||
72 | self.assertEqual(set(tasks), set(expected)) | ||
73 | |||
74 | def test_intermediate_notcovered(self): | ||
75 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
76 | cmd = ["bitbake", "a1"] | ||
77 | sstatevalid = "a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_package_write_rpm a1:do_populate_lic a1:do_populate_sysroot" | ||
78 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
79 | expected = ['a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene', | ||
80 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] | ||
81 | self.assertEqual(set(tasks), set(expected)) | ||
82 | |||
83 | def test_all_setscenevalid(self): | ||
84 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
85 | cmd = ["bitbake", "a1"] | ||
86 | sstatevalid = self.a1_sstatevalid | ||
87 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
88 | expected = ['a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene', | ||
89 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] | ||
90 | self.assertEqual(set(tasks), set(expected)) | ||
91 | |||
92 | def test_no_settasks(self): | ||
93 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
94 | cmd = ["bitbake", "a1", "-c", "patch"] | ||
95 | sstatevalid = self.a1_sstatevalid | ||
96 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
97 | expected = ['a1:fetch', 'a1:unpack', 'a1:patch'] | ||
98 | self.assertEqual(set(tasks), set(expected)) | ||
99 | |||
100 | # Test targets with intermediate setscene tasks alongside a target with no intermediate setscene tasks | ||
101 | def test_mixed_direct_tasks_setscene_tasks(self): | ||
102 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
103 | cmd = ["bitbake", "c1:do_patch", "a1"] | ||
104 | sstatevalid = self.a1_sstatevalid | ||
105 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
106 | expected = ['c1:fetch', 'c1:unpack', 'c1:patch', 'a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene', | ||
107 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] | ||
108 | self.assertEqual(set(tasks), set(expected)) | ||
109 | |||
110 | # This test slows down the execution of do_package_setscene until after other real tasks have | ||
111 | # started running which tests for a bug where tasks were being lost from the buildable list of real | ||
112 | # tasks if they weren't in tasks_covered or tasks_notcovered | ||
113 | def test_slow_setscene(self): | ||
114 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
115 | cmd = ["bitbake", "a1"] | ||
116 | sstatevalid = "a1:do_package" | ||
117 | slowtasks = "a1:package_setscene" | ||
118 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, slowtasks) | ||
119 | expected = ['a1:package_setscene', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure', | ||
120 | 'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_qa', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
121 | 'a1:populate_sysroot', 'a1:build'] | ||
122 | self.assertEqual(set(tasks), set(expected)) | ||
123 | |||
124 | def test_setscenewhitelist(self): | ||
125 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
126 | cmd = ["bitbake", "a1"] | ||
127 | extraenv = { | ||
128 | "BB_SETSCENE_ENFORCE" : "1", | ||
129 | "BB_SETSCENE_ENFORCE_WHITELIST" : "a1:do_package_write_rpm a1:do_build" | ||
130 | } | ||
131 | sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_populate_lic a1:do_populate_sysroot" | ||
132 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv) | ||
133 | expected = ['a1:packagedata_setscene', 'a1:package_qa_setscene', 'a1:package_write_ipk_setscene', | ||
134 | 'a1:populate_sysroot_setscene', 'a1:package_setscene'] | ||
135 | self.assertEqual(set(tasks), set(expected)) | ||
136 | |||
137 | # Tests for problems with dependencies between setscene tasks | ||
138 | def test_no_setscenevalid_harddeps(self): | ||
139 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
140 | cmd = ["bitbake", "d1"] | ||
141 | sstatevalid = "" | ||
142 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
143 | expected = ['a1:package', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure', | ||
144 | 'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
145 | 'a1:populate_sysroot', 'd1:package', 'd1:fetch', 'd1:unpack', 'd1:patch', 'd1:prepare_recipe_sysroot', 'd1:configure', | ||
146 | 'd1:compile', 'd1:install', 'd1:packagedata', 'd1:package_qa', 'd1:package_write_rpm', 'd1:package_write_ipk', | ||
147 | 'd1:populate_sysroot', 'd1:build'] | ||
148 | self.assertEqual(set(tasks), set(expected)) | ||
149 | |||
150 | def test_no_setscenevalid_withdeps(self): | ||
151 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
152 | cmd = ["bitbake", "b1"] | ||
153 | sstatevalid = "" | ||
154 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
155 | expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks] | ||
156 | expected.remove('a1:build') | ||
157 | expected.remove('a1:package_qa') | ||
158 | self.assertEqual(set(tasks), set(expected)) | ||
159 | |||
160 | def test_single_a1_setscenevalid_withdeps(self): | ||
161 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
162 | cmd = ["bitbake", "b1"] | ||
163 | sstatevalid = "a1:do_package" | ||
164 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
165 | expected = ['a1:package_setscene', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure', | ||
166 | 'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
167 | 'a1:populate_sysroot'] + ['b1:' + x for x in self.alltasks] | ||
168 | self.assertEqual(set(tasks), set(expected)) | ||
169 | |||
170 | def test_single_b1_setscenevalid_withdeps(self): | ||
171 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
172 | cmd = ["bitbake", "b1"] | ||
173 | sstatevalid = "b1:do_package" | ||
174 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
175 | expected = ['a1:package', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure', | ||
176 | 'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
177 | 'a1:populate_sysroot', 'b1:package_setscene'] + ['b1:' + x for x in self.alltasks] | ||
178 | expected.remove('b1:package') | ||
179 | self.assertEqual(set(tasks), set(expected)) | ||
180 | |||
181 | def test_intermediate_setscenevalid_withdeps(self): | ||
182 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
183 | cmd = ["bitbake", "b1"] | ||
184 | sstatevalid = "a1:do_package a1:do_populate_sysroot b1:do_package" | ||
185 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
186 | expected = ['a1:package_setscene', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk', | ||
187 | 'a1:populate_sysroot_setscene', 'b1:package_setscene'] + ['b1:' + x for x in self.alltasks] | ||
188 | expected.remove('b1:package') | ||
189 | self.assertEqual(set(tasks), set(expected)) | ||
190 | |||
191 | def test_all_setscenevalid_withdeps(self): | ||
192 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
193 | cmd = ["bitbake", "b1"] | ||
194 | sstatevalid = self.a1_sstatevalid + " " + self.b1_sstatevalid | ||
195 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid) | ||
196 | expected = ['a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene', | ||
197 | 'b1:build', 'a1:populate_sysroot_setscene', 'b1:package_write_ipk_setscene', 'b1:package_write_rpm_setscene', | ||
198 | 'b1:packagedata_setscene', 'b1:package_qa_setscene', 'b1:populate_sysroot_setscene'] | ||
199 | self.assertEqual(set(tasks), set(expected)) | ||
200 | |||