1fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone#!/usr/bin/python 2fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone# 3fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 4fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone# Use of this source code is governed by a BSD-style license that can be 5fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone# found in the LICENSE file. 6fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 7fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone"""Unit tests for site_utils/deduping_scheduler.py.""" 8fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 9fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masoneimport mox 10fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masoneimport unittest 11fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 12c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller# driver must be imported first due to circular imports in base_event and task 13c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Millerimport driver # pylint: disable-msg=W0611 14fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masoneimport deduping_scheduler 15fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 16c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Millerimport common 173197b39f82eb92afff33c7d44b805afe120c7627Fang Dengfrom autotest_lib.client.common_lib import error 187d658cf6bade565c1098fd7b47075e96e7b542caAlex Millerfrom autotest_lib.client.common_lib import priorities 193197b39f82eb92afff33c7d44b805afe120c7627Fang Dengfrom autotest_lib.server import frontend, site_utils 203197b39f82eb92afff33c7d44b805afe120c7627Fang Dengfrom autotest_lib.server.cros.dynamic_suite import reporting 21fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 22fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 23fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masoneclass DedupingSchedulerTest(mox.MoxTestBase): 24fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """Unit tests for DedupingScheduler 25fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 26fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone @var _BUILD: fake build 27fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone @var _BOARD: fake board to reimage 28fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone @var _SUITE: fake suite name 29fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone @var _POOL: fake machine pool name 30fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """ 31fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 32fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone _BUILD = 'build' 33a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi _BUILDS = {'cros-version': 'build'} 34fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone _BOARD = 'board' 35fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone _SUITE = 'suite' 36fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone _POOL = 'pool' 373eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone _NUM = 2 387d658cf6bade565c1098fd7b47075e96e7b542caAlex Miller _PRIORITY = priorities.Priority.POSTBUILD 39c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller _TIMEOUT = 24 404de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi _TIMEOUT_MINS = 1440 41fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 42fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 43fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone def setUp(self): 44fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone super(DedupingSchedulerTest, self).setUp() 45fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.afe = self.mox.CreateMock(frontend.AFE) 46fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.scheduler = deduping_scheduler.DedupingScheduler(afe=self.afe) 47abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self.mox.StubOutWithMock(site_utils, 'check_lab_status') 48abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette 49abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette 50abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette def _SetupLabStatus(self, build, message=None): 51abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette """Set up to mock one call to `site_utils.check_lab_status()`. 52abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette 53abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette @param build The build to expect to be passed to 54abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette `check_lab_status()`. 55abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette @param message `None` if the mocked call should return that 56abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette the lab status is up. Otherwise, a string for 57abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette the exception message. 58abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette 59abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette """ 60abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette if message is None: 61abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette site_utils.check_lab_status(build) 62abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette else: 63abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette site_utils.check_lab_status(build).AndRaise( 64abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette site_utils.TestLabException(message)) 65fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 66fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 67fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone def testScheduleSuite(self): 68fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """Test a successful de-dup and suite schedule.""" 69abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is UP! 70abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD) 71fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # A similar suite has not already been scheduled. 72e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi self.afe.get_jobs(name__istartswith=self._BUILD, 73e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__iendswith='control.'+self._SUITE, 74f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi created_on__gte=mox.IgnoreArg(), 75f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn([]) 76fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # Expect an attempt to schedule; allow it to succeed. 77fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.afe.run('create_suite_job', 78b6ec8ae8b13902110f664cf51e3a1d9b43c9f8f3Simran Basi name=self._SUITE, 79fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone board=self._BOARD, 80a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi builds=self._BUILDS, 81fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone check_hosts=False, 823eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone pool=self._POOL, 837d658cf6bade565c1098fd7b47075e96e7b542caAlex Miller num=self._NUM, 84c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller priority=self._PRIORITY, 85a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi test_source_build=None, 86334f08229806e279c7107b86ab1847625577e0eaDan Shi timeout=self._TIMEOUT, 874de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi max_runtime_mins=self._TIMEOUT_MINS, 884de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi timeout_mins=self._TIMEOUT_MINS, 896de2bdedc42b9c6226730ad9ba3e64a8a0bd104dPrashanth B file_bugs=False, 9029a1699233e8ab15056d3d820dbad76728c8e4a6Dan Shi wait_for_results=False, 91bba4949246f53f53369f673aa8645de121ce337bDan Shi job_retry=False, 922121a3382d70bfb60284a830f341d78d6d555519Dan Shi delay_minutes=0, 93f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi run_prod_code=False, 94f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn(7) 95fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.mox.ReplayAll() 96fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.assertTrue(self.scheduler.ScheduleSuite(self._SUITE, 97fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._BOARD, 98fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._BUILD, 993eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone self._POOL, 100c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._NUM, 101c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._PRIORITY, 102c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._TIMEOUT)) 103fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 104fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 105fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone def testShouldNotScheduleSuite(self): 106fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """Test a successful de-dup and avoiding scheduling the suite.""" 107abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is UP! 108abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD) 109fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # A similar suite has already been scheduled. 1106d388bce820b54792aa51e7294ac8c3c50bec036Chris Masone self.afe.get_jobs( 111e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__istartswith=self._BUILD, 112e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__iendswith='control.'+self._SUITE, 113f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi created_on__gte=mox.IgnoreArg(), 114f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn(['42']) 115fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.mox.ReplayAll() 116fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.assertFalse(self.scheduler.ScheduleSuite(self._SUITE, 117fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._BOARD, 118fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._BUILD, 1193eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone self._POOL, 120c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller None, 121c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._PRIORITY, 122c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._TIMEOUT)) 123fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone 124fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone 125abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette def testShouldNotScheduleSuiteLabClosed(self): 126abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette """Test that we don't schedule when the lab is closed.""" 127abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is down. :-( 128abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD, 'Lab closed due to sheep.') 129abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self.mox.ReplayAll() 130abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self.assertFalse(self.scheduler.ScheduleSuite(self._SUITE, 131abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._BOARD, 132abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._BUILD, 133abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._POOL, 134abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette None, 135abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._PRIORITY, 136abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._TIMEOUT)) 137abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette 138abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette 139fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone def testForceScheduleSuite(self): 140fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone """Test a successful de-dup, but force scheduling the suite.""" 141fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone # Expect an attempt to schedule; allow it to succeed. 142fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self.afe.run('create_suite_job', 143b6ec8ae8b13902110f664cf51e3a1d9b43c9f8f3Simran Basi name=self._SUITE, 144fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone board=self._BOARD, 145a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi builds=self._BUILDS, 146fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone check_hosts=False, 1473eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone num=None, 1487d658cf6bade565c1098fd7b47075e96e7b542caAlex Miller pool=self._POOL, 149c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller priority=self._PRIORITY, 150a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi test_source_build=None, 151334f08229806e279c7107b86ab1847625577e0eaDan Shi timeout=self._TIMEOUT, 1524de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi max_runtime_mins=self._TIMEOUT_MINS, 1534de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi timeout_mins=self._TIMEOUT_MINS, 1546de2bdedc42b9c6226730ad9ba3e64a8a0bd104dPrashanth B file_bugs=False, 15529a1699233e8ab15056d3d820dbad76728c8e4a6Dan Shi wait_for_results=False, 156bba4949246f53f53369f673aa8645de121ce337bDan Shi job_retry=False, 1572121a3382d70bfb60284a830f341d78d6d555519Dan Shi delay_minutes=0, 158f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi run_prod_code=False, 159f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn(7) 160fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self.mox.ReplayAll() 161fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self.assertTrue(self.scheduler.ScheduleSuite(self._SUITE, 162fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._BOARD, 163fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._BUILD, 164fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._POOL, 1653eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone None, 166c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._PRIORITY, 167c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._TIMEOUT, 168fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone force=True)) 169fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 170fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 171fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone def testShouldScheduleSuiteExplodes(self): 172fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """Test a failure to de-dup.""" 173abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is UP! 174abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD) 175fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # Barf while checking for similar suites. 1766d388bce820b54792aa51e7294ac8c3c50bec036Chris Masone self.afe.get_jobs( 177e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__istartswith=self._BUILD, 178e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__iendswith='control.'+self._SUITE, 179f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi created_on__gte=mox.IgnoreArg(), 180f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndRaise(Exception()) 181fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.mox.ReplayAll() 182fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.assertRaises(deduping_scheduler.DedupException, 183fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.scheduler.ScheduleSuite, 184fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._SUITE, 185fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._BOARD, 186fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._BUILD, 1873eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone self._POOL, 188c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._NUM, 189c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._PRIORITY, 190c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._TIMEOUT) 191fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 192fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 193fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone def testScheduleFail(self): 194fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """Test a successful de-dup and failure to schedule the suite.""" 195abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is UP! 196abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD) 197fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # A similar suite has not already been scheduled. 198e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi self.afe.get_jobs(name__istartswith=self._BUILD, 199e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__iendswith='control.'+self._SUITE, 200f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi created_on__gte=mox.IgnoreArg(), 201f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn([]) 202fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # Expect an attempt to create a job for the suite; fail it. 203fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.afe.run('create_suite_job', 204b6ec8ae8b13902110f664cf51e3a1d9b43c9f8f3Simran Basi name=self._SUITE, 205fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone board=self._BOARD, 206a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi builds=self._BUILDS, 207fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone check_hosts=False, 2083eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone num=None, 2097d658cf6bade565c1098fd7b47075e96e7b542caAlex Miller pool=None, 210c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller priority=self._PRIORITY, 211a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi test_source_build=None, 212334f08229806e279c7107b86ab1847625577e0eaDan Shi timeout=self._TIMEOUT, 2134de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi max_runtime_mins=self._TIMEOUT_MINS, 2144de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi timeout_mins=self._TIMEOUT_MINS, 2156de2bdedc42b9c6226730ad9ba3e64a8a0bd104dPrashanth B file_bugs=False, 2162121a3382d70bfb60284a830f341d78d6d555519Dan Shi wait_for_results=False, 217f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi run_prod_code=False, 218f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn(None) 219fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.mox.ReplayAll() 220fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.assertRaises(deduping_scheduler.ScheduleException, 221fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.scheduler.ScheduleSuite, 222fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._SUITE, 223fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._BOARD, 224fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._BUILD, 2253eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone None, 226c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller None, 227c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._PRIORITY, 228c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._TIMEOUT) 229fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 230fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 231fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone def testScheduleExplodes(self): 232fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone """Test a successful de-dup and barf while scheduling the suite.""" 233abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is UP! 234abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD) 235fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # A similar suite has not already been scheduled. 236e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi self.afe.get_jobs(name__istartswith=self._BUILD, 237e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__iendswith='control.'+self._SUITE, 238f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi created_on__gte=mox.IgnoreArg(), 239f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn([]) 240fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone # Expect an attempt to create a job for the suite; barf on it. 241fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.afe.run('create_suite_job', 242b6ec8ae8b13902110f664cf51e3a1d9b43c9f8f3Simran Basi name=self._SUITE, 243fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone board=self._BOARD, 244a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi builds=self._BUILDS, 245fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone check_hosts=False, 2463eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone num=None, 2477d658cf6bade565c1098fd7b47075e96e7b542caAlex Miller pool=None, 248c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller priority=self._PRIORITY, 249a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi test_source_build=None, 250334f08229806e279c7107b86ab1847625577e0eaDan Shi timeout=self._TIMEOUT, 2514de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi max_runtime_mins=self._TIMEOUT_MINS, 2524de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi timeout_mins=self._TIMEOUT_MINS, 2536de2bdedc42b9c6226730ad9ba3e64a8a0bd104dPrashanth B file_bugs=False, 2542121a3382d70bfb60284a830f341d78d6d555519Dan Shi wait_for_results=False, 255f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi run_prod_code=False, 256f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndRaise(Exception()) 257fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.mox.ReplayAll() 258fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.assertRaises(deduping_scheduler.ScheduleException, 259fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self.scheduler.ScheduleSuite, 260fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._SUITE, 261fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone self._BOARD, 262fad911ada4f6126280765f15204eaf8b3b4bc437Chris Masone self._BUILD, 2633eeaf0a16652998b31c425bc5007fdc9fed60e38Chris Masone None, 264c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller None, 265c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._PRIORITY, 266c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller self._TIMEOUT) 267fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 268fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone 269d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng def _SetupScheduleSuiteMocks(self, mock_bug_id): 270d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng """Setup mocks needed for SuiteSchedulerBug testing. 271d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng 272d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng @param mock_bug_id: An integer representing a bug id that should be 273d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng returned by Reporter._create_bug_report 274d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng None if _create_bug_report is supposed to 275d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng fail. 276d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng """ 2773197b39f82eb92afff33c7d44b805afe120c7627Fang Deng self.mox.StubOutWithMock(reporting.Reporter, '__init__') 278a776c8bae51a0b5472602bf66ebd903dc779a6abKeyar Hood self.mox.StubOutWithMock(reporting.Reporter, '_create_bug_report') 279a776c8bae51a0b5472602bf66ebd903dc779a6abKeyar Hood self.mox.StubOutWithMock(reporting.Reporter, '_check_tracker') 2803eef705b7d5b96eb48f635d9023902f4a601736dAllen Li self.mox.StubOutWithMock(reporting.Reporter, '_find_issue_by_marker') 2813197b39f82eb92afff33c7d44b805afe120c7627Fang Deng self.mox.StubOutWithMock(site_utils, 'get_sheriffs') 2823197b39f82eb92afff33c7d44b805afe120c7627Fang Deng self.scheduler._file_bug = True 283abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette # Lab is UP! 284abbe09600d73d77af92157027a20661c035be01eJ. Richard Barnette self._SetupLabStatus(self._BUILD) 2853197b39f82eb92afff33c7d44b805afe120c7627Fang Deng # A similar suite has not already been scheduled. 286e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi self.afe.get_jobs(name__istartswith=self._BUILD, 287e7912682c3cafc26cc0d9272e59925b9bff67478Dan Shi name__iendswith='control.'+self._SUITE, 288f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi created_on__gte=mox.IgnoreArg(), 289f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndReturn([]) 2903197b39f82eb92afff33c7d44b805afe120c7627Fang Deng message = 'Control file not found.' 2913197b39f82eb92afff33c7d44b805afe120c7627Fang Deng exception = error.ControlFileNotFound(message) 292d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng site_utils.get_sheriffs(lab_only=True).AndReturn(['deputy1', 'deputy2']) 2933197b39f82eb92afff33c7d44b805afe120c7627Fang Deng self.afe.run('create_suite_job', 294b6ec8ae8b13902110f664cf51e3a1d9b43c9f8f3Simran Basi name=self._SUITE, 2953197b39f82eb92afff33c7d44b805afe120c7627Fang Deng board=self._BOARD, 296a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi builds=self._BUILDS, 2973197b39f82eb92afff33c7d44b805afe120c7627Fang Deng check_hosts=False, 2983197b39f82eb92afff33c7d44b805afe120c7627Fang Deng pool=self._POOL, 2997d658cf6bade565c1098fd7b47075e96e7b542caAlex Miller num=self._NUM, 300c7bcf8bf70d6e40aa4d37528f75b5a98b0f7a00eAlex Miller priority=self._PRIORITY, 301a25e0d48f2c15b7c4d430b671aaee9cb56c8fb1eDan Shi test_source_build=None, 302334f08229806e279c7107b86ab1847625577e0eaDan Shi timeout=self._TIMEOUT, 3034de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi max_runtime_mins=self._TIMEOUT_MINS, 3044de6fb3550e4fb006207b00261fd9ee80ce4b721Dan Shi timeout_mins=self._TIMEOUT_MINS, 3056de2bdedc42b9c6226730ad9ba3e64a8a0bd104dPrashanth B file_bugs=False, 30629a1699233e8ab15056d3d820dbad76728c8e4a6Dan Shi wait_for_results=False, 307bba4949246f53f53369f673aa8645de121ce337bDan Shi job_retry=False, 3082121a3382d70bfb60284a830f341d78d6d555519Dan Shi delay_minutes=0, 309f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi run_prod_code=False, 310f770c456af6aec782e5fe2bdfe2b253a5b901f86Dan Shi min_rpc_timeout=mox.IgnoreArg()).AndRaise(exception) 311a776c8bae51a0b5472602bf66ebd903dc779a6abKeyar Hood reporting.Reporter.__init__() 312a776c8bae51a0b5472602bf66ebd903dc779a6abKeyar Hood reporting.Reporter._check_tracker().AndReturn(True) 3133eef705b7d5b96eb48f635d9023902f4a601736dAllen Li (reporting.Reporter._find_issue_by_marker(mox.IgnoreArg()) 3143eef705b7d5b96eb48f635d9023902f4a601736dAllen Li .AndReturn(None)) 315d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng reporting.Reporter._create_bug_report( 316d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng mox.IgnoreArg(), {}, []).AndReturn(mock_bug_id) 317d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng 318d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng 319d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng def testScheduleReportsBugSuccess(self): 320d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng """Test that the scheduler file a bug.""" 321d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self._SetupScheduleSuiteMocks(1158) 3223197b39f82eb92afff33c7d44b805afe120c7627Fang Deng self.mox.ReplayAll() 323d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self.assertFalse(self.scheduler.ScheduleSuite( 324d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self._SUITE, self._BOARD, self._BUILD, self._POOL, 325d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self._NUM, self._PRIORITY, self._TIMEOUT)) 326d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self.mox.VerifyAll() 327d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng 328d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng 329d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng def testScheduleReportsBugFalse(self): 330d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng """Test that the scheduler failed to file a bug.""" 331d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self._SetupScheduleSuiteMocks(None) 332d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self.mox.ReplayAll() 333d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self.assertRaises( 334d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng deduping_scheduler.ScheduleException, 335d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self.scheduler.ScheduleSuite, 336d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self._SUITE, self._BOARD, self._BUILD, self._POOL, 337d8f940e43413b52c7ba508423b939295ef74ce34Fang Deng self._NUM, self._PRIORITY, self._TIMEOUT) 3383197b39f82eb92afff33c7d44b805afe120c7627Fang Deng self.mox.VerifyAll() 3393197b39f82eb92afff33c7d44b805afe120c7627Fang Deng 3403197b39f82eb92afff33c7d44b805afe120c7627Fang Deng 341fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masoneif __name__ == '__main__': 342fbdd0706636487d3c88cca67bac4cd82a81bd079Chris Masone unittest.main() 343