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