Index: commit-queue/tests/try_job_on_rietveld_test.py |
=================================================================== |
--- commit-queue/tests/try_job_on_rietveld_test.py (revision 249146) |
+++ commit-queue/tests/try_job_on_rietveld_test.py (working copy) |
@@ -1,1553 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""Unit tests for verification/try_job_on_rietveld.py.""" |
- |
-import logging |
-import os |
-import random |
-import string |
-import sys |
-import time |
-import unittest |
- |
-ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) |
-sys.path.insert(0, os.path.join(ROOT_DIR, '..')) |
- |
-# In tests/ |
-import mocks |
-from mocks import BuildbotBuildStep |
- |
-# In root |
-from verification import base |
-from verification import try_job_steps |
-from verification import try_job_on_rietveld |
- |
- |
-# Some tests produce more output if verbose, so we need to |
-# track if we are in verbose mode or not. |
-VERBOSE = False |
- |
- |
-def _posted(builders): |
- return 'trigger_try_jobs(42, 23, \'CQ\', False, \'HEAD\', %s)' % str(builders) |
- |
- |
-def gen_job_pending(**kwargs): |
- value = { |
- '__persistent_type__': 'RietveldTryJobPending', |
- 'builder': None, |
- 'clobber': False, |
- 'init_time': 1., |
- 'requested_steps': [], |
- 'revision': None, |
- 'tries': 1, |
- } |
- assert all(arg in value for arg in kwargs) |
- value.update(kwargs) |
- return value |
- |
- |
-def gen_job(**kwargs): |
- value = { |
- '__persistent_type__': 'RietveldTryJob', |
- 'build': None, |
- 'builder': None, |
- 'clobber': False, |
- 'completed': False, |
- 'init_time': 1., |
- 'parent_key': None, |
- 'requested_steps': [], |
- 'revision': None, |
- 'started': 1, |
- 'steps_failed': [], |
- 'steps_passed': [], |
- 'tries': 1, |
- } |
- assert all(arg in value for arg in kwargs) |
- value.update(kwargs) |
- return value |
- |
- |
-def gen_jobs(**kwargs): |
- value = { |
- '__persistent_type__': 'RietveldTryJobs', |
- 'error_message': None, |
- 'irrelevant': [], |
- 'pendings': [], |
- 'skipped': False, |
- 'step_verifiers': [], |
- 'try_jobs': {}, |
- } |
- for arg in kwargs: |
- if arg not in value: |
- raise Exception('Invalid arg %s' % str(arg)) |
- |
- value.update(kwargs) |
- |
- # Convert all the verifiers to dicts (i.e. serialize them). |
- value['step_verifiers'] = [step.as_dict() for step in value['step_verifiers']] |
- |
- return value |
- |
- |
-class TryJobOnRietveldBase(mocks.TestCase): |
- # Base class for all test cases testing try_job_rietveld.py. |
- def setUp(self): |
- super(TryJobOnRietveldBase, self).setUp() |
- self.timestamp = [] |
- self.mock(time, 'time', self._time) |
- self.email = 'user1@example.com' |
- self.user = 'user1' |
- self.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ] |
- |
- def tearDown(self): |
- try: |
- if not self.has_failed(): |
- self.assertEqual(0, len(self.timestamp)) |
- finally: |
- super(TryJobOnRietveldBase, self).tearDown() |
- |
- def _time(self): |
- self.assertTrue(self.timestamp) |
- return self.timestamp.pop(0) |
- |
- |
-class TryRunnerRietveldTest(TryJobOnRietveldBase): |
- # These test cases setup self.try_runner and call .verify() and |
- # .update_status() to test it. |
- def setUp(self): |
- super(TryRunnerRietveldTest, self).setUp() |
- self.try_runner = None |
- self._change_step_verifiers(self.step_verifiers) |
- |
- # Patch it a little. |
- self.buildbot_status = mocks.BuildbotMock(self) |
- self.mock( |
- try_job_on_rietveld.buildbot_json, |
- 'Buildbot', |
- lambda _: self.buildbot_status) |
- |
- self.pending.revision = 123 |
- |
- # It's what rietveld is going to report. |
- self._key = (self.pending.issue, self.pending.patchset) |
- self.context.rietveld.patchsets_properties[self._key] = { |
- 'try_job_results': [], |
- } |
- |
- def tearDown(self): |
- try: |
- if not self.has_failed(): |
- # Not to confuse with self.context.status which is AsyncPush mock. |
- self.buildbot_status.check_calls([]) |
- finally: |
- super(TryRunnerRietveldTest, self).tearDown() |
- |
- def _change_step_verifiers(self, step_verifiers): |
- """Change the current step verifiers and update any objects that used |
- the old ones.""" |
- self.step_verifiers = step_verifiers |
- |
- # time is requested in the object construction below and self.timestamp |
- # will be empty at the end of this function call. |
- self.timestamp.append(1.) |
- self.try_runner = try_job_on_rietveld.TryRunnerRietveld( |
- self.context, |
- 'http://foo/bar', |
- self.email, |
- self.step_verifiers, |
- ['ignored_step'], |
- 'sol', |
- ) |
- self.try_runner.update_latency = 0 |
- |
- |
- def _get_verif(self): |
- """Returns the RietveldTryJobs instance associated to this PendCommit.""" |
- return self.pending.verifications[self.try_runner.name] |
- |
- def _assert_pending_is_empty(self): |
- actual = self._get_verif().as_dict() |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'linux', requested_steps=['test1', 'test2']), |
- gen_job_pending(builder=u'mac', requested_steps=['test1', 'test2']), |
- ]) |
- self.assertEqual(expected, actual) |
- |
- def _add_build(self, builder, buildnumber, revision, steps, completed): |
- """Adds a build with a randomly generated key. |
- |
- Adds the build to both the try server and to Rietveld. |
- """ |
- key = ''.join(random.choice(string.ascii_letters) for _ in xrange(8)) |
- build = self.buildbot_status.add_build( |
- builder, buildnumber, revision, key, completed, None) |
- build.steps.extend(steps) |
- self.context.rietveld.patchsets_properties[self._key][ |
- 'try_job_results'].append( |
- { |
- 'key': key, |
- 'builder': builder, |
- 'buildnumber': buildnumber, |
- }) |
- return key |
- |
- def _add_triggered_build(self, builder, buildnumber, revision, steps, |
- completed, parent_key): |
- """Adds a triggered build with a randomly generated key. |
- |
- Adds the build to both the try server and to Rietveld. |
- """ |
- key = ''.join(random.choice(string.ascii_letters) for _ in xrange(8)) |
- build = self.buildbot_status.add_build( |
- builder, buildnumber, revision, key, completed, parent_key) |
- build.steps.extend(steps) |
- self.context.rietveld.patchsets_properties[self._key][ |
- 'try_job_results'].append( |
- { |
- 'key': key, |
- 'builder': builder, |
- 'buildnumber': buildnumber, |
- }) |
- return key |
- |
- def check_pending(self, num_status, rietveld, state, err): |
- self.context.status.check_names(['try job rietveld'] * num_status) |
- self.context.rietveld.check_calls(rietveld) |
- self.assertEqual(state, self.pending.get_state()) |
- self.assertEqual(err, self.pending.error_message()) |
- |
- def check_verif(self, need, waiting): |
- rietveld_try_jobs = self._get_verif() |
- self.assertEqual(need, rietveld_try_jobs.tests_need_to_be_run(1.)) |
- self.assertEqual(waiting, rietveld_try_jobs.tests_waiting_for_result()) |
- if not waiting: |
- why_not = None |
- else: |
- why_not = ( |
- 'Waiting for the following jobs:\n' + |
- ''.join( |
- ' %s: %s\n' % (b, ','.join(waiting[b])) for b in sorted(waiting))) |
- self.assertEqual(why_not, rietveld_try_jobs.why_not()) |
- |
- def call_verify( |
- self, timestamps, num_status, rietveld, state, err, need, waiting): |
- """Calls TryRunnerRietveld.verify(). |
- |
- Makes sure the specified number of time.time() calls occurred. |
- """ |
- self.assertEqual(0, len(self.timestamp)) |
- self.timestamp = timestamps |
- self.try_runner.verify(self.pending) |
- self.assertEqual(0, len(self.timestamp)) |
- self.check_pending(num_status, rietveld, state, err) |
- self.check_verif(need, waiting) |
- |
- def call_update_status( |
- self, timestamps, num_status, rietveld, state, err, need, waiting): |
- """Calls TryRunnerRietveld.update_status(). |
- """ |
- self.timestamp = timestamps |
- self.try_runner.update_status([self.pending]) |
- self.check_pending(num_status, rietveld, state, err) |
- self.check_verif(need, waiting) |
- |
- def testVoid(self): |
- self.assertEqual(self.pending.verifications.keys(), []) |
- self.assertEqual(base.PROCESSING, self.pending.get_state()) |
- self.assertEqual('', self.pending.error_message()) |
- |
- def testVoidUpdate(self): |
- self.try_runner.update_status([]) |
- self.assertEqual(base.PROCESSING, self.pending.get_state()) |
- self.assertEqual('', self.pending.error_message()) |
- |
- def testVerificationVoid(self): |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- self._assert_pending_is_empty() |
- |
- def testVerificationUpdateNoJob(self): |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- self._assert_pending_is_empty() |
- self.call_update_status( |
- [1.] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- self._assert_pending_is_empty() |
- |
- def testVerificationUpdate(self): |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- self._assert_pending_is_empty() |
- key = self._add_build('mac', 32, 42, [], False) |
- |
- self.call_update_status( |
- [1.] * (3 + 1 * VERBOSE), |
- num_status=1, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
- ], |
- try_jobs={ |
- key: gen_job( |
- builder='mac', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- revision=42), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testVerificationSuccess(self): |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- key2 = self._add_build( |
- 'linux', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- |
- self.call_update_status( |
- [1.] * (4 + 2 * VERBOSE), |
- num_status=2, |
- rietveld=[], |
- state=base.SUCCEEDED, |
- err='', |
- need={}, |
- waiting={}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder=u'mac', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- steps_passed=['test1', 'test2'], |
- revision=42), |
- key2: gen_job( |
- builder=u'linux', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- steps_passed=['test1', 'test2'], |
- revision=42), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testVerificationRetrySuccess(self): |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', False)], |
- False) |
- key2 = self._add_build( |
- 'linux', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- |
- self.call_update_status( |
- [1.] * (5 + 2 * VERBOSE), |
- num_status=3, |
- rietveld=[_posted({u"mac": ["test2"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'mac': ['test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'mac', requested_steps=['test2'], tries=2), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder=u'mac', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- steps_failed=['test2'], |
- steps_passed=['test1'], |
- revision=42), |
- key2: gen_job( |
- builder=u'linux', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- steps_passed=['test1', 'test2'], |
- revision=42), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Add a new build on mac where test2 passed. |
- key3 = self._add_build( |
- 'mac', 33, 42, |
- [BuildbotBuildStep('test1', False), BuildbotBuildStep('test2', True)], |
- False) |
- self.call_update_status( |
- [1.] * (5 + 1 * VERBOSE), |
- num_status=3, |
- rietveld=[], |
- state=base.SUCCEEDED, |
- err='', |
- need={}, |
- waiting={}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- build=32, |
- builder='mac', |
- requested_steps=['test1', 'test2'], |
- steps_failed=['test2'], |
- steps_passed=['test1'], |
- revision=42), |
- key2: gen_job( |
- builder='linux', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- revision=42, |
- steps_passed=['test1', 'test2']), |
- key3: gen_job( |
- builder='mac', |
- build=33, |
- requested_steps=['test2'], |
- revision=42, |
- steps_failed=['test1'], |
- steps_passed=['test2'], |
- tries=2), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testVerificationRetryRetry(self): |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', False)], |
- False) |
- key2 = self._add_build( |
- 'linux', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- |
- self.call_update_status( |
- [1.] * (5 + 2 * VERBOSE), |
- num_status=3, |
- rietveld=[_posted({u"mac": ["test2"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'mac': ['test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder='mac', requested_steps=['test2'], tries=2), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder='mac', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- steps_failed=['test2'], |
- steps_passed=['test1'], |
- revision=42), |
- key2: gen_job( |
- builder='linux', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- steps_passed=['test1', 'test2'], |
- revision=42), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Add a new build on mac where test2 failed. |
- key3 = self._add_build('mac', 33, 42, [BuildbotBuildStep('test2', False)], |
- False) |
- |
- self.call_update_status( |
- [1.] * (6 + 1 * VERBOSE), |
- num_status=4, |
- rietveld=[_posted({u"mac": ["test2"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'mac': ['test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder='mac', requested_steps=['test2'], tries=3), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- build=32, |
- builder='mac', |
- requested_steps=['test1', 'test2'], |
- steps_failed=['test2'], |
- steps_passed=['test1'], |
- revision=42), |
- key2: gen_job( |
- builder='linux', |
- build=32, |
- requested_steps=['test1', 'test2'], |
- revision=42, |
- steps_passed=['test1', 'test2']), |
- key3: gen_job( |
- builder='mac', |
- build=33, |
- requested_steps=['test2'], |
- revision=42, |
- steps_failed=['test2'], |
- tries=2), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Add a new build on mac where test2 failed again! Too bad now. |
- self._add_build('mac', 34, 42, [BuildbotBuildStep('test2', False)], False) |
- |
- self.call_update_status( |
- [1.] * (6 + 2 * VERBOSE), |
- num_status=4, |
- rietveld=[], |
- state=base.FAILED, |
- err=( |
- u'Retried try job too often on mac for step(s) test2\n' |
- 'http://foo/bar/buildstatus?builder=mac&number=34'), |
- need={}, |
- waiting={}) |
- |
- def testVerificationRetryRetryTriggered(self): |
- step_verifiers = [ |
- try_job_steps.TryJobTriggeredSteps( |
- builder_name='triggered', |
- trigger_name='builder', |
- steps={'test1': 'build'})] |
- self._change_step_verifiers(step_verifiers) |
- |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"builder": ["build"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'triggered': ['test1']}) |
- |
- # The trigger bot passed, but the triggered bot fails. |
- key1 = self._add_build('builder', 1, 42, [BuildbotBuildStep('build', True)], |
- True) |
- self._add_triggered_build('triggered', 1, 42, |
- [BuildbotBuildStep('test1', False)], True, key1) |
- triggered_key_1 = 'triggered/1_triggered_%s' % key1 |
- |
- self.call_update_status( |
- [1.] * (6 + 2 * VERBOSE), |
- num_status=4, |
- rietveld=[_posted({u"builder": ["build"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'triggered': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobTriggeredSteps( |
- builder_name='triggered', |
- trigger_name='builder', |
- steps={'test1': 'build'})], |
- pendings=[ |
- gen_job_pending(builder='builder', requested_steps=['build'], tries=2), |
- gen_job_pending(builder='triggered', requested_steps=['test1'], |
- tries=2), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder='builder', |
- build=1, |
- requested_steps=['build'], |
- steps_passed=['build'], |
- completed=True, |
- revision=42, |
- tries=1, |
- ), |
- triggered_key_1: gen_job( |
- builder='triggered', |
- build=1, |
- requested_steps=['test1'], |
- steps_failed=['test1'], |
- completed=True, |
- revision=42, |
- parent_key=key1, |
- tries=1, |
- ), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Triggered bot fails again. |
- key2 = self._add_build('builder', 2, 42, [BuildbotBuildStep('build', True)], |
- True) |
- self._add_triggered_build('triggered', 2, 42, |
- [BuildbotBuildStep('test1', False)], True, key2) |
- triggered_key_2 = 'triggered/2_triggered_%s' % key2 |
- |
- self.call_update_status( |
- [1.] * (6 + 2 * VERBOSE), |
- num_status=4, |
- rietveld=[_posted({u"builder": ["build"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'triggered': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobTriggeredSteps( |
- builder_name='triggered', |
- trigger_name='builder', |
- steps={'test1': 'build'})], |
- pendings=[ |
- gen_job_pending(builder='builder', requested_steps=['build'], tries=3), |
- gen_job_pending(builder='triggered', requested_steps=['test1'], |
- tries=3), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder='builder', |
- build=1, |
- requested_steps=['build'], |
- steps_passed=['build'], |
- completed=True, |
- revision=42, |
- tries=1, |
- ), |
- triggered_key_1: gen_job( |
- builder='triggered', |
- build=1, |
- requested_steps=['test1'], |
- steps_failed=['test1'], |
- completed=True, |
- revision=42, |
- parent_key=key1, |
- tries=1, |
- ), |
- key2: gen_job( |
- builder='builder', |
- build=2, |
- requested_steps=['build'], |
- steps_passed=['build'], |
- completed=True, |
- revision=42, |
- tries=2, |
- ), |
- triggered_key_2: gen_job( |
- builder='triggered', |
- build=2, |
- requested_steps=['test1'], |
- steps_failed=['test1'], |
- completed=True, |
- revision=42, |
- parent_key=key2, |
- tries=2, |
- ), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Triggered bot fails for the 3rd time, abort. |
- key3 = self._add_build('builder', 3, 1, [BuildbotBuildStep('build', True)], |
- True) |
- self._add_triggered_build('triggered', 3, 1, |
- [BuildbotBuildStep('test1', False)], True, key3) |
- self.call_update_status( |
- [1.] * (4 + 3 * VERBOSE), |
- num_status=2, |
- rietveld=[], |
- state=base.FAILED, |
- # TODO(csharp): Its the triggered bot that keeps failing, so that should |
- # be the bot mentioned here. |
- err=( |
- u'Retried try job too often on builder for step(s) build\n' |
- 'http://foo/bar/buildstatus?builder=builder&number=3'), |
- need={}, |
- waiting={}) |
- |
- def testVerificationPreviousJobGood(self): |
- # Reuse the previous job if good. |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- |
- self.call_verify( |
- [1.] * (2 + 1 * VERBOSE), |
- num_status=1, |
- rietveld=[_posted({u"linux": ["test1", "test2"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2']}) |
- |
- # Sends an update to note the job was started. |
- self.call_update_status( |
- [1.] * 3, |
- num_status=1, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder='linux', requested_steps=['test1', 'test2']), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- build=32, |
- builder='mac', |
- # Note that requested_steps is empty since testfilter is not parsed. |
- steps_passed=['test1', 'test2'], |
- revision=42, |
- # tries == 0 since we didn't start it. |
- tries=0), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def _expired(self, now, **kwargs): |
- # Exacly like testVerificationPreviousJobGood except that jobs are always |
- # too old, either by revision or by timestamp. |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- |
- self.call_verify( |
- [now] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- |
- self.call_update_status( |
- [now] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- irrelevant=[key1], |
- pendings=[ |
- gen_job_pending( |
- builder='linux', requested_steps=['test1', 'test2'], **kwargs), |
- gen_job_pending( |
- builder='mac', requested_steps=['test1', 'test2'], **kwargs), |
- ]) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testVerificationPreviousExpiredRevisionTooOld(self): |
- self.context.checkout.revisions = lambda _r1, _r2: 201 |
- self._expired(1.) |
- |
- def testVerificationPreviousExpiredDateTooOld(self): |
- # 5 days old. |
- old = 5*24*60*60. |
- self._expired(old, init_time=old) |
- |
- def _previous_job_partially_good( |
- self, steps, steps_failed, completed, expect_mac_retry, num_time_verify, |
- num_time_update, num_status_update): |
- # Reuse the previous job tests that passed. |
- key1 = self._add_build('mac', 32, 42, steps, completed) |
- |
- expected_calls = [_posted({u"linux": ["test1", "test2"]})] |
- pendings = [ |
- gen_job_pending(builder='linux', requested_steps=['test1', 'test2']) |
- ] |
- if expect_mac_retry: |
- # No need to run test2 again. |
- expected_calls.append(_posted({u"mac": ["test1"]})) |
- pendings.append(gen_job_pending(builder='mac', requested_steps=['test1'])) |
- self.call_verify( |
- [1.] * (num_time_verify + 1 * VERBOSE), |
- num_status=len(expected_calls), |
- rietveld=expected_calls, |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1']}) |
- self.call_update_status( |
- [1.] * num_time_update, |
- num_status=num_status_update, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=pendings, |
- try_jobs={ |
- key1: gen_job( |
- build=32, |
- builder='mac', |
- # Note that requested_steps is empty since testfilter is not parsed. |
- steps_failed=steps_failed, |
- steps_passed=['test2'], |
- revision=42, |
- # tries == 0 since we didn't start it. |
- tries=0, |
- completed=completed), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testVerificationPreviousJobPartiallyGood1(self): |
- # Only test1 will be run on mac since test2 had passed. |
- self._previous_job_partially_good( |
- [BuildbotBuildStep('test1', False), BuildbotBuildStep('test2', True)], |
- ['test1'], True, True, 3, 2, 0) |
- |
- def testVerificationPreviousJobPartiallyGood2(self): |
- # Let's assume a testfilter was used and test1 wasn't run. Only test1 will |
- # be run on mac. |
- self._previous_job_partially_good( |
- [BuildbotBuildStep('test2', True)], [], True, True, 3, 2, 0) |
- |
- def testVerificationPreviousJobPartiallyGood3(self): |
- # Test that we do not retry on mac until it completes. This is because |
- # CQ does not parse the test filter, so we do not know if the mac job |
- # will run test1. |
- # It's kind of weird, because it sends a status report like if it had |
- # started this job. |
- self._previous_job_partially_good( |
- [BuildbotBuildStep('test2', True)], [], False, False, 2, 3, 1) |
- |
- def testVerificationPreviousJobsWereGood(self): |
- # Reuse the previous jobs tests that passed. Do not send any try job. |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- key2 = self._add_build( |
- 'linux', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- False) |
- |
- # People will love that! |
- self.call_verify( |
- [1.] * (1 + 2 * VERBOSE), |
- num_status=0, |
- rietveld=[], |
- state=base.SUCCEEDED, |
- err='', |
- need={}, |
- waiting={}) |
- |
- self.call_update_status( |
- [1.], |
- num_status=0, |
- rietveld=[], |
- state=base.SUCCEEDED, |
- err='', |
- need={}, |
- waiting={}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- build=32, |
- builder='mac', |
- # Note that requested_steps is empty since testfilter is not parsed. |
- steps_passed=['test1', 'test2'], |
- revision=42, |
- # tries == 0 since we didn't start it. |
- tries=0), |
- key2: gen_job( |
- build=32, |
- builder='linux', |
- # Note that requested_steps is empty since testfilter is not parsed. |
- steps_passed=['test1', 'test2'], |
- revision=42, |
- # tries == 0 since we didn't start it. |
- tries=0), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testRietveldTryJobsPendingWasLost(self): |
- # Requested a pending try job but the request was lost. |
- self.try_runner.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ] |
- self.call_verify( |
- [1.] * 2, |
- num_status=1, |
- rietveld=[_posted({u"linux": ["test1"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- self.call_update_status( |
- [1.] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- |
- # 3 minutes later |
- later = 3. * 60 |
- self.call_update_status( |
- [later] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'linux', requested_steps=['test1']), |
- ]) |
- |
- # 1h later. |
- later = 60. * 60 |
- self.call_update_status( |
- [later] * (2 + 1 * VERBOSE), |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'linux', requested_steps=['test1']), |
- ]) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testRietveldTryJobsPendingTookSomeTime(self): |
- # Requested a pending try job but the request took some time to propagate. |
- self.try_runner.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ] |
- self.call_verify( |
- [1.] * 2, |
- num_status=1, |
- rietveld=[_posted({u"linux": ["test1"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- self.call_update_status( |
- [1.] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- # 3 minutes later |
- later = 3. * 60 |
- self.call_update_status( |
- [later] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'linux', requested_steps=['test1']), |
- ]) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Queue it. |
- self.buildbot_status.builders['linux'].pending_builds.data = [ |
- { |
- "builderName":"linux", |
- "builds":[], |
- "reason":"%d-1: None" % self.pending.issue, |
- "source": { |
- "changes": [ |
- { |
- "at": "Wed 05 Dec 2012 19:11:19", |
- "files": [], |
- "number": 268857, |
- "project": "", |
- "properties": [], |
- "rev": "171358", |
- "revision": "171358", |
- "when": 1354763479, |
- "who": self.pending.owner, |
- }, |
- ], |
- "hasPatch": False, |
- "project": "chrome", |
- "repository": "", |
- "revision": "171358", |
- }, |
- "submittedAt": 1354763479, |
- }, |
- ] |
- |
- # 1h later, it must not have queued another job. |
- later = 60. * 60 |
- self.call_update_status( |
- [later] * 2, |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ], |
- pendings=[ |
- gen_job_pending( |
- builder=u'linux', requested_steps=['test1']), |
- ]) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- def testRietveldHung(self): |
- # Send a try job and have it never start. |
- self.try_runner.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ] |
- self.call_verify( |
- [1.] * 2, |
- num_status=1, |
- rietveld=[_posted({u"linux": ["test1"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- key1 = self._add_build( |
- 'linux', 32, 42, |
- [], |
- False) |
- self.call_update_status( |
- [1.] * (3 + 1 * VERBOSE), |
- num_status=1, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder=u'linux', |
- build=32, |
- requested_steps=['test1'], |
- steps_passed=[], |
- revision=42, |
- completed=False), |
- }) |
- |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- # Fast forward in time to make the try job request "timeout". Basically, |
- # the Try Job trigger on Rietveld was somehow ignored by the Try Server |
- # itself. Test our chance by sending another trigger. |
- later = 40. * 24 * 60 * 60 |
- # Update the internal status. |
- self.call_update_status( |
- [later] * 3, |
- num_status=1, |
- rietveld=[_posted({u"linux": ["test1"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1']}) |
- |
- self.assertEqual( |
- 'Waiting for the following jobs:\n linux: test1\n', |
- self._get_verif().why_not()) |
- |
- expected_timed_out = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1']), |
- ], |
- irrelevant=[key1], |
- pendings=[ |
- gen_job_pending( |
- builder=u'linux', init_time=later, requested_steps=['test1']), |
- ]) |
- self.assertEqual(expected_timed_out, self._get_verif().as_dict()) |
- |
- def testVerificationBrokenTestOnHead(self): |
- # The CQ retries until it aborts because the test is broken at HEAD on |
- # mac/test2. |
- self.call_verify( |
- [1.] * 3, |
- num_status=2, |
- rietveld=[ |
- _posted({u"linux": ["test1", "test2"]}), |
- _posted({u"mac": ["test1", "test2"]}), |
- ], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'linux': ['test1', 'test2'], 'mac': ['test1', 'test2']}) |
- key1 = self._add_build( |
- 'mac', 32, 42, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', False)], |
- True) |
- key2 = self._add_build( |
- 'linux', 12, 22, |
- [BuildbotBuildStep('test1', True), BuildbotBuildStep('test2', True)], |
- True) |
- |
- self.call_update_status( |
- [1.] * (5 + 2 * VERBOSE), |
- num_status=3, |
- rietveld=[_posted({u"mac": ["test2"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'mac': ['test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'mac', requested_steps=['test2'], tries=2), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- builder=u'mac', |
- build=32, |
- completed=True, |
- requested_steps=['test1', 'test2'], |
- steps_failed=['test2'], |
- steps_passed=['test1'], |
- revision=42), |
- key2: gen_job( |
- builder=u'linux', |
- build=12, |
- completed=True, |
- requested_steps=['test1', 'test2'], |
- steps_passed=['test1', 'test2'], |
- revision=22), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- |
- key3 = self._add_build( |
- 'mac', 33, 42, |
- [BuildbotBuildStep('test2', False)], |
- True) |
- self.call_update_status( |
- [1.] * (4 + 1 * VERBOSE), |
- num_status=2, |
- rietveld=[_posted({u"mac": ["test2"]})], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'mac': ['test2']}) |
- expected = gen_jobs( |
- step_verifiers=[ |
- try_job_steps.TryJobSteps( |
- builder_name='linux', |
- steps=['test1', 'test2']), |
- try_job_steps.TryJobSteps( |
- builder_name='mac', |
- steps=['test1', 'test2']), |
- ], |
- pendings=[ |
- gen_job_pending(builder=u'mac', requested_steps=['test2'], tries=3), |
- ], |
- try_jobs={ |
- key1: gen_job( |
- build=32, |
- builder=u'mac', |
- completed=True, |
- requested_steps=['test1', 'test2'], |
- steps_failed=['test2'], |
- steps_passed=['test1'], |
- revision=42), |
- key2: gen_job( |
- builder=u'linux', |
- build=12, |
- completed=True, |
- requested_steps=['test1', 'test2'], |
- revision=22, |
- steps_passed=['test1', 'test2']), |
- key3: gen_job( |
- builder=u'mac', |
- completed=True, |
- build=33, |
- requested_steps=['test2'], |
- revision=42, |
- steps_failed=['test2'], |
- tries=2), |
- }) |
- self.assertEqual(expected, self._get_verif().as_dict()) |
- self.call_update_status( |
- [1.] * (2 + 1 * VERBOSE), |
- num_status=0, |
- rietveld=[], |
- state=base.PROCESSING, |
- err='', |
- need={}, |
- waiting={'mac': ['test2']}) |
- |
- |
-class RietveldTryJobsTest(TryJobOnRietveldBase): |
- # Directly test RietveldTryJobs without constructing a TryRunnerRietveld. |
- # They should never touch self.timestamp. |
- def testInitial(self): |
- now = 1. |
- jobs = try_job_on_rietveld.RietveldTryJobs() |
- jobs.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='builder1', |
- steps=['test10', 'test11']), |
- ] |
- jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
- init_time=now, |
- builder='builder1', |
- build=12, |
- revision=13, |
- requested_steps=['test10'], |
- started=int(now), |
- steps_passed=['test10'], |
- steps_failed=[], |
- clobber=False, |
- completed=True, |
- tries=1, |
- parent_key=None) |
- self.assertEqual({'builder1': ['test11']}, jobs.tests_need_to_be_run(now)) |
- self.assertEqual({'builder1': ['test11']}, jobs.tests_waiting_for_result()) |
- |
- def testPending(self): |
- now = 1. |
- jobs = try_job_on_rietveld.RietveldTryJobs() |
- jobs.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='builder1', |
- steps=['test10', 'test11']), |
- ] |
- jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
- init_time=now, |
- builder='builder1', |
- build=12, |
- revision=13, |
- requested_steps=['test10'], |
- started=int(now), |
- steps_passed=['test10'], |
- steps_failed=[], |
- clobber=False, |
- completed=True, |
- tries=1, |
- parent_key=None) |
- jobs.pendings.append( |
- try_job_on_rietveld.RietveldTryJobPending( |
- init_time=now, |
- builder='builder1', |
- revision=13, |
- requested_steps=['test11'], |
- clobber=False, |
- tries=1)) |
- self.assertEqual({}, jobs.tests_need_to_be_run(now)) |
- self.assertEqual({'builder1': ['test11']}, jobs.tests_waiting_for_result()) |
- |
- def testTriggeredPending(self): |
- # Construct an instance that has both tests to trigger and tests that are |
- # pending results. |
- now = 1. |
- jobs = try_job_on_rietveld.RietveldTryJobs() |
- jobs.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='builder1', |
- steps=['test10', 'test11']), |
- try_job_steps.TryJobSteps( |
- builder_name='builder2', |
- steps=['test20', 'test21']), |
- ] |
- jobs.try_jobs['key1'] = try_job_on_rietveld.RietveldTryJob( |
- init_time=now, |
- builder='builder1', |
- build=12, |
- revision=13, |
- requested_steps=['test10'], |
- started=int(now), |
- steps_passed=['test10'], |
- steps_failed=[], |
- clobber=False, |
- completed=True, |
- tries=1, |
- parent_key=None) |
- jobs.try_jobs['key2'] = try_job_on_rietveld.RietveldTryJob( |
- init_time=now, |
- builder='builder2', |
- build=13, |
- revision=14, |
- requested_steps=[], |
- started=int(now), |
- steps_passed=['test21'], |
- steps_failed=[], |
- clobber=False, |
- completed=False, |
- tries=1, |
- parent_key=None) |
- jobs.pendings.append( |
- try_job_on_rietveld.RietveldTryJobPending( |
- init_time=now, |
- builder='builder2', |
- revision=14, |
- requested_steps=['test20'], |
- clobber=False, |
- tries=1)) |
- # test11 is still not queued to be run but build with test20 in it has still |
- # not started yet. |
- self.assertEqual({'builder1': ['test11']}, jobs.tests_need_to_be_run(now)) |
- self.assertEqual( |
- {'builder1': ['test11'], 'builder2': ['test20']}, |
- jobs.tests_waiting_for_result()) |
- |
- def testAddTriggeredBot(self): |
- jobs = try_job_on_rietveld.RietveldTryJobs() |
- jobs.step_verifiers = [try_job_steps.TryJobTriggeredSteps( |
- builder_name='tester1', |
- trigger_name='builder1', |
- steps={'test3': 'trigger'})] |
- self.assertEqual({'builder1': ['trigger']}, jobs.tests_need_to_be_run(1.)) |
- self.assertEqual({'tester1': ['test3']}, jobs.tests_waiting_for_result()) |
- |
- def testGenerateWatchedBuilders(self): |
- jobs = try_job_on_rietveld.RietveldTryJobs() |
- jobs.step_verifiers = [ |
- try_job_steps.TryJobSteps( |
- builder_name='builder1', |
- steps=['test']), |
- try_job_steps.TryJobTriggeredSteps( |
- builder_name='triggered1', |
- trigger_name='trigger_bot1', |
- steps={'test': 'test'}), |
- try_job_steps.TryJobTriggeredOrNormalSteps( |
- builder_name='triggered2', |
- trigger_name='trigger_bot2', |
- trigger_bot_steps=['test'], |
- steps={'test': 'test'}, |
- use_triggered_bot=False) |
- ] |
- |
- expected_watched_builders = [ |
- 'builder1', |
- 'trigger_bot1', |
- 'trigger_bot2', |
- 'triggered1', |
- 'triggered2' |
- ] |
- self.assertEqual(sorted(expected_watched_builders), |
- sorted(jobs.watched_builders())) |
- |
- |
-if __name__ == '__main__': |
- logging.basicConfig( |
- level=[logging.WARNING, logging.INFO, logging.DEBUG][ |
- min(sys.argv.count('-v'), 2)], |
- format='%(levelname)5s %(module)15s(%(lineno)3d): %(message)s') |
- if '-v' in sys.argv: |
- VERBOSE = True |
- unittest.TestCase.maxDiff = None |
- unittest.main() |