| OLD | NEW |
| (Empty) | |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 from testing_support import auto_stub |
| 6 |
| 7 from infra.libs.buildbot import master |
| 8 from infra.libs.time_functions import timestamp |
| 9 from infra.services.master_lifecycle import buildbot_state |
| 10 |
| 11 class TestBuildbotState(auto_stub.TestCase): |
| 12 def setUp(self): |
| 13 super(TestBuildbotState, self).setUp() |
| 14 self.matcher = buildbot_state.construct_pattern_matcher() |
| 15 self.utcnow = 2000 |
| 16 self.last_boot = 1000 |
| 17 self.last_no_new_builds = 1100 |
| 18 self.buildbot_is_running = True |
| 19 self.accepting_builds = True |
| 20 self.desired_buildbot_state = 'running' |
| 21 self.desired_transition_time = 900 |
| 22 |
| 23 def utcnow_handler(): |
| 24 return self.utcnow |
| 25 def last_boot_handler(*_args): |
| 26 return self.last_boot |
| 27 def last_no_new_builds_handler(*_args): |
| 28 return self.last_no_new_builds |
| 29 def buildbot_is_running_handler(*_args): |
| 30 return self.buildbot_is_running |
| 31 def accepting_builds_handler(*_args, **_kwargs): |
| 32 return self.accepting_builds |
| 33 |
| 34 self.mock(timestamp, 'utcnow_ts', utcnow_handler) |
| 35 self.mock(master, 'get_last_boot', last_boot_handler) |
| 36 self.mock(master, 'get_last_no_new_builds', last_no_new_builds_handler) |
| 37 self.mock(master, 'buildbot_is_running', buildbot_is_running_handler) |
| 38 self.mock(master, 'get_accepting_builds', accepting_builds_handler) |
| 39 |
| 40 def _get_evidence(self): |
| 41 evidence = buildbot_state.collect_evidence('fake_dir') |
| 42 evidence['desired_buildbot_state'] = { |
| 43 'desired_state': self.desired_buildbot_state, |
| 44 'transition_time_utc': self.desired_transition_time, |
| 45 } |
| 46 return evidence |
| 47 |
| 48 def _get_state(self): |
| 49 return self.matcher.get_state(self._get_evidence()) |
| 50 |
| 51 def _get_execution_list(self): |
| 52 return self.matcher.execution_list(self._get_evidence()) |
| 53 |
| 54 def testPatternMatcherIsSane(self): |
| 55 self.assertTrue(self.matcher.is_correct) |
| 56 |
| 57 |
| 58 #### Tests. |
| 59 |
| 60 def testBuildbotIsOffline(self): |
| 61 self.buildbot_is_running = False |
| 62 state = self._get_state()['buildbot'] |
| 63 self.assertEqual(state, 'offline') |
| 64 |
| 65 def testBuildbotIsStarting(self): |
| 66 self.utcnow = self.last_boot + 4 * 60 |
| 67 self.accepting_builds = None |
| 68 state = self._get_state()['buildbot'] |
| 69 self.assertEqual(state, 'starting') |
| 70 |
| 71 def testBuildbotIsRunning(self): |
| 72 state = self._get_state()['buildbot'] |
| 73 self.assertEqual(state, 'running') |
| 74 |
| 75 def testBuildbotIsDraining(self): |
| 76 self.accepting_builds = False |
| 77 self.utcnow = self.last_no_new_builds + 4 * 60 |
| 78 state = self._get_state()['buildbot'] |
| 79 self.assertEqual(state, 'draining') |
| 80 |
| 81 def testBuildbotIsDrained(self): |
| 82 self.accepting_builds = False |
| 83 state = self._get_state()['buildbot'] |
| 84 self.assertEqual(state, 'drained') |
| 85 |
| 86 def testBuildbotIsCrashing(self): |
| 87 self.accepting_builds = None |
| 88 state = self._get_state()['buildbot'] |
| 89 self.assertEqual(state, 'crashed') |
| 90 |
| 91 def testDesiredOffline(self): |
| 92 self.desired_buildbot_state = 'offline' |
| 93 state = self._get_state()['desired_buildbot_state'] |
| 94 self.assertEqual(state, 'offline') |
| 95 |
| 96 def testDesiredInvalid(self): |
| 97 self.desired_buildbot_state = 'delicious' |
| 98 with self.assertRaises(ValueError): |
| 99 _ = self._get_state() |
| 100 |
| 101 def testDesiredUpToDate(self): |
| 102 state = self._get_state()['desired_transition_time'] |
| 103 self.assertEqual(state, 'hold_steady') |
| 104 |
| 105 def testDesiredFuture(self): |
| 106 self.desired_transition_time = 3000 |
| 107 with self.assertRaises(ValueError): |
| 108 _ = self._get_state() |
| 109 |
| 110 def testDesiredReboot(self): |
| 111 self.desired_transition_time = 1100 |
| 112 state = self._get_state()['desired_transition_time'] |
| 113 self.assertEqual(state, 'ready_to_fire') |
| 114 |
| 115 def testNoLastBoot(self): |
| 116 self.last_boot = None |
| 117 state = self._get_state()['desired_transition_time'] |
| 118 self.assertEqual(state, 'ready_to_fire') |
| 119 |
| 120 def testOfflineStaysOffline(self): |
| 121 self.desired_buildbot_state = 'offline' |
| 122 self.buildbot_is_running = False |
| 123 _, _, execution_list = self._get_execution_list() |
| 124 self.assertEqual(execution_list, []) |
| 125 |
| 126 def testRestartKickedOff(self): |
| 127 self.desired_transition_time = 1100 |
| 128 _, _, execution_list = self._get_execution_list() |
| 129 self.assertEqual(execution_list, [master.MakeNoNewBuilds]) |
| 130 |
| 131 def testTurnDown(self): |
| 132 self.desired_buildbot_state = 'offline' |
| 133 self.accepting_builds = False |
| 134 _, _, execution_list = self._get_execution_list() |
| 135 self.assertEqual(execution_list, [master.MakeStop]) |
| 136 |
| 137 def testStartUp(self): |
| 138 self.buildbot_is_running = False |
| 139 _, _, execution_list = self._get_execution_list() |
| 140 self.assertEqual(execution_list, [master.GclientSync, master.MakeStart]) |
| 141 |
| 142 def testRestart(self): |
| 143 self.accepting_builds = False |
| 144 _, _, execution_list = self._get_execution_list() |
| 145 self.assertEqual(execution_list, [ |
| 146 master.GclientSync, |
| 147 master.MakeStop, |
| 148 master.MakeWait, |
| 149 master.MakeStart]) |
| OLD | NEW |