| 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 |
| 11 from common.http_client_appengine import HttpClientAppengine as HttpClient | 11 from common.http_client_appengine import HttpClientAppengine as HttpClient |
| 12 from model import wf_analysis_status | 12 from model import analysis_status |
| 13 from model.wf_analysis import WfAnalysis | 13 from model.wf_analysis import WfAnalysis |
| 14 from model.wf_build import WfBuild | 14 from model.wf_build import WfBuild |
| 15 from model.wf_step import WfStep | 15 from model.wf_step import WfStep |
| 16 from pipeline_wrapper import pipeline_handlers | 16 from pipeline_wrapper import pipeline_handlers |
| 17 from waterfall import buildbot | 17 from waterfall import buildbot |
| 18 from waterfall import lock_util | 18 from waterfall import lock_util |
| 19 from waterfall import swarming_util | 19 from waterfall import swarming_util |
| 20 from waterfall.detect_first_failure_pipeline import DetectFirstFailurePipeline | 20 from waterfall.detect_first_failure_pipeline import DetectFirstFailurePipeline |
| 21 from waterfall.test import wf_testcase | 21 from waterfall.test import wf_testcase |
| 22 | 22 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 build_url = buildbot.CreateBuildUrl( | 60 build_url = buildbot.CreateBuildUrl( |
| 61 master_name, builder_name, build_number, json_api=True) | 61 master_name, builder_name, build_number, json_api=True) |
| 62 self.mocked_urlfetch.register_handler(build_url, build_data) | 62 self.mocked_urlfetch.register_handler(build_url, build_data) |
| 63 | 63 |
| 64 def testLookBackUntilGreenBuild(self): | 64 def testLookBackUntilGreenBuild(self): |
| 65 master_name = 'm' | 65 master_name = 'm' |
| 66 builder_name = 'b' | 66 builder_name = 'b' |
| 67 build_number = 123 | 67 build_number = 123 |
| 68 | 68 |
| 69 self._CreateAndSaveWfAnanlysis( | 69 self._CreateAndSaveWfAnanlysis( |
| 70 master_name, builder_name, build_number, wf_analysis_status.ANALYZING) | 70 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 71 | 71 |
| 72 # Setup build data for builds: | 72 # Setup build data for builds: |
| 73 # 123: mock urlfetch to ensure it is fetched. | 73 # 123: mock urlfetch to ensure it is fetched. |
| 74 self._MockUrlfetchWithBuildData(master_name, builder_name, 123) | 74 self._MockUrlfetchWithBuildData(master_name, builder_name, 123) |
| 75 # 122: mock a build in datastore to ensure it is not fetched again. | 75 # 122: mock a build in datastore to ensure it is not fetched again. |
| 76 build = WfBuild.Create(master_name, builder_name, 122) | 76 build = WfBuild.Create(master_name, builder_name, 122) |
| 77 build.data = self._GetBuildData(master_name, builder_name, 122) | 77 build.data = self._GetBuildData(master_name, builder_name, 122) |
| 78 build.completed = True | 78 build.completed = True |
| 79 build.put() | 79 build.put() |
| 80 self._MockUrlfetchWithBuildData( | 80 self._MockUrlfetchWithBuildData( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 105 | 105 |
| 106 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) | 106 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) |
| 107 | 107 |
| 108 def testFirstFailureLastPassUpdating(self): | 108 def testFirstFailureLastPassUpdating(self): |
| 109 """last pass always should just be updated once.""" | 109 """last pass always should just be updated once.""" |
| 110 master_name = 'm' | 110 master_name = 'm' |
| 111 builder_name = 'b' | 111 builder_name = 'b' |
| 112 build_number = 100 | 112 build_number = 100 |
| 113 | 113 |
| 114 self._CreateAndSaveWfAnanlysis( | 114 self._CreateAndSaveWfAnanlysis( |
| 115 master_name, builder_name, build_number, wf_analysis_status.ANALYZING) | 115 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 116 | 116 |
| 117 # Setup build data for builds: | 117 # Setup build data for builds: |
| 118 # 100: net_unitests failed, unit_tests failed. | 118 # 100: net_unitests failed, unit_tests failed. |
| 119 # 99: net_unitests passed, unit_tests failed. | 119 # 99: net_unitests passed, unit_tests failed. |
| 120 # 98: net_unitests passed, unit_tests failed. | 120 # 98: net_unitests passed, unit_tests failed. |
| 121 # 97: net_unitests failed, unit_tests failed. | 121 # 97: net_unitests failed, unit_tests failed. |
| 122 # 96: net_unitests passed, unit_tests passed. | 122 # 96: net_unitests passed, unit_tests passed. |
| 123 for i in range(5): | 123 for i in range(5): |
| 124 self._MockUrlfetchWithBuildData(master_name, builder_name, 100 - i) | 124 self._MockUrlfetchWithBuildData(master_name, builder_name, 100 - i) |
| 125 | 125 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 140 } | 140 } |
| 141 | 141 |
| 142 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) | 142 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) |
| 143 | 143 |
| 144 def testStopLookingBackIfAllFailedStepsPassedInLastBuild(self): | 144 def testStopLookingBackIfAllFailedStepsPassedInLastBuild(self): |
| 145 master_name = 'm' | 145 master_name = 'm' |
| 146 builder_name = 'b' | 146 builder_name = 'b' |
| 147 build_number = 124 | 147 build_number = 124 |
| 148 | 148 |
| 149 self._CreateAndSaveWfAnanlysis( | 149 self._CreateAndSaveWfAnanlysis( |
| 150 master_name, builder_name, build_number, wf_analysis_status.ANALYZING) | 150 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 151 | 151 |
| 152 # Setup build data for builds: | 152 # Setup build data for builds: |
| 153 self._MockUrlfetchWithBuildData(master_name, builder_name, 124) | 153 self._MockUrlfetchWithBuildData(master_name, builder_name, 124) |
| 154 self._MockUrlfetchWithBuildData(master_name, builder_name, 123, | 154 self._MockUrlfetchWithBuildData(master_name, builder_name, 123, |
| 155 build_data=None) | 155 build_data=None) |
| 156 self._MockUrlfetchWithBuildData( | 156 self._MockUrlfetchWithBuildData( |
| 157 master_name, builder_name, 122, build_data='Blow up if used!') | 157 master_name, builder_name, 122, build_data='Blow up if used!') |
| 158 | 158 |
| 159 pipeline = DetectFirstFailurePipeline() | 159 pipeline = DetectFirstFailurePipeline() |
| 160 failure_info = pipeline.run(master_name, builder_name, build_number) | 160 failure_info = pipeline.run(master_name, builder_name, build_number) |
| 161 | 161 |
| 162 expected_failed_steps = { | 162 expected_failed_steps = { |
| 163 'a': { | 163 'a': { |
| 164 'last_pass': 123, | 164 'last_pass': 123, |
| 165 'current_failure': 124, | 165 'current_failure': 124, |
| 166 'first_failure': 124 | 166 'first_failure': 124 |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 | 169 |
| 170 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) | 170 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) |
| 171 | 171 |
| 172 def testAnalyzeSuccessfulBuild(self): | 172 def testAnalyzeSuccessfulBuild(self): |
| 173 master_name = 'm' | 173 master_name = 'm' |
| 174 builder_name = 'b' | 174 builder_name = 'b' |
| 175 build_number = 121 | 175 build_number = 121 |
| 176 | 176 |
| 177 self._CreateAndSaveWfAnanlysis( | 177 self._CreateAndSaveWfAnanlysis( |
| 178 master_name, builder_name, build_number, wf_analysis_status.ANALYZING) | 178 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 179 | 179 |
| 180 # Setup build data for builds: | 180 # Setup build data for builds: |
| 181 self._MockUrlfetchWithBuildData(master_name, builder_name, 121) | 181 self._MockUrlfetchWithBuildData(master_name, builder_name, 121) |
| 182 self._MockUrlfetchWithBuildData( | 182 self._MockUrlfetchWithBuildData( |
| 183 master_name, builder_name, 120, build_data='Blow up if used!') | 183 master_name, builder_name, 120, build_data='Blow up if used!') |
| 184 | 184 |
| 185 pipeline = DetectFirstFailurePipeline() | 185 pipeline = DetectFirstFailurePipeline() |
| 186 failure_info = pipeline.run(master_name, builder_name, build_number) | 186 failure_info = pipeline.run(master_name, builder_name, build_number) |
| 187 | 187 |
| 188 self.assertFalse(failure_info['failed']) | 188 self.assertFalse(failure_info['failed']) |
| 189 | 189 |
| 190 def testStopLookingBackIfFindTheFirstBuild(self): | 190 def testStopLookingBackIfFindTheFirstBuild(self): |
| 191 master_name = 'm' | 191 master_name = 'm' |
| 192 builder_name = 'b' | 192 builder_name = 'b' |
| 193 build_number = 2 | 193 build_number = 2 |
| 194 | 194 |
| 195 self._CreateAndSaveWfAnanlysis( | 195 self._CreateAndSaveWfAnanlysis( |
| 196 master_name, builder_name, build_number, wf_analysis_status.ANALYZING) | 196 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 197 | 197 |
| 198 # Setup build data for builds: | 198 # Setup build data for builds: |
| 199 self._MockUrlfetchWithBuildData(master_name, builder_name, 2) | 199 self._MockUrlfetchWithBuildData(master_name, builder_name, 2) |
| 200 self._MockUrlfetchWithBuildData(master_name, builder_name, 1) | 200 self._MockUrlfetchWithBuildData(master_name, builder_name, 1) |
| 201 self._MockUrlfetchWithBuildData(master_name, builder_name, 0) | 201 self._MockUrlfetchWithBuildData(master_name, builder_name, 0) |
| 202 | 202 |
| 203 pipeline = DetectFirstFailurePipeline() | 203 pipeline = DetectFirstFailurePipeline() |
| 204 failure_info = pipeline.run(master_name, builder_name, build_number) | 204 failure_info = pipeline.run(master_name, builder_name, build_number) |
| 205 | 205 |
| 206 expected_failed_steps = { | 206 expected_failed_steps = { |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 } | 560 } |
| 561 } | 561 } |
| 562 self.assertEqual(builds, expected_builds) | 562 self.assertEqual(builds, expected_builds) |
| 563 | 563 |
| 564 def testTestLevelFailedInfo(self): | 564 def testTestLevelFailedInfo(self): |
| 565 master_name = 'm' | 565 master_name = 'm' |
| 566 builder_name = 'b' | 566 builder_name = 'b' |
| 567 build_number = 223 | 567 build_number = 223 |
| 568 | 568 |
| 569 self._CreateAndSaveWfAnanlysis( | 569 self._CreateAndSaveWfAnanlysis( |
| 570 master_name, builder_name, build_number, wf_analysis_status.ANALYZING) | 570 master_name, builder_name, build_number, analysis_status.RUNNING) |
| 571 | 571 |
| 572 # Mock data for retrieving data from swarming server for a build. | 572 # Mock data for retrieving data from swarming server for a build. |
| 573 self._MockUrlFetchWithSwarmingData(master_name, builder_name, 223) | 573 self._MockUrlFetchWithSwarmingData(master_name, builder_name, 223) |
| 574 | 574 |
| 575 for n in xrange(223, 219, -1): # pragma: no cover | 575 for n in xrange(223, 219, -1): # pragma: no cover |
| 576 # Setup build data for builds: | 576 # Setup build data for builds: |
| 577 self._MockUrlfetchWithBuildData(master_name, builder_name, n) | 577 self._MockUrlfetchWithBuildData(master_name, builder_name, n) |
| 578 if n == 220: | 578 if n == 220: |
| 579 break | 579 break |
| 580 | 580 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 221: '{"Unittest3.Subtest3": "YS9iL3UzczIuY2M6MTEwOiBGYWlsdXJlCg=="}' | 665 221: '{"Unittest3.Subtest3": "YS9iL3UzczIuY2M6MTEwOiBGYWlsdXJlCg=="}' |
| 666 } | 666 } |
| 667 | 667 |
| 668 for n in xrange(223, 220, -1): | 668 for n in xrange(223, 220, -1): |
| 669 step = WfStep.Get(master_name, builder_name, n, 'abc_test') | 669 step = WfStep.Get(master_name, builder_name, n, 'abc_test') |
| 670 self.assertIsNotNone(step) | 670 self.assertIsNotNone(step) |
| 671 self.assertTrue(step.isolated) | 671 self.assertTrue(step.isolated) |
| 672 self.assertEqual(expected_step_log_data[n], step.log_data) | 672 self.assertEqual(expected_step_log_data[n], step.log_data) |
| 673 | 673 |
| 674 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) | 674 self.assertEqual(expected_failed_steps, failure_info['failed_steps']) |
| OLD | NEW |