xref: /OK3568_Linux_fs/yocto/poky/bitbake/lib/bb/tests/runqueue.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#
2*4882a593Smuzhiyun# BitBake Tests for runqueue task processing
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Copyright (C) 2019 Richard Purdie
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only
7*4882a593Smuzhiyun#
8*4882a593Smuzhiyun
9*4882a593Smuzhiyunimport unittest
10*4882a593Smuzhiyunimport os
11*4882a593Smuzhiyunimport tempfile
12*4882a593Smuzhiyunimport subprocess
13*4882a593Smuzhiyunimport sys
14*4882a593Smuzhiyunimport time
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun#
17*4882a593Smuzhiyun# TODO:
18*4882a593Smuzhiyun# Add tests on task ordering (X happens before Y after Z)
19*4882a593Smuzhiyun#
20*4882a593Smuzhiyun
21*4882a593Smuzhiyunclass RunQueueTests(unittest.TestCase):
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun    alltasks = ['package', 'fetch', 'unpack', 'patch', 'prepare_recipe_sysroot', 'configure',
24*4882a593Smuzhiyun                'compile', 'install', 'packagedata', 'package_qa', 'package_write_rpm', 'package_write_ipk',
25*4882a593Smuzhiyun                'populate_sysroot', 'build']
26*4882a593Smuzhiyun    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*4882a593Smuzhiyun    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*4882a593Smuzhiyun
29*4882a593Smuzhiyun    def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None, cleanup=False):
30*4882a593Smuzhiyun        env = os.environ.copy()
31*4882a593Smuzhiyun        env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests"))
32*4882a593Smuzhiyun        env["BB_ENV_PASSTHROUGH_ADDITIONS"] = "SSTATEVALID SLOWTASKS TOPDIR"
33*4882a593Smuzhiyun        env["SSTATEVALID"] = sstatevalid
34*4882a593Smuzhiyun        env["SLOWTASKS"] = slowtasks
35*4882a593Smuzhiyun        env["TOPDIR"] = builddir
36*4882a593Smuzhiyun        if extraenv:
37*4882a593Smuzhiyun            for k in extraenv:
38*4882a593Smuzhiyun                env[k] = extraenv[k]
39*4882a593Smuzhiyun                env["BB_ENV_PASSTHROUGH_ADDITIONS"] = env["BB_ENV_PASSTHROUGH_ADDITIONS"] + " " + k
40*4882a593Smuzhiyun        try:
41*4882a593Smuzhiyun            output = subprocess.check_output(cmd, env=env, stderr=subprocess.STDOUT,universal_newlines=True, cwd=builddir)
42*4882a593Smuzhiyun            print(output)
43*4882a593Smuzhiyun        except subprocess.CalledProcessError as e:
44*4882a593Smuzhiyun            self.fail("Command %s failed with %s" % (cmd, e.output))
45*4882a593Smuzhiyun        tasks = []
46*4882a593Smuzhiyun        tasklog = builddir + "/task.log"
47*4882a593Smuzhiyun        if os.path.exists(tasklog):
48*4882a593Smuzhiyun            with open(tasklog, "r") as f:
49*4882a593Smuzhiyun                tasks = [line.rstrip() for line in f]
50*4882a593Smuzhiyun            if cleanup:
51*4882a593Smuzhiyun                os.remove(tasklog)
52*4882a593Smuzhiyun        return tasks
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun    def test_no_setscenevalid(self):
55*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
56*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
57*4882a593Smuzhiyun            sstatevalid = ""
58*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
59*4882a593Smuzhiyun            expected = ['a1:' + x for x in self.alltasks]
60*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun            self.shutdown(tempdir)
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun    def test_single_setscenevalid(self):
65*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
66*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
67*4882a593Smuzhiyun            sstatevalid = "a1:do_package"
68*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
69*4882a593Smuzhiyun            expected = ['a1:package_setscene', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure',
70*4882a593Smuzhiyun                        'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_qa', 'a1:package_write_rpm', 'a1:package_write_ipk',
71*4882a593Smuzhiyun                        'a1:populate_sysroot', 'a1:build']
72*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun            self.shutdown(tempdir)
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun    def test_intermediate_setscenevalid(self):
77*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
78*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
79*4882a593Smuzhiyun            sstatevalid = "a1:do_package a1:do_populate_sysroot"
80*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
81*4882a593Smuzhiyun            expected = ['a1:package_setscene', 'a1:packagedata', 'a1:package_qa', 'a1:package_write_rpm', 'a1:package_write_ipk',
82*4882a593Smuzhiyun                        'a1:populate_sysroot_setscene', 'a1:build']
83*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun            self.shutdown(tempdir)
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun    def test_intermediate_notcovered(self):
88*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
89*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
90*4882a593Smuzhiyun            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"
91*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
92*4882a593Smuzhiyun            expected = ['a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene',
93*4882a593Smuzhiyun                        'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene']
94*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun            self.shutdown(tempdir)
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun    def test_all_setscenevalid(self):
99*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
100*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
101*4882a593Smuzhiyun            sstatevalid = self.a1_sstatevalid
102*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
103*4882a593Smuzhiyun            expected = ['a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene',
104*4882a593Smuzhiyun                        'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene']
105*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun            self.shutdown(tempdir)
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun    def test_no_settasks(self):
110*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
111*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "-c", "patch"]
112*4882a593Smuzhiyun            sstatevalid = self.a1_sstatevalid
113*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
114*4882a593Smuzhiyun            expected = ['a1:fetch', 'a1:unpack', 'a1:patch']
115*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun            self.shutdown(tempdir)
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun    def test_mix_covered_notcovered(self):
120*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
121*4882a593Smuzhiyun            cmd = ["bitbake", "a1:do_patch", "a1:do_populate_sysroot"]
122*4882a593Smuzhiyun            sstatevalid = self.a1_sstatevalid
123*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
124*4882a593Smuzhiyun            expected = ['a1:fetch', 'a1:unpack', 'a1:patch', 'a1:populate_sysroot_setscene']
125*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun            self.shutdown(tempdir)
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun    # Test targets with intermediate setscene tasks alongside a target with no intermediate setscene tasks
130*4882a593Smuzhiyun    def test_mixed_direct_tasks_setscene_tasks(self):
131*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
132*4882a593Smuzhiyun            cmd = ["bitbake", "c1:do_patch", "a1"]
133*4882a593Smuzhiyun            sstatevalid = self.a1_sstatevalid
134*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
135*4882a593Smuzhiyun            expected = ['c1:fetch', 'c1:unpack', 'c1:patch', 'a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene',
136*4882a593Smuzhiyun                        'a1:package_qa_setscene', 'a1:build', 'a1:populate_sysroot_setscene']
137*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun            self.shutdown(tempdir)
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun    # This test slows down the execution of do_package_setscene until after other real tasks have
142*4882a593Smuzhiyun    # started running which tests for a bug where tasks were being lost from the buildable list of real
143*4882a593Smuzhiyun    # tasks if they weren't in tasks_covered or tasks_notcovered
144*4882a593Smuzhiyun    def test_slow_setscene(self):
145*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
146*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
147*4882a593Smuzhiyun            sstatevalid = "a1:do_package"
148*4882a593Smuzhiyun            slowtasks = "a1:package_setscene"
149*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, slowtasks)
150*4882a593Smuzhiyun            expected = ['a1:package_setscene', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure',
151*4882a593Smuzhiyun                        'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_qa', 'a1:package_write_rpm', 'a1:package_write_ipk',
152*4882a593Smuzhiyun                        'a1:populate_sysroot', 'a1:build']
153*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun            self.shutdown(tempdir)
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun    def test_setscene_ignore_tasks(self):
158*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
159*4882a593Smuzhiyun            cmd = ["bitbake", "a1"]
160*4882a593Smuzhiyun            extraenv = {
161*4882a593Smuzhiyun                "BB_SETSCENE_ENFORCE" : "1",
162*4882a593Smuzhiyun                "BB_SETSCENE_ENFORCE_IGNORE_TASKS" : "a1:do_package_write_rpm a1:do_build"
163*4882a593Smuzhiyun            }
164*4882a593Smuzhiyun            sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_populate_lic a1:do_populate_sysroot"
165*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv)
166*4882a593Smuzhiyun            expected = ['a1:packagedata_setscene', 'a1:package_qa_setscene', 'a1:package_write_ipk_setscene',
167*4882a593Smuzhiyun                        'a1:populate_sysroot_setscene', 'a1:package_setscene']
168*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun            self.shutdown(tempdir)
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun    # Tests for problems with dependencies between setscene tasks
173*4882a593Smuzhiyun    def test_no_setscenevalid_harddeps(self):
174*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
175*4882a593Smuzhiyun            cmd = ["bitbake", "d1"]
176*4882a593Smuzhiyun            sstatevalid = ""
177*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
178*4882a593Smuzhiyun            expected = ['a1:package', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure',
179*4882a593Smuzhiyun                        'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk',
180*4882a593Smuzhiyun                        'a1:populate_sysroot', 'd1:package', 'd1:fetch', 'd1:unpack', 'd1:patch', 'd1:prepare_recipe_sysroot', 'd1:configure',
181*4882a593Smuzhiyun                        'd1:compile', 'd1:install', 'd1:packagedata', 'd1:package_qa', 'd1:package_write_rpm', 'd1:package_write_ipk',
182*4882a593Smuzhiyun                        'd1:populate_sysroot', 'd1:build']
183*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun            self.shutdown(tempdir)
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun    def test_no_setscenevalid_withdeps(self):
188*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
189*4882a593Smuzhiyun            cmd = ["bitbake", "b1"]
190*4882a593Smuzhiyun            sstatevalid = ""
191*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
192*4882a593Smuzhiyun            expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks]
193*4882a593Smuzhiyun            expected.remove('a1:build')
194*4882a593Smuzhiyun            expected.remove('a1:package_qa')
195*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun            self.shutdown(tempdir)
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun    def test_single_a1_setscenevalid_withdeps(self):
200*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
201*4882a593Smuzhiyun            cmd = ["bitbake", "b1"]
202*4882a593Smuzhiyun            sstatevalid = "a1:do_package"
203*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
204*4882a593Smuzhiyun            expected = ['a1:package_setscene', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure',
205*4882a593Smuzhiyun                        'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk',
206*4882a593Smuzhiyun                        'a1:populate_sysroot'] + ['b1:' + x for x in self.alltasks]
207*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun            self.shutdown(tempdir)
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun    def test_single_b1_setscenevalid_withdeps(self):
212*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
213*4882a593Smuzhiyun            cmd = ["bitbake", "b1"]
214*4882a593Smuzhiyun            sstatevalid = "b1:do_package"
215*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
216*4882a593Smuzhiyun            expected = ['a1:package', 'a1:fetch', 'a1:unpack', 'a1:patch', 'a1:prepare_recipe_sysroot', 'a1:configure',
217*4882a593Smuzhiyun                        'a1:compile', 'a1:install', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk',
218*4882a593Smuzhiyun                        'a1:populate_sysroot', 'b1:package_setscene'] + ['b1:' + x for x in self.alltasks]
219*4882a593Smuzhiyun            expected.remove('b1:package')
220*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun            self.shutdown(tempdir)
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun    def test_intermediate_setscenevalid_withdeps(self):
225*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
226*4882a593Smuzhiyun            cmd = ["bitbake", "b1"]
227*4882a593Smuzhiyun            sstatevalid = "a1:do_package a1:do_populate_sysroot b1:do_package"
228*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
229*4882a593Smuzhiyun            expected = ['a1:package_setscene', 'a1:packagedata', 'a1:package_write_rpm', 'a1:package_write_ipk',
230*4882a593Smuzhiyun                        'a1:populate_sysroot_setscene', 'b1:package_setscene'] + ['b1:' + x for x in self.alltasks]
231*4882a593Smuzhiyun            expected.remove('b1:package')
232*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun            self.shutdown(tempdir)
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun    def test_all_setscenevalid_withdeps(self):
237*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
238*4882a593Smuzhiyun            cmd = ["bitbake", "b1"]
239*4882a593Smuzhiyun            sstatevalid = self.a1_sstatevalid + " " + self.b1_sstatevalid
240*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid)
241*4882a593Smuzhiyun            expected = ['a1:package_write_ipk_setscene', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene',
242*4882a593Smuzhiyun                        'b1:build', 'a1:populate_sysroot_setscene', 'b1:package_write_ipk_setscene', 'b1:package_write_rpm_setscene',
243*4882a593Smuzhiyun                        'b1:packagedata_setscene', 'b1:package_qa_setscene', 'b1:populate_sysroot_setscene']
244*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun            self.shutdown(tempdir)
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun    def test_multiconfig_setscene_optimise(self):
249*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
250*4882a593Smuzhiyun            extraenv = {
251*4882a593Smuzhiyun                "BBMULTICONFIG" : "mc-1 mc_2",
252*4882a593Smuzhiyun                "BB_SIGNATURE_HANDLER" : "basic"
253*4882a593Smuzhiyun            }
254*4882a593Smuzhiyun            cmd = ["bitbake", "b1", "mc:mc-1:b1", "mc:mc_2:b1"]
255*4882a593Smuzhiyun            setscenetasks = ['package_write_ipk_setscene', 'package_write_rpm_setscene', 'packagedata_setscene',
256*4882a593Smuzhiyun                             'populate_sysroot_setscene', 'package_qa_setscene']
257*4882a593Smuzhiyun            sstatevalid = ""
258*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv)
259*4882a593Smuzhiyun            expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks] + \
260*4882a593Smuzhiyun                       ['mc-1:b1:' + x for x in setscenetasks] + ['mc-1:a1:' + x for x in setscenetasks] + \
261*4882a593Smuzhiyun                       ['mc_2:b1:' + x for x in setscenetasks] + ['mc_2:a1:' + x for x in setscenetasks] + \
262*4882a593Smuzhiyun                       ['mc-1:b1:build', 'mc_2:b1:build']
263*4882a593Smuzhiyun            for x in ['mc-1:a1:package_qa_setscene', 'mc_2:a1:package_qa_setscene', 'a1:build', 'a1:package_qa']:
264*4882a593Smuzhiyun                expected.remove(x)
265*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun            self.shutdown(tempdir)
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun    def test_multiconfig_bbmask(self):
270*4882a593Smuzhiyun        # This test validates that multiconfigs can independently mask off
271*4882a593Smuzhiyun        # recipes they do not want with BBMASK. It works by having recipes
272*4882a593Smuzhiyun        # that will fail to parse for mc-1 and mc_2, then making each multiconfig
273*4882a593Smuzhiyun        # build the one that does parse. This ensures that the recipes are in
274*4882a593Smuzhiyun        # each multiconfigs BBFILES, but each is masking only the one that
275*4882a593Smuzhiyun        # doesn't parse
276*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
277*4882a593Smuzhiyun            extraenv = {
278*4882a593Smuzhiyun                "BBMULTICONFIG" : "mc-1 mc_2",
279*4882a593Smuzhiyun                "BB_SIGNATURE_HANDLER" : "basic",
280*4882a593Smuzhiyun                "EXTRA_BBFILES": "${COREBASE}/recipes/fails-mc/*.bb",
281*4882a593Smuzhiyun            }
282*4882a593Smuzhiyun            cmd = ["bitbake", "mc:mc-1:fails-mc2", "mc:mc_2:fails-mc1"]
283*4882a593Smuzhiyun            self.run_bitbakecmd(cmd, tempdir, "", extraenv=extraenv)
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun            self.shutdown(tempdir)
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun    def test_multiconfig_mcdepends(self):
288*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
289*4882a593Smuzhiyun            extraenv = {
290*4882a593Smuzhiyun                "BBMULTICONFIG" : "mc-1 mc_2",
291*4882a593Smuzhiyun                "BB_SIGNATURE_HANDLER" : "TestMulticonfigDepends",
292*4882a593Smuzhiyun                "EXTRA_BBFILES": "${COREBASE}/recipes/fails-mc/*.bb",
293*4882a593Smuzhiyun            }
294*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(["bitbake", "mc:mc-1:f1"], tempdir, "", extraenv=extraenv, cleanup=True)
295*4882a593Smuzhiyun            expected = ["mc-1:f1:%s" % t for t in self.alltasks] + \
296*4882a593Smuzhiyun                       ["mc_2:a1:%s" % t for t in self.alltasks]
297*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun            # A rebuild does nothing
300*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(["bitbake", "mc:mc-1:f1"], tempdir, "", extraenv=extraenv, cleanup=True)
301*4882a593Smuzhiyun            self.assertEqual(set(tasks), set())
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun            # Test that a signature change in the dependent task causes
304*4882a593Smuzhiyun            # mcdepends to rebuild
305*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(["bitbake", "mc:mc_2:a1", "-c", "compile", "-f"], tempdir, "", extraenv=extraenv, cleanup=True)
306*4882a593Smuzhiyun            expected = ["mc_2:a1:compile"]
307*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun            rerun_tasks = self.alltasks[:]
310*4882a593Smuzhiyun            for x in ("fetch", "unpack", "patch", "prepare_recipe_sysroot", "configure", "compile"):
311*4882a593Smuzhiyun                rerun_tasks.remove(x)
312*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(["bitbake", "mc:mc-1:f1"], tempdir, "", extraenv=extraenv, cleanup=True)
313*4882a593Smuzhiyun            expected = ["mc-1:f1:%s" % t for t in rerun_tasks] + \
314*4882a593Smuzhiyun                       ["mc_2:a1:%s" % t for t in rerun_tasks]
315*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun            self.shutdown(tempdir)
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun    def test_hashserv_single(self):
320*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
321*4882a593Smuzhiyun            extraenv = {
322*4882a593Smuzhiyun                "BB_HASHSERVE" : "auto",
323*4882a593Smuzhiyun                "BB_SIGNATURE_HANDLER" : "TestEquivHash"
324*4882a593Smuzhiyun            }
325*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "b1"]
326*4882a593Smuzhiyun            setscenetasks = ['package_write_ipk_setscene', 'package_write_rpm_setscene', 'packagedata_setscene',
327*4882a593Smuzhiyun                             'populate_sysroot_setscene', 'package_qa_setscene']
328*4882a593Smuzhiyun            sstatevalid = ""
329*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
330*4882a593Smuzhiyun            expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks]
331*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
332*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "-c", "install", "-f"]
333*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
334*4882a593Smuzhiyun            expected = ['a1:install']
335*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
336*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "b1"]
337*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
338*4882a593Smuzhiyun            expected = ['a1:populate_sysroot', 'a1:package', 'a1:package_write_rpm_setscene', 'a1:packagedata_setscene',
339*4882a593Smuzhiyun                        'a1:package_write_ipk_setscene', 'a1:package_qa_setscene', 'a1:build']
340*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun            self.shutdown(tempdir)
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun    def test_hashserv_double(self):
345*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
346*4882a593Smuzhiyun            extraenv = {
347*4882a593Smuzhiyun                "BB_HASHSERVE" : "auto",
348*4882a593Smuzhiyun                "BB_SIGNATURE_HANDLER" : "TestEquivHash"
349*4882a593Smuzhiyun            }
350*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "b1", "e1"]
351*4882a593Smuzhiyun            setscenetasks = ['package_write_ipk_setscene', 'package_write_rpm_setscene', 'packagedata_setscene',
352*4882a593Smuzhiyun                             'populate_sysroot_setscene', 'package_qa_setscene']
353*4882a593Smuzhiyun            sstatevalid = ""
354*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
355*4882a593Smuzhiyun            expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks] + ['e1:' + x for x in self.alltasks]
356*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
357*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "b1", "-c", "install", "-fn"]
358*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
359*4882a593Smuzhiyun            cmd = ["bitbake", "e1"]
360*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
361*4882a593Smuzhiyun            expected = ['a1:package', 'a1:install', 'b1:package', 'b1:install', 'a1:populate_sysroot', 'b1:populate_sysroot',
362*4882a593Smuzhiyun                        'a1:package_write_ipk_setscene', 'b1:packagedata_setscene', 'b1:package_write_rpm_setscene',
363*4882a593Smuzhiyun                        'a1:package_write_rpm_setscene', 'b1:package_write_ipk_setscene', 'a1:packagedata_setscene']
364*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun            self.shutdown(tempdir)
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun    def test_hashserv_multiple_setscene(self):
369*4882a593Smuzhiyun        # Runs e1:do_package_setscene twice
370*4882a593Smuzhiyun        with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir:
371*4882a593Smuzhiyun            extraenv = {
372*4882a593Smuzhiyun                "BB_HASHSERVE" : "auto",
373*4882a593Smuzhiyun                "BB_SIGNATURE_HANDLER" : "TestEquivHash"
374*4882a593Smuzhiyun            }
375*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "b1", "e1"]
376*4882a593Smuzhiyun            setscenetasks = ['package_write_ipk_setscene', 'package_write_rpm_setscene', 'packagedata_setscene',
377*4882a593Smuzhiyun                             'populate_sysroot_setscene', 'package_qa_setscene']
378*4882a593Smuzhiyun            sstatevalid = ""
379*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
380*4882a593Smuzhiyun            expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks] + ['e1:' + x for x in self.alltasks]
381*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
382*4882a593Smuzhiyun            cmd = ["bitbake", "a1", "b1", "-c", "install", "-fn"]
383*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True)
384*4882a593Smuzhiyun            cmd = ["bitbake", "e1"]
385*4882a593Smuzhiyun            sstatevalid = "e1:do_package"
386*4882a593Smuzhiyun            tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True, slowtasks="a1:populate_sysroot b1:populate_sysroot")
387*4882a593Smuzhiyun            expected = ['a1:package', 'a1:install', 'b1:package', 'b1:install', 'a1:populate_sysroot', 'b1:populate_sysroot',
388*4882a593Smuzhiyun                        'a1:package_write_ipk_setscene', 'b1:packagedata_setscene', 'b1:package_write_rpm_setscene',
389*4882a593Smuzhiyun                        'a1:package_write_rpm_setscene', 'b1:package_write_ipk_setscene', 'a1:packagedata_setscene',
390*4882a593Smuzhiyun                        'e1:package_setscene']
391*4882a593Smuzhiyun            self.assertEqual(set(tasks), set(expected))
392*4882a593Smuzhiyun            for i in expected:
393*4882a593Smuzhiyun                self.assertEqual(tasks.count(i), 1, "%s not in task list once" % i)
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun            self.shutdown(tempdir)
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun    def shutdown(self, tempdir):
398*4882a593Smuzhiyun        # Wait for the hashserve socket to disappear else we'll see races with the tempdir cleanup
399*4882a593Smuzhiyun        while (os.path.exists(tempdir + "/hashserve.sock") or os.path.exists(tempdir + "cache/hashserv.db-wal") or os.path.exists(tempdir + "/bitbake.lock")):
400*4882a593Smuzhiyun            time.sleep(0.5)
401*4882a593Smuzhiyun
402