Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Unified Diff: tests/try_server_test.py

Issue 7108020: Add automatic retry mechanism and LKGR support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/commit-queue
Patch Set: Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « projects.py ('k') | thirdparty/README.chromium » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/try_server_test.py
diff --git a/tests/try_server_test.py b/tests/try_server_test.py
index e7e974934328f12a8b3fd1bda7ec2d08098ac9d6..64cd19f18aca55f8aa36edc3aca6bbc96fe06a2b 100755
--- a/tests/try_server_test.py
+++ b/tests/try_server_test.py
@@ -194,6 +194,14 @@ class FakeTryServer(object):
data['results'] = [result]
self._builds[builder].append(data)
+ def step_result(self, builder, name, result):
Dirk Pranke 2011/06/08 22:49:49 maybe rename this to 'set_step_result' if you rena
+ """Sets step result on builder's last build."""
+ for step in self._builds[builder][-1]['steps']:
+ if name == step['name']:
+ step['results'] = result
+ return
+ self.fail()
+
def build_result(self, builder, result):
for step in self._builds[builder][-1]['steps']:
step['results'] = [result]
@@ -206,6 +214,8 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
self.email = 'user1@example.com'
self.user = 'user1'
self.timestamp = [1]
+ # Mocks http://chromium-status.appspot.com/lkgr
+ self.lkgr = 123
self.try_server = FakeTryServer(self)
self.mock(time, 'time', lambda: self.timestamp[-1])
@@ -215,7 +225,8 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
self.email,
('linux', 'mac'),
('test1', 'test2'),
- ['extra_flags',])
+ ['extra_flags',],
+ lambda: self.lkgr)
self.pending = pending_manager.PendingCommit(
42, 'owner@example.com', [], 23, None, 'lame desc', [],
self.try_server.server_url)
@@ -259,12 +270,108 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
def testVoidUpdate(self):
self.try_runner.update_status([])
+ def test_steps_quality(self):
+ self.assertEquals(None, try_server.steps_quality([]))
+ self.assertEquals(True, try_server.steps_quality([True, None]))
+ self.assertEquals(False, try_server.steps_quality([True, None, False]))
+
+ def testStepQualityNone(self):
+ self.try_runner.status.builders['linux'].builds.cache()
+ self.assertEquals(
+ (None, 0),
+ self.try_runner.step_db.revision_quality_builder_steps('linux', 123))
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+
+ def testStepQualityGood(self):
+ self.try_server.add_build(
+ 'linux', 123, None, [SUCCESS, None, None, None])
+ self.try_runner.status.builders['linux'].builds.cache()
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+ self.assertEquals(
+ ([True, None, None, None], 1),
+ self.try_runner.step_db.revision_quality_builder_steps('linux', 123))
+ self.try_server.build_result('linux', SUCCESS)
+ self.try_runner.status.builders['linux'].builds.refresh()
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps('linux', 123))
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+
+ def testStepQualityBad(self):
+ self.try_server.add_build(
+ 'linux', 123, None, [SUCCESS, SUCCESS, FAILURE, SUCCESS])
+ self.try_runner.status.builders['linux'].builds.cache()
+ # Also test that FakeTryServer.add_build() is implemented correctly.
+ self.assertEquals(
+ ([True, True, False, True], 1),
+ self.try_runner.step_db.revision_quality_builder_steps('linux', 123))
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+
+ def testStepQualityBadIncomplete(self):
+ self.try_server.add_build(
+ 'linux', 123, None, [SUCCESS, SUCCESS, FAILURE, None])
+ self.try_runner.status.builders['linux'].builds.cache()
+ # Also test that FakeTryServer.add_build() is implemented correctly.
+ self.assertEquals(
+ ([True, True, False, None], 1),
+ self.try_runner.step_db.revision_quality_builder_steps('linux', 123))
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+
+ def testStepQualityGoodAndBad(self):
+ self.try_server.add_build(
+ 'linux', 123, None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
+ self.try_server.add_build('linux', 123, None, [FAILURE, None, None, None])
+ self.try_runner.status.builders['linux'].builds.cache()
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+ self.assertEquals(
+ ([True] * 4, 2),
+ self.try_runner.step_db.revision_quality_builder_steps('linux', 123))
+
+ def testQualityAutomatic(self):
+ self.try_runner.verify(self.pending, '123')
+ self.assertEquals(
+ (None, 0),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'linux', 123))
+ self.try_server.add_build(
+ 'linux', 123, 'georges tried stuff',
+ [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
+ self.try_runner.update_status([self.pending])
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'linux', 123))
+ self.try_server.check_calls(
+ ['trychange b=linux,mac c=False r=123 t=test1,test2'] +
+ ['builders/?select=linux&select=mac'] +
+ ['builders/linux/builds/_all', 'builders/mac/builds/_all'])
+
+ def testQualityManual(self):
+ self.try_server.add_build(
+ 'linux', 123, 'georges tried stuff',
+ [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
+ self.try_runner.status.builders['linux'].builds.cache()
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'linux', 123))
+ self.try_server.check_calls(['builders/linux/builds/_all'])
+
def _simple(self, status_linux, status_mac=None, error_msg=None):
"""status_linux affects test1, status_mac affects test2."""
def is_failure(status):
return status in (FAILURE, EXCEPTION)
+
+ self.assertEquals(
+ bool(is_failure(status_linux) or is_failure(status_mac)),
+ bool(error_msg))
if status_mac is None:
status_mac = status_linux
+ self.lkgr = 12
+ self.try_server.add_build(
+ 'linux', 123, None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
+ self.try_server.add_build(
+ 'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
self.try_runner.verify(self.pending, '123')
self.try_server.check_calls(
@@ -273,32 +380,50 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
'linux', 123, None, [SUCCESS, SUCCESS, status_linux, SUCCESS])
self.try_server.add_build(
'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, status_mac])
+
self.try_runner.update_status([self.pending])
+ if is_failure(status_linux):
+ self.assertEquals(123, self.try_runner.get_lkgr('linux'))
+ else:
+ self.assertEquals(123, self.try_runner.get_lkgr('linux'))
+ if is_failure(status_mac):
+ self.assertEquals(123, self.try_runner.get_lkgr('mac'))
+ else:
+ self.assertEquals(123, self.try_runner.get_lkgr('mac'))
if error_msg:
+ # Can't test failure without testing automatic retry mechanism.
+ self.assertPending(base.PROCESSING, 2, None)
+ expected = (
+ ['builders/?select=linux&select=mac'] +
+ ['builders/linux/builds/_all', 'builders/mac/builds/_all'])
+ if is_failure(status_linux):
+ expected.append('trychange b=linux c=False r=123 t=test1')
+ if is_failure(status_mac):
+ expected.append('trychange b=mac c=False r=123 t=test2')
+ self.try_server.check_calls(expected)
+ self.try_server.add_build(
+ 'linux', 123, None, [SUCCESS, SUCCESS, status_linux, SUCCESS])
+ self.try_server.add_build(
+ 'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, status_mac])
+
+ self.try_runner.update_status([self.pending])
self.assertPending(base.FAILED, 2, error_msg)
+ if is_failure(status_linux) and is_failure(status_mac):
+ self.try_server.check_calls(
+ ['builders/?select=linux&select=mac'] +
+ ['builders/linux/builds/_all', 'builders/mac/builds/_all'])
+ elif is_failure(status_linux):
+ self.try_server.check_calls(
+ ['builders/?select=linux', 'builders/linux/builds/_all'])
+ else:
+ self.try_server.check_calls(
+ ['builders/?select=mac', 'builders/mac/builds/_all'])
else:
self.assertPending(base.SUCCEEDED, 2, None)
-
- # Verify good_revisions() and bad_revisions()
- if is_failure(status_linux) and is_failure(status_mac):
- self.assertEquals([], list(self.try_runner.step_db.good_revisions()))
- self.assertEquals([123], list(self.try_runner.step_db.bad_revisions()))
- else:
- # It passed on at least one builder.
- self.assertEquals([123], list(self.try_runner.step_db.good_revisions()))
- self.assertEquals([], list(self.try_runner.step_db.bad_revisions()))
-
- # Verify revision_quality_builder.
- self.assertEquals(
- not is_failure(status_linux),
- self.try_runner.step_db.revision_quality_builder('linux', 123))
- self.assertEquals(
- not is_failure(status_mac),
- self.try_runner.step_db.revision_quality_builder('mac', 123))
- self.try_server.check_calls(
- ['builders/?select=linux&select=mac'] +
- ['builders/linux/builds/_all', 'builders/mac/builds/_all'])
+ self.try_server.check_calls(
+ ['builders/?select=linux&select=mac'] +
+ ['builders/linux/builds/_all', 'builders/mac/builds/_all'])
def testImmediateSuccess(self):
self._simple(SUCCESS)
@@ -325,31 +450,29 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
def testImmediateSkipped(self):
self._simple(SKIPPED)
- def testImmediateFailureLinux(self):
- self._simple(
- FAILURE, SUCCESS,
- 'Try job failure for 42-23 on linux for step test1:\n'
- '%s/buildstatus?builder=linux&number=0' % self.try_server.server_url)
-
- def testImmediateFailureMac(self):
+ def testImmediateFailure(self):
self._simple(
SUCCESS, FAILURE,
- 'Try job failure for 42-23 on mac for step test2:\n'
- '%s/buildstatus?builder=mac&number=0' % self.try_server.server_url)
+ ('Try job failure for 42-23 on mac for step "test2".\n'
+ 'It\'s a second try, previously, step "test2" failed.\n'
+ '%s/buildstatus?builder=mac&number=2') % self.try_server.server_url)
def testImmediateDoubleFailure(self):
self._simple(
FAILURE, FAILURE,
- 'Try job failure for 42-23 on mac for step test2:\n'
- '%s/buildstatus?builder=mac&number=0' % self.try_server.server_url)
+ 'Try job failure for 42-23 on mac for step "test2".\n'
+ 'It\'s a second try, previously, step "test2" failed.\n'
+ '%s/buildstatus?builder=mac&number=2' % self.try_server.server_url)
def testImmediateException(self):
self._simple(
SUCCESS, EXCEPTION,
- 'Try job failure for 42-23 on mac for step test2:\n'
- '%s/buildstatus?builder=mac&number=0' % self.try_server.server_url)
+ ('Try job failure for 42-23 on mac for step "test2".\n'
+ 'It\'s a second try, previously, step "test2" failed.\n'
+ '%s/buildstatus?builder=mac&number=2') % self.try_server.server_url)
def testSuccess(self):
+ self.lkgr = 2
# Normal workflow with incremental success.
self.try_runner.verify(self.pending, '123')
self.try_server.check_calls(
@@ -387,8 +510,14 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
self.try_server.build_result('linux', SUCCESS)
self.try_runner.update_status([self.pending])
self.assertPending(base.SUCCEEDED, 2, None)
- self.assertEquals([123], list(self.try_runner.step_db.good_revisions()))
- self.assertEquals([], list(self.try_runner.step_db.bad_revisions()))
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'linux', 123))
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'mac', 123))
self.try_server.check_calls(['builders/linux/builds/?select=0'])
def testIgnorePreviousJobs(self):
@@ -413,8 +542,14 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
self.try_server.add_build('mac', 123, None, [SUCCESS] * 4)
self.try_runner.update_status([self.pending])
self.assertPending(base.SUCCEEDED, 2, None)
- self.assertEquals([12, 123], list(self.try_runner.step_db.good_revisions()))
- self.assertEquals([], list(self.try_runner.step_db.bad_revisions()))
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'linux', 123))
+ self.assertEquals(
+ ([True] * 4, 1),
+ self.try_runner.step_db.revision_quality_builder_steps(
+ 'mac', 123))
self.try_server.check_calls(
['builders/?select=linux&select=mac',
'builders/linux/builds/_all', 'builders/mac/builds/_all'])
@@ -525,24 +660,34 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
self.try_runner.update_status([self.pending])
- def testFailedSteps(self):
- # Verifies failed steps are listed correctly. It will be necessary for bad
- # revision and flaky test detections.
+ def testFailedStepRetryLkgr(self):
self.try_runner.verify(self.pending, '123')
self.try_server.check_calls(
['trychange b=linux,mac c=False r=123 t=test1,test2'])
self.try_server.add_build(
- 'linux', 123, None, [SUCCESS, FAILURE, SUCCESS, FAILURE])
+ 'linux', 123, None, [SUCCESS, SUCCESS, FAILURE, SUCCESS])
+
+ self.lkgr = 122
self.try_runner.update_status([self.pending])
self.try_server.check_calls(
['builders/?select=linux&select=mac'] +
- ['builders/linux/builds/_all', 'builders/mac/builds/_all'])
- self.assertEquals(
- ['compile', 'test2'],
- self.get_verif().try_jobs[0].failed_steps)
+ ['builders/linux/builds/_all', 'builders/mac/builds/_all'] +
+ # Only the failed test is retried, on lkgr revision.
+ ['trychange b=linux c=False r=122 t=test1'])
+ self.assertEquals(['test1'], self.get_verif().try_jobs[0].failed_steps)
def testFailedUpdate(self):
# It must not retry a failed update.
+
+ # Add succeededing builds, this sets quality to True, which disable retry
+ # mechanism.
+ self.try_server.add_build(
+ 'linux', 123, 'georges tried stuff',
+ [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
+ self.try_server.add_build(
+ 'mac', 123, 'georges tried stuff', [SUCCESS, SUCCESS, SUCCESS, SUCCESS])
+ self.lkgr = 123
+
self.try_runner.verify(self.pending, '123')
self.try_server.check_calls(
['trychange b=linux,mac c=False r=123 t=test1,test2'])
@@ -552,11 +697,15 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
self.try_server.check_calls(
['builders/?select=linux&select=mac'] +
['builders/linux/builds/_all', 'builders/mac/builds/_all'])
+ self.assertEquals('linux', self.get_verif().try_jobs[0].builder)
self.assertEquals(['update'], self.get_verif().try_jobs[0].failed_steps)
self.assertPending(
base.FAILED, 2,
- u'Try job failure for 42-23 on linux for step update:\n'
- u'%s/buildstatus?builder=linux&number=0' % self.try_server.server_url)
+ (u'Try job failure for 42-23 on linux for step '
+ u'"update".\n%s/buildstatus?builder=linux&number=1\n\n'
+ u'Step "update" is always a major failure.\n'
+ u'Look at the try server FAQ for more details.') %
+ self.try_server.server_url)
def testFailedCompileRetryClobber(self):
# It must retry once a non-clobber compile.
@@ -565,23 +714,25 @@ class TryServerTest(TestCase, auto_stub.AutoStubMixIn):
['trychange b=linux,mac c=False r=123 t=test1,test2'])
self.try_server.add_build(
'linux', 123, None, [SUCCESS, FAILURE, None, None])
+ self.lkgr = 122
self.try_runner.update_status([self.pending])
self.try_server.check_calls(
['builders/?select=linux&select=mac'] +
['builders/linux/builds/_all', 'builders/mac/builds/_all'] +
- ['trychange b=linux c=True r=123 t=test1,test2'])
+ ['trychange b=linux c=True r=122 t=test1,test2'])
self.assertEquals(['compile'], self.get_verif().try_jobs[0].failed_steps)
self.assertPending(base.PROCESSING, 2, None)
self.try_server.add_build(
- 'linux', 123, None, [SUCCESS, FAILURE, FAILURE, None])
+ 'linux', 122, None, [SUCCESS, FAILURE, None, None])
self.try_runner.update_status([self.pending])
self.try_server.check_calls(
['builders/?select=linux&select=mac'] +
['builders/linux/builds/_all', 'builders/mac/builds/_all'])
self.assertPending(
base.FAILED, 2,
- u'Try job failure for 42-23 on linux for steps compile, test1:\n'
+ u'Try job failure for 42-23 on linux for step "compile" (clobber build)'
+ u'.\nIt\'s a second try, previously, step "compile" failed.\n'
u'%s/buildstatus?builder=linux&number=1' % self.try_server.server_url)
« no previous file with comments | « projects.py ('k') | thirdparty/README.chromium » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698