diff options
Diffstat (limited to 'bitbake/lib/bb/tests/runqueue.py')
-rw-r--r-- | bitbake/lib/bb/tests/runqueue.py | 65 |
1 files changed, 54 insertions, 11 deletions
diff --git a/bitbake/lib/bb/tests/runqueue.py b/bitbake/lib/bb/tests/runqueue.py index 3d51779d6c..74f5ded2e6 100644 --- a/bitbake/lib/bb/tests/runqueue.py +++ b/bitbake/lib/bb/tests/runqueue.py | |||
@@ -26,20 +26,23 @@ class RunQueueTests(unittest.TestCase): | |||
26 | 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 | 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" |
27 | 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 | 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" |
28 | 28 | ||
29 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None, cleanup=False): | 29 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None, cleanup=False, allowfailure=False): |
30 | env = os.environ.copy() | 30 | env = os.environ.copy() |
31 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) | 31 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) |
32 | env["BB_ENV_EXTRAWHITE"] = "SSTATEVALID SLOWTASKS" | 32 | env["BB_ENV_PASSTHROUGH_ADDITIONS"] = "SSTATEVALID SLOWTASKS TOPDIR" |
33 | env["SSTATEVALID"] = sstatevalid | 33 | env["SSTATEVALID"] = sstatevalid |
34 | env["SLOWTASKS"] = slowtasks | 34 | env["SLOWTASKS"] = slowtasks |
35 | env["TOPDIR"] = builddir | ||
35 | if extraenv: | 36 | if extraenv: |
36 | for k in extraenv: | 37 | for k in extraenv: |
37 | env[k] = extraenv[k] | 38 | env[k] = extraenv[k] |
38 | env["BB_ENV_EXTRAWHITE"] = env["BB_ENV_EXTRAWHITE"] + " " + k | 39 | env["BB_ENV_PASSTHROUGH_ADDITIONS"] = env["BB_ENV_PASSTHROUGH_ADDITIONS"] + " " + k |
39 | try: | 40 | try: |
40 | output = subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,universal_newlines=True, cwd=builddir) | 41 | output = subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,universal_newlines=True, cwd=builddir) |
41 | print(output) | 42 | print(output) |
42 | except subprocess.CalledProcessError as e: | 43 | except subprocess.CalledProcessError as e: |
44 | if allowfailure: | ||
45 | return e.output | ||
43 | self.fail("Command %s failed with %s" % (cmd, e.output)) | 46 | self.fail("Command %s failed with %s" % (cmd, e.output)) |
44 | tasks = [] | 47 | tasks = [] |
45 | tasklog = builddir + "/task.log" | 48 | tasklog = builddir + "/task.log" |
@@ -58,6 +61,8 @@ class RunQueueTests(unittest.TestCase): | |||
58 | expected = ['a1:' + x for x in self.alltasks] | 61 | expected = ['a1:' + x for x in self.alltasks] |
59 | self.assertEqual(set(tasks), set(expected)) | 62 | self.assertEqual(set(tasks), set(expected)) |
60 | 63 | ||
64 | self.shutdown(tempdir) | ||
65 | |||
61 | def test_single_setscenevalid(self): | 66 | def test_single_setscenevalid(self): |
62 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 67 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
63 | cmd = ["bitbake", "a1"] | 68 | cmd = ["bitbake", "a1"] |
@@ -68,6 +73,8 @@ class RunQueueTests(unittest.TestCase): | |||
68 | 'a1:populate_sysroot', 'a1:build'] | 73 | 'a1:populate_sysroot', 'a1:build'] |
69 | self.assertEqual(set(tasks), set(expected)) | 74 | self.assertEqual(set(tasks), set(expected)) |
70 | 75 | ||
76 | self.shutdown(tempdir) | ||
77 | |||
71 | def test_intermediate_setscenevalid(self): | 78 | def test_intermediate_setscenevalid(self): |
72 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 79 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
73 | cmd = ["bitbake", "a1"] | 80 | cmd = ["bitbake", "a1"] |
@@ -77,6 +84,8 @@ class RunQueueTests(unittest.TestCase): | |||
77 | 'a1:populate_sysroot_setscene', 'a1:build'] | 84 | 'a1:populate_sysroot_setscene', 'a1:build'] |
78 | self.assertEqual(set(tasks), set(expected)) | 85 | self.assertEqual(set(tasks), set(expected)) |
79 | 86 | ||
87 | self.shutdown(tempdir) | ||
88 | |||
80 | def test_intermediate_notcovered(self): | 89 | def test_intermediate_notcovered(self): |
81 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 90 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
82 | cmd = ["bitbake", "a1"] | 91 | cmd = ["bitbake", "a1"] |
@@ -86,6 +95,8 @@ class RunQueueTests(unittest.TestCase): | |||
86 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] | 95 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] |
87 | self.assertEqual(set(tasks), set(expected)) | 96 | self.assertEqual(set(tasks), set(expected)) |
88 | 97 | ||
98 | self.shutdown(tempdir) | ||
99 | |||
89 | def test_all_setscenevalid(self): | 100 | def test_all_setscenevalid(self): |
90 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 101 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
91 | cmd = ["bitbake", "a1"] | 102 | cmd = ["bitbake", "a1"] |
@@ -95,6 +106,8 @@ class RunQueueTests(unittest.TestCase): | |||
95 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] | 106 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] |
96 | self.assertEqual(set(tasks), set(expected)) | 107 | self.assertEqual(set(tasks), set(expected)) |
97 | 108 | ||
109 | self.shutdown(tempdir) | ||
110 | |||
98 | def test_no_settasks(self): | 111 | def test_no_settasks(self): |
99 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 112 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
100 | cmd = ["bitbake", "a1", "-c", "patch"] | 113 | cmd = ["bitbake", "a1", "-c", "patch"] |
@@ -103,6 +116,8 @@ class RunQueueTests(unittest.TestCase): | |||
103 | expected = ['a1:fetch', 'a1:unpack', 'a1:patch'] | 116 | expected = ['a1:fetch', 'a1:unpack', 'a1:patch'] |
104 | self.assertEqual(set(tasks), set(expected)) | 117 | self.assertEqual(set(tasks), set(expected)) |
105 | 118 | ||
119 | self.shutdown(tempdir) | ||
120 | |||
106 | def test_mix_covered_notcovered(self): | 121 | def test_mix_covered_notcovered(self): |
107 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 122 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
108 | cmd = ["bitbake", "a1:do_patch", "a1:do_populate_sysroot"] | 123 | cmd = ["bitbake", "a1:do_patch", "a1:do_populate_sysroot"] |
@@ -111,6 +126,7 @@ class RunQueueTests(unittest.TestCase): | |||
111 | expected = ['a1:fetch', 'a1:unpack', 'a1:patch', 'a1:populate_sysroot_setscene'] | 126 | expected = ['a1:fetch', 'a1:unpack', 'a1:patch', 'a1:populate_sysroot_setscene'] |
112 | self.assertEqual(set(tasks), set(expected)) | 127 | self.assertEqual(set(tasks), set(expected)) |
113 | 128 | ||
129 | self.shutdown(tempdir) | ||
114 | 130 | ||
115 | # Test targets with intermediate setscene tasks alongside a target with no intermediate setscene tasks | 131 | # Test targets with intermediate setscene tasks alongside a target with no intermediate setscene tasks |
116 | def test_mixed_direct_tasks_setscene_tasks(self): | 132 | def test_mixed_direct_tasks_setscene_tasks(self): |
@@ -122,6 +138,8 @@ class RunQueueTests(unittest.TestCase): | |||
122 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] | 138 | 'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene'] |
123 | self.assertEqual(set(tasks), set(expected)) | 139 | self.assertEqual(set(tasks), set(expected)) |
124 | 140 | ||
141 | self.shutdown(tempdir) | ||
142 | |||
125 | # This test slows down the execution of do_package_setscene until after other real tasks have | 143 | # This test slows down the execution of do_package_setscene until after other real tasks have |
126 | # started running which tests for a bug where tasks were being lost from the buildable list of real | 144 | # started running which tests for a bug where tasks were being lost from the buildable list of real |
127 | # tasks if they weren't in tasks_covered or tasks_notcovered | 145 | # tasks if they weren't in tasks_covered or tasks_notcovered |
@@ -136,12 +154,14 @@ class RunQueueTests(unittest.TestCase): | |||
136 | 'a1:populate_sysroot', 'a1:build'] | 154 | 'a1:populate_sysroot', 'a1:build'] |
137 | self.assertEqual(set(tasks), set(expected)) | 155 | self.assertEqual(set(tasks), set(expected)) |
138 | 156 | ||
139 | def test_setscenewhitelist(self): | 157 | self.shutdown(tempdir) |
158 | |||
159 | def test_setscene_ignore_tasks(self): | ||
140 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 160 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
141 | cmd = ["bitbake", "a1"] | 161 | cmd = ["bitbake", "a1"] |
142 | extraenv = { | 162 | extraenv = { |
143 | "BB_SETSCENE_ENFORCE" : "1", | 163 | "BB_SETSCENE_ENFORCE" : "1", |
144 | "BB_SETSCENE_ENFORCE_WHITELIST" : "a1:do_package_write_rpm a1:do_build" | 164 | "BB_SETSCENE_ENFORCE_IGNORE_TASKS" : "a1:do_package_write_rpm a1:do_build" |
145 | } | 165 | } |
146 | sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_populate_lic a1:do_populate_sysroot" | 166 | sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_populate_lic a1:do_populate_sysroot" |
147 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv) | 167 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv) |
@@ -149,6 +169,8 @@ class RunQueueTests(unittest.TestCase): | |||
149 | 'a1:populate_sysroot_setscene', 'a1:package_setscene'] | 169 | 'a1:populate_sysroot_setscene', 'a1:package_setscene'] |
150 | self.assertEqual(set(tasks), set(expected)) | 170 | self.assertEqual(set(tasks), set(expected)) |
151 | 171 | ||
172 | self.shutdown(tempdir) | ||
173 | |||
152 | # Tests for problems with dependencies between setscene tasks | 174 | # Tests for problems with dependencies between setscene tasks |
153 | def test_no_setscenevalid_harddeps(self): | 175 | def test_no_setscenevalid_harddeps(self): |
154 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 176 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
@@ -162,6 +184,8 @@ class RunQueueTests(unittest.TestCase): | |||
162 | 'd1:populate_sysroot', 'd1:build'] | 184 | 'd1:populate_sysroot', 'd1:build'] |
163 | self.assertEqual(set(tasks), set(expected)) | 185 | self.assertEqual(set(tasks), set(expected)) |
164 | 186 | ||
187 | self.shutdown(tempdir) | ||
188 | |||
165 | def test_no_setscenevalid_withdeps(self): | 189 | def test_no_setscenevalid_withdeps(self): |
166 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 190 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
167 | cmd = ["bitbake", "b1"] | 191 | cmd = ["bitbake", "b1"] |
@@ -172,6 +196,8 @@ class RunQueueTests(unittest.TestCase): | |||
172 | expected.remove('a1:package_qa') | 196 | expected.remove('a1:package_qa') |
173 | self.assertEqual(set(tasks), set(expected)) | 197 | self.assertEqual(set(tasks), set(expected)) |
174 | 198 | ||
199 | self.shutdown(tempdir) | ||
200 | |||
175 | def test_single_a1_setscenevalid_withdeps(self): | 201 | def test_single_a1_setscenevalid_withdeps(self): |
176 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 202 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
177 | cmd = ["bitbake", "b1"] | 203 | cmd = ["bitbake", "b1"] |
@@ -182,6 +208,8 @@ class RunQueueTests(unittest.TestCase): | |||
182 | 'a1:populate_sysroot'] + ['b1:' + x for x in self.alltasks] | 208 | 'a1:populate_sysroot'] + ['b1:' + x for x in self.alltasks] |
183 | self.assertEqual(set(tasks), set(expected)) | 209 | self.assertEqual(set(tasks), set(expected)) |
184 | 210 | ||
211 | self.shutdown(tempdir) | ||
212 | |||
185 | def test_single_b1_setscenevalid_withdeps(self): | 213 | def test_single_b1_setscenevalid_withdeps(self): |
186 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 214 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
187 | cmd = ["bitbake", "b1"] | 215 | cmd = ["bitbake", "b1"] |
@@ -193,6 +221,8 @@ class RunQueueTests(unittest.TestCase): | |||
193 | expected.remove('b1:package') | 221 | expected.remove('b1:package') |
194 | self.assertEqual(set(tasks), set(expected)) | 222 | self.assertEqual(set(tasks), set(expected)) |
195 | 223 | ||
224 | self.shutdown(tempdir) | ||
225 | |||
196 | def test_intermediate_setscenevalid_withdeps(self): | 226 | def test_intermediate_setscenevalid_withdeps(self): |
197 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 227 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
198 | cmd = ["bitbake", "b1"] | 228 | cmd = ["bitbake", "b1"] |
@@ -203,6 +233,8 @@ class RunQueueTests(unittest.TestCase): | |||
203 | expected.remove('b1:package') | 233 | expected.remove('b1:package') |
204 | self.assertEqual(set(tasks), set(expected)) | 234 | self.assertEqual(set(tasks), set(expected)) |
205 | 235 | ||
236 | self.shutdown(tempdir) | ||
237 | |||
206 | def test_all_setscenevalid_withdeps(self): | 238 | def test_all_setscenevalid_withdeps(self): |
207 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 239 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
208 | cmd = ["bitbake", "b1"] | 240 | cmd = ["bitbake", "b1"] |
@@ -213,6 +245,8 @@ class RunQueueTests(unittest.TestCase): | |||
213 | 'b1:packagedata_setscene', 'b1:package_qa_setscene', 'b1:populate_sysroot_setscene'] | 245 | 'b1:packagedata_setscene', 'b1:package_qa_setscene', 'b1:populate_sysroot_setscene'] |
214 | self.assertEqual(set(tasks), set(expected)) | 246 | self.assertEqual(set(tasks), set(expected)) |
215 | 247 | ||
248 | self.shutdown(tempdir) | ||
249 | |||
216 | def test_multiconfig_setscene_optimise(self): | 250 | def test_multiconfig_setscene_optimise(self): |
217 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 251 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
218 | extraenv = { | 252 | extraenv = { |
@@ -232,6 +266,8 @@ class RunQueueTests(unittest.TestCase): | |||
232 | expected.remove(x) | 266 | expected.remove(x) |
233 | self.assertEqual(set(tasks), set(expected)) | 267 | self.assertEqual(set(tasks), set(expected)) |
234 | 268 | ||
269 | self.shutdown(tempdir) | ||
270 | |||
235 | def test_multiconfig_bbmask(self): | 271 | def test_multiconfig_bbmask(self): |
236 | # This test validates that multiconfigs can independently mask off | 272 | # This test validates that multiconfigs can independently mask off |
237 | # recipes they do not want with BBMASK. It works by having recipes | 273 | # recipes they do not want with BBMASK. It works by having recipes |
@@ -248,11 +284,13 @@ class RunQueueTests(unittest.TestCase): | |||
248 | cmd = ["bitbake", "mc:mc-1:fails-mc2", "mc:mc_2:fails-mc1"] | 284 | cmd = ["bitbake", "mc:mc-1:fails-mc2", "mc:mc_2:fails-mc1"] |
249 | self.run_bitbakecmd(cmd, tempdir, "", extraenv=extraenv) | 285 | self.run_bitbakecmd(cmd, tempdir, "", extraenv=extraenv) |
250 | 286 | ||
287 | self.shutdown(tempdir) | ||
288 | |||
251 | def test_multiconfig_mcdepends(self): | 289 | def test_multiconfig_mcdepends(self): |
252 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 290 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
253 | extraenv = { | 291 | extraenv = { |
254 | "BBMULTICONFIG" : "mc-1 mc_2", | 292 | "BBMULTICONFIG" : "mc-1 mc_2", |
255 | "BB_SIGNATURE_HANDLER" : "TestMulticonfigDepends", | 293 | "BB_SIGNATURE_HANDLER" : "basichash", |
256 | "EXTRA_BBFILES": "${COREBASE}/recipes/fails-mc/*.bb", | 294 | "EXTRA_BBFILES": "${COREBASE}/recipes/fails-mc/*.bb", |
257 | } | 295 | } |
258 | tasks = self.run_bitbakecmd(["bitbake", "mc:mc-1:f1"], tempdir, "", extraenv=extraenv, cleanup=True) | 296 | tasks = self.run_bitbakecmd(["bitbake", "mc:mc-1:f1"], tempdir, "", extraenv=extraenv, cleanup=True) |
@@ -278,7 +316,15 @@ class RunQueueTests(unittest.TestCase): | |||
278 | ["mc_2:a1:%s" % t for t in rerun_tasks] | 316 | ["mc_2:a1:%s" % t for t in rerun_tasks] |
279 | self.assertEqual(set(tasks), set(expected)) | 317 | self.assertEqual(set(tasks), set(expected)) |
280 | 318 | ||
281 | @unittest.skipIf(sys.version_info < (3, 5, 0), 'Python 3.5 or later required') | 319 | # Check that a multiconfig that doesn't exist rasies a correct error message |
320 | error_output = self.run_bitbakecmd(["bitbake", "g1"], tempdir, "", extraenv=extraenv, cleanup=True, allowfailure=True) | ||
321 | self.assertIn("non-existent task", error_output) | ||
322 | # If the word 'Traceback' or 'KeyError' is in the output we've regressed | ||
323 | self.assertNotIn("Traceback", error_output) | ||
324 | self.assertNotIn("KeyError", error_output) | ||
325 | |||
326 | self.shutdown(tempdir) | ||
327 | |||
282 | def test_hashserv_single(self): | 328 | def test_hashserv_single(self): |
283 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 329 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
284 | extraenv = { | 330 | extraenv = { |
@@ -304,7 +350,6 @@ class RunQueueTests(unittest.TestCase): | |||
304 | 350 | ||
305 | self.shutdown(tempdir) | 351 | self.shutdown(tempdir) |
306 | 352 | ||
307 | @unittest.skipIf(sys.version_info < (3, 5, 0), 'Python 3.5 or later required') | ||
308 | def test_hashserv_double(self): | 353 | def test_hashserv_double(self): |
309 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 354 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
310 | extraenv = { | 355 | extraenv = { |
@@ -329,7 +374,6 @@ class RunQueueTests(unittest.TestCase): | |||
329 | 374 | ||
330 | self.shutdown(tempdir) | 375 | self.shutdown(tempdir) |
331 | 376 | ||
332 | @unittest.skipIf(sys.version_info < (3, 5, 0), 'Python 3.5 or later required') | ||
333 | def test_hashserv_multiple_setscene(self): | 377 | def test_hashserv_multiple_setscene(self): |
334 | # Runs e1:do_package_setscene twice | 378 | # Runs e1:do_package_setscene twice |
335 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | 379 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: |
@@ -361,7 +405,6 @@ class RunQueueTests(unittest.TestCase): | |||
361 | 405 | ||
362 | def shutdown(self, tempdir): | 406 | def shutdown(self, tempdir): |
363 | # Wait for the hashserve socket to disappear else we'll see races with the tempdir cleanup | 407 | # Wait for the hashserve socket to disappear else we'll see races with the tempdir cleanup |
364 | while os.path.exists(tempdir + "/hashserve.sock"): | 408 | while (os.path.exists(tempdir + "/hashserve.sock") or os.path.exists(tempdir + "cache/hashserv.db-wal") or os.path.exists(tempdir + "/bitbake.lock")): |
365 | time.sleep(0.5) | 409 | time.sleep(0.5) |
366 | 410 | ||
367 | |||