OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Unit tests for verification/try_server.py.""" | 6 """Unit tests for verification/try_server.py.""" |
7 | 7 |
8 import logging | 8 import logging |
9 import optparse | 9 import optparse |
10 import os | 10 import os |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
187 values[-1] is None): | 187 values[-1] is None): |
188 result = None | 188 result = None |
189 for i, step in enumerate(self._steps): | 189 for i, step in enumerate(self._steps): |
190 data['steps'].append({ | 190 data['steps'].append({ |
191 'name': step, | 191 'name': step, |
192 'results':[values[i]] | 192 'results':[values[i]] |
193 }) | 193 }) |
194 data['results'] = [result] | 194 data['results'] = [result] |
195 self._builds[builder].append(data) | 195 self._builds[builder].append(data) |
196 | 196 |
197 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
| |
198 """Sets step result on builder's last build.""" | |
199 for step in self._builds[builder][-1]['steps']: | |
200 if name == step['name']: | |
201 step['results'] = result | |
202 return | |
203 self.fail() | |
204 | |
197 def build_result(self, builder, result): | 205 def build_result(self, builder, result): |
198 for step in self._builds[builder][-1]['steps']: | 206 for step in self._builds[builder][-1]['steps']: |
199 step['results'] = [result] | 207 step['results'] = [result] |
200 self._builds[builder][-1]['results'] = [result] | 208 self._builds[builder][-1]['results'] = [result] |
201 | 209 |
202 | 210 |
203 class TryServerTest(TestCase, auto_stub.AutoStubMixIn): | 211 class TryServerTest(TestCase, auto_stub.AutoStubMixIn): |
204 def setUp(self): | 212 def setUp(self): |
205 super(TryServerTest, self).setUp() | 213 super(TryServerTest, self).setUp() |
206 self.email = 'user1@example.com' | 214 self.email = 'user1@example.com' |
207 self.user = 'user1' | 215 self.user = 'user1' |
208 self.timestamp = [1] | 216 self.timestamp = [1] |
217 # Mocks http://chromium-status.appspot.com/lkgr | |
218 self.lkgr = 123 | |
209 self.try_server = FakeTryServer(self) | 219 self.try_server = FakeTryServer(self) |
210 self.mock(time, 'time', lambda: self.timestamp[-1]) | 220 self.mock(time, 'time', lambda: self.timestamp[-1]) |
211 | 221 |
212 try_server.TryRunner.update_latency = 0 | 222 try_server.TryRunner.update_latency = 0 |
213 self.try_runner = try_server.TryRunner( | 223 self.try_runner = try_server.TryRunner( |
214 self.try_server.server_url, | 224 self.try_server.server_url, |
215 self.email, | 225 self.email, |
216 ('linux', 'mac'), | 226 ('linux', 'mac'), |
217 ('test1', 'test2'), | 227 ('test1', 'test2'), |
218 ['extra_flags',]) | 228 ['extra_flags',], |
229 lambda: self.lkgr) | |
219 self.pending = pending_manager.PendingCommit( | 230 self.pending = pending_manager.PendingCommit( |
220 42, 'owner@example.com', [], 23, None, 'lame desc', [], | 231 42, 'owner@example.com', [], 23, None, 'lame desc', [], |
221 self.try_server.server_url) | 232 self.try_server.server_url) |
222 | 233 |
223 def tearDown(self): | 234 def tearDown(self): |
224 if hasattr(self, '_exc_info'): | 235 if hasattr(self, '_exc_info'): |
225 # Only present in python <= 2.6 | 236 # Only present in python <= 2.6 |
226 # pylint: disable=E1101 | 237 # pylint: disable=E1101 |
227 failed = self._exc_info()[0] | 238 failed = self._exc_info()[0] |
228 else: | 239 else: |
(...skipping 23 matching lines...) Expand all Loading... | |
252 | 263 |
253 def testVerificationVoid(self): | 264 def testVerificationVoid(self): |
254 self.try_runner.verify(self.pending, '123') | 265 self.try_runner.verify(self.pending, '123') |
255 self.assertPending(base.PROCESSING, 2, None) | 266 self.assertPending(base.PROCESSING, 2, None) |
256 self.try_server.check_calls( | 267 self.try_server.check_calls( |
257 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 268 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
258 | 269 |
259 def testVoidUpdate(self): | 270 def testVoidUpdate(self): |
260 self.try_runner.update_status([]) | 271 self.try_runner.update_status([]) |
261 | 272 |
273 def test_steps_quality(self): | |
274 self.assertEquals(None, try_server.steps_quality([])) | |
275 self.assertEquals(True, try_server.steps_quality([True, None])) | |
276 self.assertEquals(False, try_server.steps_quality([True, None, False])) | |
277 | |
278 def testStepQualityNone(self): | |
279 self.try_runner.status.builders['linux'].builds.cache() | |
280 self.assertEquals( | |
281 (None, 0), | |
282 self.try_runner.step_db.revision_quality_builder_steps('linux', 123)) | |
283 self.try_server.check_calls(['builders/linux/builds/_all']) | |
284 | |
285 def testStepQualityGood(self): | |
286 self.try_server.add_build( | |
287 'linux', 123, None, [SUCCESS, None, None, None]) | |
288 self.try_runner.status.builders['linux'].builds.cache() | |
289 self.try_server.check_calls(['builders/linux/builds/_all']) | |
290 self.assertEquals( | |
291 ([True, None, None, None], 1), | |
292 self.try_runner.step_db.revision_quality_builder_steps('linux', 123)) | |
293 self.try_server.build_result('linux', SUCCESS) | |
294 self.try_runner.status.builders['linux'].builds.refresh() | |
295 self.assertEquals( | |
296 ([True] * 4, 1), | |
297 self.try_runner.step_db.revision_quality_builder_steps('linux', 123)) | |
298 self.try_server.check_calls(['builders/linux/builds/_all']) | |
299 | |
300 def testStepQualityBad(self): | |
301 self.try_server.add_build( | |
302 'linux', 123, None, [SUCCESS, SUCCESS, FAILURE, SUCCESS]) | |
303 self.try_runner.status.builders['linux'].builds.cache() | |
304 # Also test that FakeTryServer.add_build() is implemented correctly. | |
305 self.assertEquals( | |
306 ([True, True, False, True], 1), | |
307 self.try_runner.step_db.revision_quality_builder_steps('linux', 123)) | |
308 self.try_server.check_calls(['builders/linux/builds/_all']) | |
309 | |
310 def testStepQualityBadIncomplete(self): | |
311 self.try_server.add_build( | |
312 'linux', 123, None, [SUCCESS, SUCCESS, FAILURE, None]) | |
313 self.try_runner.status.builders['linux'].builds.cache() | |
314 # Also test that FakeTryServer.add_build() is implemented correctly. | |
315 self.assertEquals( | |
316 ([True, True, False, None], 1), | |
317 self.try_runner.step_db.revision_quality_builder_steps('linux', 123)) | |
318 self.try_server.check_calls(['builders/linux/builds/_all']) | |
319 | |
320 def testStepQualityGoodAndBad(self): | |
321 self.try_server.add_build( | |
322 'linux', 123, None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
323 self.try_server.add_build('linux', 123, None, [FAILURE, None, None, None]) | |
324 self.try_runner.status.builders['linux'].builds.cache() | |
325 self.try_server.check_calls(['builders/linux/builds/_all']) | |
326 self.assertEquals( | |
327 ([True] * 4, 2), | |
328 self.try_runner.step_db.revision_quality_builder_steps('linux', 123)) | |
329 | |
330 def testQualityAutomatic(self): | |
331 self.try_runner.verify(self.pending, '123') | |
332 self.assertEquals( | |
333 (None, 0), | |
334 self.try_runner.step_db.revision_quality_builder_steps( | |
335 'linux', 123)) | |
336 self.try_server.add_build( | |
337 'linux', 123, 'georges tried stuff', | |
338 [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
339 self.try_runner.update_status([self.pending]) | |
340 self.assertEquals( | |
341 ([True] * 4, 1), | |
342 self.try_runner.step_db.revision_quality_builder_steps( | |
343 'linux', 123)) | |
344 self.try_server.check_calls( | |
345 ['trychange b=linux,mac c=False r=123 t=test1,test2'] + | |
346 ['builders/?select=linux&select=mac'] + | |
347 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | |
348 | |
349 def testQualityManual(self): | |
350 self.try_server.add_build( | |
351 'linux', 123, 'georges tried stuff', | |
352 [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
353 self.try_runner.status.builders['linux'].builds.cache() | |
354 self.assertEquals( | |
355 ([True] * 4, 1), | |
356 self.try_runner.step_db.revision_quality_builder_steps( | |
357 'linux', 123)) | |
358 self.try_server.check_calls(['builders/linux/builds/_all']) | |
359 | |
262 def _simple(self, status_linux, status_mac=None, error_msg=None): | 360 def _simple(self, status_linux, status_mac=None, error_msg=None): |
263 """status_linux affects test1, status_mac affects test2.""" | 361 """status_linux affects test1, status_mac affects test2.""" |
264 def is_failure(status): | 362 def is_failure(status): |
265 return status in (FAILURE, EXCEPTION) | 363 return status in (FAILURE, EXCEPTION) |
364 | |
365 self.assertEquals( | |
366 bool(is_failure(status_linux) or is_failure(status_mac)), | |
367 bool(error_msg)) | |
266 if status_mac is None: | 368 if status_mac is None: |
267 status_mac = status_linux | 369 status_mac = status_linux |
370 self.lkgr = 12 | |
371 self.try_server.add_build( | |
372 'linux', 123, None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
373 self.try_server.add_build( | |
374 'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
268 | 375 |
269 self.try_runner.verify(self.pending, '123') | 376 self.try_runner.verify(self.pending, '123') |
270 self.try_server.check_calls( | 377 self.try_server.check_calls( |
271 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 378 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
272 self.try_server.add_build( | 379 self.try_server.add_build( |
273 'linux', 123, None, [SUCCESS, SUCCESS, status_linux, SUCCESS]) | 380 'linux', 123, None, [SUCCESS, SUCCESS, status_linux, SUCCESS]) |
274 self.try_server.add_build( | 381 self.try_server.add_build( |
275 'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, status_mac]) | 382 'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, status_mac]) |
383 | |
276 self.try_runner.update_status([self.pending]) | 384 self.try_runner.update_status([self.pending]) |
385 if is_failure(status_linux): | |
386 self.assertEquals(123, self.try_runner.get_lkgr('linux')) | |
387 else: | |
388 self.assertEquals(123, self.try_runner.get_lkgr('linux')) | |
389 if is_failure(status_mac): | |
390 self.assertEquals(123, self.try_runner.get_lkgr('mac')) | |
391 else: | |
392 self.assertEquals(123, self.try_runner.get_lkgr('mac')) | |
277 | 393 |
278 if error_msg: | 394 if error_msg: |
395 # Can't test failure without testing automatic retry mechanism. | |
396 self.assertPending(base.PROCESSING, 2, None) | |
397 expected = ( | |
398 ['builders/?select=linux&select=mac'] + | |
399 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | |
400 if is_failure(status_linux): | |
401 expected.append('trychange b=linux c=False r=123 t=test1') | |
402 if is_failure(status_mac): | |
403 expected.append('trychange b=mac c=False r=123 t=test2') | |
404 self.try_server.check_calls(expected) | |
405 self.try_server.add_build( | |
406 'linux', 123, None, [SUCCESS, SUCCESS, status_linux, SUCCESS]) | |
407 self.try_server.add_build( | |
408 'mac', 123, None, [SUCCESS, SUCCESS, SUCCESS, status_mac]) | |
409 | |
410 self.try_runner.update_status([self.pending]) | |
279 self.assertPending(base.FAILED, 2, error_msg) | 411 self.assertPending(base.FAILED, 2, error_msg) |
412 if is_failure(status_linux) and is_failure(status_mac): | |
413 self.try_server.check_calls( | |
414 ['builders/?select=linux&select=mac'] + | |
415 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | |
416 elif is_failure(status_linux): | |
417 self.try_server.check_calls( | |
418 ['builders/?select=linux', 'builders/linux/builds/_all']) | |
419 else: | |
420 self.try_server.check_calls( | |
421 ['builders/?select=mac', 'builders/mac/builds/_all']) | |
280 else: | 422 else: |
281 self.assertPending(base.SUCCEEDED, 2, None) | 423 self.assertPending(base.SUCCEEDED, 2, None) |
282 | 424 self.try_server.check_calls( |
283 # Verify good_revisions() and bad_revisions() | 425 ['builders/?select=linux&select=mac'] + |
284 if is_failure(status_linux) and is_failure(status_mac): | 426 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) |
285 self.assertEquals([], list(self.try_runner.step_db.good_revisions())) | |
286 self.assertEquals([123], list(self.try_runner.step_db.bad_revisions())) | |
287 else: | |
288 # It passed on at least one builder. | |
289 self.assertEquals([123], list(self.try_runner.step_db.good_revisions())) | |
290 self.assertEquals([], list(self.try_runner.step_db.bad_revisions())) | |
291 | |
292 # Verify revision_quality_builder. | |
293 self.assertEquals( | |
294 not is_failure(status_linux), | |
295 self.try_runner.step_db.revision_quality_builder('linux', 123)) | |
296 self.assertEquals( | |
297 not is_failure(status_mac), | |
298 self.try_runner.step_db.revision_quality_builder('mac', 123)) | |
299 self.try_server.check_calls( | |
300 ['builders/?select=linux&select=mac'] + | |
301 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | |
302 | 427 |
303 def testImmediateSuccess(self): | 428 def testImmediateSuccess(self): |
304 self._simple(SUCCESS) | 429 self._simple(SUCCESS) |
305 | 430 |
306 def testImmediateSuccessStr(self): | 431 def testImmediateSuccessStr(self): |
307 # Test with a int/str instead of str/int. | 432 # Test with a int/str instead of str/int. |
308 self.try_runner.verify(self.pending, 123) | 433 self.try_runner.verify(self.pending, 123) |
309 self.try_server.check_calls( | 434 self.try_server.check_calls( |
310 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 435 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
311 | 436 |
312 self.try_server.add_build( | 437 self.try_server.add_build( |
313 'linux', '123', None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | 438 'linux', '123', None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) |
314 self.try_server.add_build( | 439 self.try_server.add_build( |
315 'mac', '123', None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | 440 'mac', '123', None, [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) |
316 self.try_runner.update_status([self.pending]) | 441 self.try_runner.update_status([self.pending]) |
317 self.assertPending(base.SUCCEEDED, 2, None) | 442 self.assertPending(base.SUCCEEDED, 2, None) |
318 self.try_server.check_calls( | 443 self.try_server.check_calls( |
319 ['builders/?select=linux&select=mac'] + | 444 ['builders/?select=linux&select=mac'] + |
320 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | 445 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) |
321 | 446 |
322 def testImmediateWarnings(self): | 447 def testImmediateWarnings(self): |
323 self._simple(WARNINGS) | 448 self._simple(WARNINGS) |
324 | 449 |
325 def testImmediateSkipped(self): | 450 def testImmediateSkipped(self): |
326 self._simple(SKIPPED) | 451 self._simple(SKIPPED) |
327 | 452 |
328 def testImmediateFailureLinux(self): | 453 def testImmediateFailure(self): |
329 self._simple( | |
330 FAILURE, SUCCESS, | |
331 'Try job failure for 42-23 on linux for step test1:\n' | |
332 '%s/buildstatus?builder=linux&number=0' % self.try_server.server_url) | |
333 | |
334 def testImmediateFailureMac(self): | |
335 self._simple( | 454 self._simple( |
336 SUCCESS, FAILURE, | 455 SUCCESS, FAILURE, |
337 'Try job failure for 42-23 on mac for step test2:\n' | 456 ('Try job failure for 42-23 on mac for step "test2".\n' |
338 '%s/buildstatus?builder=mac&number=0' % self.try_server.server_url) | 457 'It\'s a second try, previously, step "test2" failed.\n' |
458 '%s/buildstatus?builder=mac&number=2') % self.try_server.server_url) | |
339 | 459 |
340 def testImmediateDoubleFailure(self): | 460 def testImmediateDoubleFailure(self): |
341 self._simple( | 461 self._simple( |
342 FAILURE, FAILURE, | 462 FAILURE, FAILURE, |
343 'Try job failure for 42-23 on mac for step test2:\n' | 463 'Try job failure for 42-23 on mac for step "test2".\n' |
344 '%s/buildstatus?builder=mac&number=0' % self.try_server.server_url) | 464 'It\'s a second try, previously, step "test2" failed.\n' |
465 '%s/buildstatus?builder=mac&number=2' % self.try_server.server_url) | |
345 | 466 |
346 def testImmediateException(self): | 467 def testImmediateException(self): |
347 self._simple( | 468 self._simple( |
348 SUCCESS, EXCEPTION, | 469 SUCCESS, EXCEPTION, |
349 'Try job failure for 42-23 on mac for step test2:\n' | 470 ('Try job failure for 42-23 on mac for step "test2".\n' |
350 '%s/buildstatus?builder=mac&number=0' % self.try_server.server_url) | 471 'It\'s a second try, previously, step "test2" failed.\n' |
472 '%s/buildstatus?builder=mac&number=2') % self.try_server.server_url) | |
351 | 473 |
352 def testSuccess(self): | 474 def testSuccess(self): |
475 self.lkgr = 2 | |
353 # Normal workflow with incremental success. | 476 # Normal workflow with incremental success. |
354 self.try_runner.verify(self.pending, '123') | 477 self.try_runner.verify(self.pending, '123') |
355 self.try_server.check_calls( | 478 self.try_server.check_calls( |
356 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 479 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
357 | 480 |
358 self.try_runner.update_status([self.pending]) | 481 self.try_runner.update_status([self.pending]) |
359 self.assertPending(base.PROCESSING, 2, None) | 482 self.assertPending(base.PROCESSING, 2, None) |
360 self.try_server.check_calls( | 483 self.try_server.check_calls( |
361 ['builders/?select=linux&select=mac', | 484 ['builders/?select=linux&select=mac', |
362 'builders/linux/builds/_all', 'builders/mac/builds/_all']) | 485 'builders/linux/builds/_all', 'builders/mac/builds/_all']) |
(...skipping 17 matching lines...) Expand all Loading... | |
380 # This one will be cached since it's now immutable. | 503 # This one will be cached since it's now immutable. |
381 self.try_server.build_result('mac', SUCCESS) | 504 self.try_server.build_result('mac', SUCCESS) |
382 self.try_runner.update_status([self.pending]) | 505 self.try_runner.update_status([self.pending]) |
383 self.assertPending(base.PROCESSING, 2, None) | 506 self.assertPending(base.PROCESSING, 2, None) |
384 self.try_server.check_calls( | 507 self.try_server.check_calls( |
385 ['builders/linux/builds/?select=0', 'builders/mac/builds/?select=0']) | 508 ['builders/linux/builds/?select=0', 'builders/mac/builds/?select=0']) |
386 | 509 |
387 self.try_server.build_result('linux', SUCCESS) | 510 self.try_server.build_result('linux', SUCCESS) |
388 self.try_runner.update_status([self.pending]) | 511 self.try_runner.update_status([self.pending]) |
389 self.assertPending(base.SUCCEEDED, 2, None) | 512 self.assertPending(base.SUCCEEDED, 2, None) |
390 self.assertEquals([123], list(self.try_runner.step_db.good_revisions())) | 513 self.assertEquals( |
391 self.assertEquals([], list(self.try_runner.step_db.bad_revisions())) | 514 ([True] * 4, 1), |
515 self.try_runner.step_db.revision_quality_builder_steps( | |
516 'linux', 123)) | |
517 self.assertEquals( | |
518 ([True] * 4, 1), | |
519 self.try_runner.step_db.revision_quality_builder_steps( | |
520 'mac', 123)) | |
392 self.try_server.check_calls(['builders/linux/builds/?select=0']) | 521 self.try_server.check_calls(['builders/linux/builds/?select=0']) |
393 | 522 |
394 def testIgnorePreviousJobs(self): | 523 def testIgnorePreviousJobs(self): |
395 self.try_runner.verify(self.pending, '123') | 524 self.try_runner.verify(self.pending, '123') |
396 self.try_server.check_calls( | 525 self.try_server.check_calls( |
397 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 526 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
398 | 527 |
399 self.try_runner.update_status([self.pending]) | 528 self.try_runner.update_status([self.pending]) |
400 self.try_server.check_calls( | 529 self.try_server.check_calls( |
401 ['builders/?select=linux&select=mac'] + | 530 ['builders/?select=linux&select=mac'] + |
402 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | 531 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) |
403 | 532 |
404 self.try_server.add_build('linux', 12, None, [None] * 4) | 533 self.try_server.add_build('linux', 12, None, [None] * 4) |
405 self.try_server.add_build('mac', 12, None, [None] * 4) | 534 self.try_server.add_build('mac', 12, None, [None] * 4) |
406 self.try_runner.update_status([self.pending]) | 535 self.try_runner.update_status([self.pending]) |
407 self.assertPending(base.PROCESSING, 2, None) | 536 self.assertPending(base.PROCESSING, 2, None) |
408 self.try_server.check_calls( | 537 self.try_server.check_calls( |
409 ['builders/?select=linux&select=mac', | 538 ['builders/?select=linux&select=mac', |
410 'builders/linux/builds/_all', 'builders/mac/builds/_all']) | 539 'builders/linux/builds/_all', 'builders/mac/builds/_all']) |
411 | 540 |
412 self.try_server.add_build('linux', 123, None, [SUCCESS] * 4) | 541 self.try_server.add_build('linux', 123, None, [SUCCESS] * 4) |
413 self.try_server.add_build('mac', 123, None, [SUCCESS] * 4) | 542 self.try_server.add_build('mac', 123, None, [SUCCESS] * 4) |
414 self.try_runner.update_status([self.pending]) | 543 self.try_runner.update_status([self.pending]) |
415 self.assertPending(base.SUCCEEDED, 2, None) | 544 self.assertPending(base.SUCCEEDED, 2, None) |
416 self.assertEquals([12, 123], list(self.try_runner.step_db.good_revisions())) | 545 self.assertEquals( |
417 self.assertEquals([], list(self.try_runner.step_db.bad_revisions())) | 546 ([True] * 4, 1), |
547 self.try_runner.step_db.revision_quality_builder_steps( | |
548 'linux', 123)) | |
549 self.assertEquals( | |
550 ([True] * 4, 1), | |
551 self.try_runner.step_db.revision_quality_builder_steps( | |
552 'mac', 123)) | |
418 self.try_server.check_calls( | 553 self.try_server.check_calls( |
419 ['builders/?select=linux&select=mac', | 554 ['builders/?select=linux&select=mac', |
420 'builders/linux/builds/_all', 'builders/mac/builds/_all']) | 555 'builders/linux/builds/_all', 'builders/mac/builds/_all']) |
421 | 556 |
422 def testNames(self): | 557 def testNames(self): |
423 self.assertEquals('user1: 42-23', self.try_runner._job_name(self.pending)) | 558 self.assertEquals('user1: 42-23', self.try_runner._job_name(self.pending)) |
424 self.assertEquals( | 559 self.assertEquals( |
425 '\'user1: 42-23\' try job', self.try_runner._job_reason(self.pending)) | 560 '\'user1: 42-23\' try job', self.try_runner._job_reason(self.pending)) |
426 | 561 |
427 def testLostJob(self): | 562 def testLostJob(self): |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
518 self.assertEquals('123', actual[1].revision) | 653 self.assertEquals('123', actual[1].revision) |
519 self.assertEquals(0, actual[1].build) | 654 self.assertEquals(0, actual[1].build) |
520 self.assertEquals('mac', actual[1].builder) | 655 self.assertEquals('mac', actual[1].builder) |
521 self.assertEquals(base.SUCCEEDED, actual[1].result) | 656 self.assertEquals(base.SUCCEEDED, actual[1].result) |
522 self.assertEquals(self.timestamp[1], actual[1].sent) | 657 self.assertEquals(self.timestamp[1], actual[1].sent) |
523 self.try_server.check_calls( | 658 self.try_server.check_calls( |
524 ['builders/?select=mac', 'builders/mac/builds/_all']) | 659 ['builders/?select=mac', 'builders/mac/builds/_all']) |
525 | 660 |
526 self.try_runner.update_status([self.pending]) | 661 self.try_runner.update_status([self.pending]) |
527 | 662 |
528 def testFailedSteps(self): | 663 def testFailedStepRetryLkgr(self): |
529 # Verifies failed steps are listed correctly. It will be necessary for bad | |
530 # revision and flaky test detections. | |
531 self.try_runner.verify(self.pending, '123') | 664 self.try_runner.verify(self.pending, '123') |
532 self.try_server.check_calls( | 665 self.try_server.check_calls( |
533 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 666 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
534 self.try_server.add_build( | 667 self.try_server.add_build( |
535 'linux', 123, None, [SUCCESS, FAILURE, SUCCESS, FAILURE]) | 668 'linux', 123, None, [SUCCESS, SUCCESS, FAILURE, SUCCESS]) |
669 | |
670 self.lkgr = 122 | |
536 self.try_runner.update_status([self.pending]) | 671 self.try_runner.update_status([self.pending]) |
537 self.try_server.check_calls( | 672 self.try_server.check_calls( |
538 ['builders/?select=linux&select=mac'] + | 673 ['builders/?select=linux&select=mac'] + |
539 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | 674 ['builders/linux/builds/_all', 'builders/mac/builds/_all'] + |
540 self.assertEquals( | 675 # Only the failed test is retried, on lkgr revision. |
541 ['compile', 'test2'], | 676 ['trychange b=linux c=False r=122 t=test1']) |
542 self.get_verif().try_jobs[0].failed_steps) | 677 self.assertEquals(['test1'], self.get_verif().try_jobs[0].failed_steps) |
543 | 678 |
544 def testFailedUpdate(self): | 679 def testFailedUpdate(self): |
545 # It must not retry a failed update. | 680 # It must not retry a failed update. |
681 | |
682 # Add succeededing builds, this sets quality to True, which disable retry | |
683 # mechanism. | |
684 self.try_server.add_build( | |
685 'linux', 123, 'georges tried stuff', | |
686 [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
687 self.try_server.add_build( | |
688 'mac', 123, 'georges tried stuff', [SUCCESS, SUCCESS, SUCCESS, SUCCESS]) | |
689 self.lkgr = 123 | |
690 | |
546 self.try_runner.verify(self.pending, '123') | 691 self.try_runner.verify(self.pending, '123') |
547 self.try_server.check_calls( | 692 self.try_server.check_calls( |
548 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 693 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
549 self.try_server.add_build( | 694 self.try_server.add_build( |
550 'linux', 123, None, [FAILURE, None, None, None]) | 695 'linux', 123, None, [FAILURE, None, None, None]) |
551 self.try_runner.update_status([self.pending]) | 696 self.try_runner.update_status([self.pending]) |
552 self.try_server.check_calls( | 697 self.try_server.check_calls( |
553 ['builders/?select=linux&select=mac'] + | 698 ['builders/?select=linux&select=mac'] + |
554 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | 699 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) |
700 self.assertEquals('linux', self.get_verif().try_jobs[0].builder) | |
555 self.assertEquals(['update'], self.get_verif().try_jobs[0].failed_steps) | 701 self.assertEquals(['update'], self.get_verif().try_jobs[0].failed_steps) |
556 self.assertPending( | 702 self.assertPending( |
557 base.FAILED, 2, | 703 base.FAILED, 2, |
558 u'Try job failure for 42-23 on linux for step update:\n' | 704 (u'Try job failure for 42-23 on linux for step ' |
559 u'%s/buildstatus?builder=linux&number=0' % self.try_server.server_url) | 705 u'"update".\n%s/buildstatus?builder=linux&number=1\n\n' |
706 u'Step "update" is always a major failure.\n' | |
707 u'Look at the try server FAQ for more details.') % | |
708 self.try_server.server_url) | |
560 | 709 |
561 def testFailedCompileRetryClobber(self): | 710 def testFailedCompileRetryClobber(self): |
562 # It must retry once a non-clobber compile. | 711 # It must retry once a non-clobber compile. |
563 self.try_runner.verify(self.pending, '123') | 712 self.try_runner.verify(self.pending, '123') |
564 self.try_server.check_calls( | 713 self.try_server.check_calls( |
565 ['trychange b=linux,mac c=False r=123 t=test1,test2']) | 714 ['trychange b=linux,mac c=False r=123 t=test1,test2']) |
566 self.try_server.add_build( | 715 self.try_server.add_build( |
567 'linux', 123, None, [SUCCESS, FAILURE, None, None]) | 716 'linux', 123, None, [SUCCESS, FAILURE, None, None]) |
717 self.lkgr = 122 | |
568 self.try_runner.update_status([self.pending]) | 718 self.try_runner.update_status([self.pending]) |
569 self.try_server.check_calls( | 719 self.try_server.check_calls( |
570 ['builders/?select=linux&select=mac'] + | 720 ['builders/?select=linux&select=mac'] + |
571 ['builders/linux/builds/_all', 'builders/mac/builds/_all'] + | 721 ['builders/linux/builds/_all', 'builders/mac/builds/_all'] + |
572 ['trychange b=linux c=True r=123 t=test1,test2']) | 722 ['trychange b=linux c=True r=122 t=test1,test2']) |
573 self.assertEquals(['compile'], self.get_verif().try_jobs[0].failed_steps) | 723 self.assertEquals(['compile'], self.get_verif().try_jobs[0].failed_steps) |
574 self.assertPending(base.PROCESSING, 2, None) | 724 self.assertPending(base.PROCESSING, 2, None) |
575 | 725 |
576 self.try_server.add_build( | 726 self.try_server.add_build( |
577 'linux', 123, None, [SUCCESS, FAILURE, FAILURE, None]) | 727 'linux', 122, None, [SUCCESS, FAILURE, None, None]) |
578 self.try_runner.update_status([self.pending]) | 728 self.try_runner.update_status([self.pending]) |
579 self.try_server.check_calls( | 729 self.try_server.check_calls( |
580 ['builders/?select=linux&select=mac'] + | 730 ['builders/?select=linux&select=mac'] + |
581 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) | 731 ['builders/linux/builds/_all', 'builders/mac/builds/_all']) |
582 self.assertPending( | 732 self.assertPending( |
583 base.FAILED, 2, | 733 base.FAILED, 2, |
584 u'Try job failure for 42-23 on linux for steps compile, test1:\n' | 734 u'Try job failure for 42-23 on linux for step "compile" (clobber build)' |
735 u'.\nIt\'s a second try, previously, step "compile" failed.\n' | |
585 u'%s/buildstatus?builder=linux&number=1' % self.try_server.server_url) | 736 u'%s/buildstatus?builder=linux&number=1' % self.try_server.server_url) |
586 | 737 |
587 | 738 |
588 if __name__ == '__main__': | 739 if __name__ == '__main__': |
589 logging.basicConfig( | 740 logging.basicConfig( |
590 level=[logging.WARNING, logging.INFO, logging.DEBUG][ | 741 level=[logging.WARNING, logging.INFO, logging.DEBUG][ |
591 min(sys.argv.count('-v'), 2)], | 742 min(sys.argv.count('-v'), 2)], |
592 format='%(levelname)5s %(module)15s(%(lineno)3d): %(message)s') | 743 format='%(levelname)5s %(module)15s(%(lineno)3d): %(message)s') |
593 unittest.main() | 744 unittest.main() |
OLD | NEW |