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