Chromium Code Reviews| 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 |