| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import datetime | 5 import datetime |
| 6 import json | 6 import json |
| 7 import os | 7 import os |
| 8 import urllib | 8 import urllib |
| 9 import zlib | 9 import zlib |
| 10 | 10 |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 'sort': 'created_ts' | 253 'sort': 'created_ts' |
| 254 } | 254 } |
| 255 cursor_url = ('%s&cursor=thisisacursor') % url | 255 cursor_url = ('%s&cursor=thisisacursor') % url |
| 256 | 256 |
| 257 self.mocked_urlfetch.register_handler(url, response) | 257 self.mocked_urlfetch.register_handler(url, response) |
| 258 self.mocked_urlfetch.register_handler( | 258 self.mocked_urlfetch.register_handler( |
| 259 cursor_url, json.dumps(cursor_swarming_data)) | 259 cursor_url, json.dumps(cursor_swarming_data)) |
| 260 | 260 |
| 261 def _MockUrlfetchWithIsolatedData( | 261 def _MockUrlfetchWithIsolatedData( |
| 262 self, isolated_data=None, file_url=None, | 262 self, isolated_data=None, file_url=None, |
| 263 file_name=None, build_number=None): # pragma: no cover | 263 file_name=None, build_number=None): |
| 264 if isolated_data: # Mocks POST requests to isolated server. | 264 if isolated_data: # Mocks POST requests to isolated server. |
| 265 url = '%s/_ah/api/isolateservice/v1/retrieve' % ( | 265 url = '%s/_ah/api/isolateservice/v1/retrieve' % ( |
| 266 isolated_data['isolatedserver']) | 266 isolated_data['isolatedserver']) |
| 267 post_data = { | 267 post_data = { |
| 268 'digest': isolated_data['digest'], | 268 'digest': isolated_data['digest'], |
| 269 'namespace': isolated_data['namespace'] | 269 'namespace': isolated_data['namespace'] |
| 270 } | 270 } |
| 271 file_name = isolated_data['digest'] | 271 file_name = isolated_data['digest'] |
| 272 if build_number: | 272 if build_number: # pragma: no branch |
| 273 file_name = isolated_data['digest'][:-4] | 273 file_name = isolated_data['digest'][:-4] |
| 274 content = self._GetSwarmingData('isolated', file_name, build_number) | 274 content = self._GetSwarmingData('isolated', file_name, build_number) |
| 275 | 275 |
| 276 elif file_url and file_name: # Mocks GET requests to isolated server. | 276 elif file_url and file_name: # pragma: no branch. |
| 277 # Mocks GET requests to isolated server. |
| 277 url = file_url | 278 url = file_url |
| 278 post_data = None | 279 post_data = None |
| 279 content = self._GetSwarmingData('isolated', file_name) | 280 content = self._GetSwarmingData('isolated', file_name) |
| 280 | 281 |
| 281 self.mocked_urlfetch.register_handler( | 282 self.mocked_urlfetch.register_handler( |
| 282 url, content, | 283 url, content, |
| 283 data=(json.dumps(post_data, sort_keys=True, separators=(',', ':')) | 284 data=(json.dumps(post_data, sort_keys=True, separators=(',', ':')) |
| 284 if post_data else None)) | 285 if post_data else None)) |
| 285 | 286 |
| 286 def testAnalyzeSwarmingTestResultsInitiateLastPassForTests(self): | 287 def testAnalyzeSwarmingTestResultsInitiateLastPassForTests(self): |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 master_name = 'm' | 566 master_name = 'm' |
| 566 builder_name = 'b' | 567 builder_name = 'b' |
| 567 build_number = 223 | 568 build_number = 223 |
| 568 | 569 |
| 569 self._CreateAndSaveWfAnanlysis( | 570 self._CreateAndSaveWfAnanlysis( |
| 570 master_name, builder_name, build_number, analysis_status.RUNNING) | 571 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 571 | 572 |
| 572 # Mock data for retrieving data from swarming server for a build. | 573 # Mock data for retrieving data from swarming server for a build. |
| 573 self._MockUrlFetchWithSwarmingData(master_name, builder_name, 223) | 574 self._MockUrlFetchWithSwarmingData(master_name, builder_name, 223) |
| 574 | 575 |
| 575 for n in xrange(223, 219, -1): # pragma: no cover | 576 for n in xrange(223, 219, -1): # pragma: no branch. |
| 576 # Setup build data for builds: | 577 # Setup build data for builds: |
| 577 self._MockUrlfetchWithBuildData(master_name, builder_name, n) | 578 self._MockUrlfetchWithBuildData(master_name, builder_name, n) |
| 578 if n == 220: | 579 if n == 220: |
| 579 break | 580 break |
| 580 | 581 |
| 581 # Mock data for retrieving data from swarming server for a single step. | 582 # Mock data for retrieving data from swarming server for a single step. |
| 582 self._MockUrlFetchWithSwarmingData( | 583 self._MockUrlFetchWithSwarmingData( |
| 583 master_name, builder_name, n, 'abc_test') | 584 master_name, builder_name, n, 'abc_test') |
| 584 | 585 |
| 585 # Mock data for retrieving hash to output.json from isolated server. | 586 # Mock data for retrieving hash to output.json from isolated server. |
| 586 isolated_data = { | 587 isolated_data = { |
| 587 'isolatedserver': 'https://isolateserver.appspot.com', | 588 'isolatedserver': 'https://isolateserver.appspot.com', |
| 588 'namespace': { | 589 'namespace': { |
| 589 'namespace': 'default-gzip' | 590 'namespace': 'default-gzip' |
| 590 }, | 591 }, |
| 591 'digest': 'isolatedhashabctest-%d' % n | 592 'digest': 'isolatedhashabctest-%d' % n |
| 592 } | 593 } |
| 593 self._MockUrlfetchWithIsolatedData( | 594 self._MockUrlfetchWithIsolatedData(isolated_data, build_number=n) |
| 594 isolated_data, build_number=n) | |
| 595 # Mock data for retrieving url to output.json from isolated server. | 595 # Mock data for retrieving url to output.json from isolated server. |
| 596 file_hash_data = { | 596 file_hash_data = { |
| 597 'isolatedserver': 'https://isolateserver.appspot.com', | 597 'isolatedserver': 'https://isolateserver.appspot.com', |
| 598 'namespace': { | 598 'namespace': { |
| 599 'namespace': 'default-gzip' | 599 'namespace': 'default-gzip' |
| 600 }, | 600 }, |
| 601 'digest': 'abctestoutputjsonhash-%d' % n | 601 'digest': 'abctestoutputjsonhash-%d' % n |
| 602 } | 602 } |
| 603 self._MockUrlfetchWithIsolatedData( | 603 self._MockUrlfetchWithIsolatedData(file_hash_data, build_number=n) |
| 604 file_hash_data, build_number=n) | |
| 605 | 604 |
| 606 # Mock data for downloading output.json from isolated server. | 605 # Mock data for downloading output.json from isolated server. |
| 607 self._MockUrlfetchWithIsolatedData( | 606 self._MockUrlfetchWithIsolatedData( |
| 608 None, | 607 None, |
| 609 ('https://isolateserver.storage.googleapis.com/default-gzip/' | 608 ('https://isolateserver.storage.googleapis.com/default-gzip/' |
| 610 'm_b_%d_abc_test' % n), | 609 'm_b_%d_abc_test' % n), |
| 611 '%s_%s_%d_%s.json' % (master_name, builder_name, n, 'abc_test')) | 610 '%s_%s_%d_%s.json' % (master_name, builder_name, n, 'abc_test')) |
| 612 | 611 |
| 613 step_221 = WfStep.Create(master_name, builder_name, 221, 'abc_test') | 612 step_221 = WfStep.Create(master_name, builder_name, 221, 'abc_test') |
| 614 step_221.isolated = True | 613 step_221.isolated = True |
| 615 step_221.log_data = ( | 614 step_221.log_data = ( |
| 616 '{"Unittest3.Subtest3": "YS9iL3UzczIuY2M6MTEwOiBGYWlsdXJlCg=="}') | 615 '{"Unittest3.Subtest3": "YS9iL3UzczIuY2M6MTEwOiBGYWlsdXJlCg=="}') |
| 617 step_221.put() | 616 step_221.put() |
| 618 | 617 |
| 619 pipeline = DetectFirstFailurePipeline() | 618 pipeline = DetectFirstFailurePipeline() |
| 620 failure_info = pipeline.run(master_name, builder_name, build_number) | 619 failure_info = pipeline.run(master_name, builder_name, build_number) |
| 621 | 620 |
| 622 expected_failed_steps = { | 621 expected_failed_steps = { |
| 623 'compile': { | |
| 624 'current_failure': 223, | |
| 625 'first_failure': 221, | |
| 626 'last_pass': 220 | |
| 627 }, | |
| 628 'abc_test': { | 622 'abc_test': { |
| 629 'current_failure': 223, | 623 'current_failure': 223, |
| 630 'first_failure': 222, | 624 'first_failure': 222, |
| 631 'last_pass': 221, | 625 'last_pass': 221, |
| 632 'list_isolated_data': [ | 626 'list_isolated_data': [ |
| 633 { | 627 { |
| 634 'isolatedserver': 'https://isolateserver.appspot.com', | 628 'isolatedserver': 'https://isolateserver.appspot.com', |
| 635 'namespace': 'default-gzip', | 629 'namespace': 'default-gzip', |
| 636 'digest': 'isolatedhashabctest-223' | 630 'digest': 'isolatedhashabctest-223' |
| 637 } | 631 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 665 221: '{"Unittest3.Subtest3": "YS9iL3UzczIuY2M6MTEwOiBGYWlsdXJlCg=="}' | 659 221: '{"Unittest3.Subtest3": "YS9iL3UzczIuY2M6MTEwOiBGYWlsdXJlCg=="}' |
| 666 } | 660 } |
| 667 | 661 |
| 668 for n in xrange(223, 220, -1): | 662 for n in xrange(223, 220, -1): |
| 669 step = WfStep.Get(master_name, builder_name, n, 'abc_test') | 663 step = WfStep.Get(master_name, builder_name, n, 'abc_test') |
| 670 self.assertIsNotNone(step) | 664 self.assertIsNotNone(step) |
| 671 self.assertTrue(step.isolated) | 665 self.assertTrue(step.isolated) |
| 672 self.assertEqual(expected_step_log_data[n], step.log_data) | 666 self.assertEqual(expected_step_log_data[n], step.log_data) |
| 673 | 667 |
| 674 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) | 668 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) |
| OLD | NEW |