| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 os |
| 6 |
| 5 from pipeline_utils.appengine_third_party_pipeline_src_pipeline import handlers | 7 from pipeline_utils.appengine_third_party_pipeline_src_pipeline import handlers |
| 6 from testing_utils import testing | 8 from testing_utils import testing |
| 7 | 9 |
| 8 from model.wf_step import WfStep | 10 from model.wf_step import WfStep |
| 9 from waterfall import buildbot | 11 from waterfall import buildbot |
| 10 from waterfall import extractors | 12 from waterfall import extractors |
| 11 from waterfall.extract_signal_pipeline import ExtractSignalPipeline | 13 from waterfall.extract_signal_pipeline import ExtractSignalPipeline |
| 12 | 14 |
| 13 | 15 |
| 14 class ExtractSignalPipelineTest(testing.AppengineTestCase): | 16 class ExtractSignalPipelineTest(testing.AppengineTestCase): |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 step_log_url = buildbot.CreateStdioLogUrl( | 73 step_log_url = buildbot.CreateStdioLogUrl( |
| 72 master_name, builder_name, build_number, step_name) | 74 master_name, builder_name, build_number, step_name) |
| 73 with self.mock_urlfetch() as urlfetch: | 75 with self.mock_urlfetch() as urlfetch: |
| 74 urlfetch.register_handler(step_log_url, 'If used, test should fail!') | 76 urlfetch.register_handler(step_log_url, 'If used, test should fail!') |
| 75 | 77 |
| 76 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) | 78 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) |
| 77 signals = pipeline.run(self.FAILURE_INFO) | 79 signals = pipeline.run(self.FAILURE_INFO) |
| 78 | 80 |
| 79 self.assertEqual(self.FAILURE_SIGNALS, signals) | 81 self.assertEqual(self.FAILURE_SIGNALS, signals) |
| 80 | 82 |
| 83 def MockGetStdiolog(self, master_name, builder_name, build_number, step_name): |
| 84 step_log_url = buildbot.CreateStdioLogUrl( |
| 85 master_name, builder_name, build_number, step_name) |
| 86 with self.mock_urlfetch() as urlfetch: |
| 87 urlfetch.register_handler(step_log_url, self.ABC_TEST_FAILURE_LOG) |
| 88 |
| 81 def testWfStepStdioLogNotDownloadedYet(self): | 89 def testWfStepStdioLogNotDownloadedYet(self): |
| 82 master_name = 'm' | 90 master_name = 'm' |
| 83 builder_name = 'b' | 91 builder_name = 'b' |
| 84 build_number = 123 | 92 build_number = 123 |
| 85 step_name = 'abc_test' | 93 step_name = 'abc_test' |
| 86 | 94 |
| 87 step_log_url = buildbot.CreateStdioLogUrl( | 95 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 88 master_name, builder_name, build_number, step_name) | |
| 89 with self.mock_urlfetch() as urlfetch: | |
| 90 urlfetch.register_handler(step_log_url, self.ABC_TEST_FAILURE_LOG) | |
| 91 | 96 |
| 92 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) | 97 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) |
| 93 pipeline.start() | 98 pipeline.start() |
| 94 self.execute_queued_tasks() | 99 self.execute_queued_tasks() |
| 95 | 100 |
| 96 step = WfStep.Create(master_name, builder_name, build_number, step_name) | 101 step = WfStep.Create(master_name, builder_name, build_number, step_name) |
| 97 self.assertIsNotNone(step) | 102 self.assertIsNotNone(step) |
| 103 |
| 104 def _GetGtestResultLog(self, |
| 105 master_name, builder_name, build_number, step_name): |
| 106 file_name = os.path.join( |
| 107 os.path.dirname(__file__), 'data', |
| 108 '%s_%s_%d_%s.json' % (master_name, |
| 109 builder_name, build_number, step_name)) |
| 110 with open(file_name, 'r') as f: |
| 111 return f.read() |
| 112 |
| 113 def testGetTestLevelFailures(self): |
| 114 master_name = 'm' |
| 115 builder_name = 'b' |
| 116 build_number = 123 |
| 117 step_name = 'abc_test' |
| 118 |
| 119 expected_failure_log = ('\'Unittest2.Subtest1\': a/b/u2s1.cc:567: Failure' |
| 120 '\\n[2]: 2594735000 bogo-microseconds\\n\n' |
| 121 '\'Unittest2.Subtest1\': a/b/u2s1.cc:567: Failure\n' |
| 122 '\'Unittest2.Subtest1\': a/b/u2s1.cc:567: Failure\n' |
| 123 '\'Unittest2.Subtest1\': a/b/u2s1.cc:567: Failure\n' |
| 124 '\'Unittest3.Subtest2\': a/b/u3s2.cc:110: Failure\n' |
| 125 '\'Unittest3.Subtest2\': a/b/u3s2.cc:110: Failure\n' |
| 126 '\'Unittest3.Subtest2\': a/b/u3s2.cc:110: Failure\n' |
| 127 '\'Unittest3.Subtest2\': a/b/u3s2.cc:110: Failure\n' |
| 128 ) |
| 129 |
| 130 step_log = self._GetGtestResultLog(master_name, |
| 131 builder_name, build_number, step_name) |
| 132 |
| 133 failed_test_log = ExtractSignalPipeline._GetReliableTestFailureLog(step_log) |
| 134 self.assertEqual(expected_failure_log, failed_test_log) |
| 135 |
| 136 def testGetTestLevelFailuresFlaky(self): |
| 137 master_name = 'm' |
| 138 builder_name = 'b' |
| 139 build_number = 124 |
| 140 step_name = 'abc_test' |
| 141 |
| 142 expected_failure_log = 'flaky' |
| 143 |
| 144 step_log = self._GetGtestResultLog(master_name, |
| 145 builder_name, build_number, step_name) |
| 146 |
| 147 failed_test_log = ExtractSignalPipeline._GetReliableTestFailureLog(step_log) |
| 148 self.assertEqual(expected_failure_log, failed_test_log) |
| 149 |
| 150 def testGetTestLevelFailuresInvalid(self): |
| 151 master_name = 'm' |
| 152 builder_name = 'b' |
| 153 build_number = 125 |
| 154 step_name = 'abc_test' |
| 155 |
| 156 expected_failure_log = 'invalid' |
| 157 |
| 158 step_log = self._GetGtestResultLog(master_name, |
| 159 builder_name, build_number, step_name) |
| 160 |
| 161 failed_test_log = ExtractSignalPipeline._GetReliableTestFailureLog(step_log) |
| 162 self.assertEqual(expected_failure_log, failed_test_log) |
| 163 |
| 164 |
| 165 |
| 166 def MockGetGtestJsonResult(self): |
| 167 self.mock(buildbot, 'GetGtestResultLog',self._GetGtestResultLog) |
| 168 |
| 169 def testGetSignalFromStepLog(self): |
| 170 master_name = 'm' |
| 171 builder_name = 'b' |
| 172 build_number = 123 |
| 173 step_name = 'abc_test' |
| 174 |
| 175 # Mock both stdiolog and gtest json results to test whether Findit will |
| 176 # go to step log first when both logs exist. |
| 177 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 178 self.MockGetGtestJsonResult() |
| 179 pipeline = ExtractSignalPipeline(self.FAILURE_INFO) |
| 180 signals = pipeline.run(self.FAILURE_INFO) |
| 181 |
| 182 step = WfStep.Get(master_name, builder_name, build_number, step_name) |
| 183 |
| 184 expected_files = { |
| 185 'a/b/u2s1.cc': [567], |
| 186 'a/b/u3s2.cc': [110] |
| 187 } |
| 188 |
| 189 self.assertIsNotNone(step) |
| 190 self.assertIsNotNone(step.log_data) |
| 191 self.assertEqual(expected_files, signals['abc_test']['files']) |
| 192 |
| 193 def testGetSignalFromStepLogFlaky(self): |
| 194 master_name = 'm' |
| 195 builder_name = 'b' |
| 196 build_number = 124 |
| 197 step_name = 'abc_test' |
| 198 |
| 199 failure_info = { |
| 200 'master_name': 'm', |
| 201 'builder_name': 'b', |
| 202 'build_number': 124, |
| 203 'failed_steps': { |
| 204 'abc_test': { |
| 205 'last_pass': 123, |
| 206 'current_failure': 124, |
| 207 'first_failure': 124, |
| 208 } |
| 209 } |
| 210 } |
| 211 |
| 212 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 213 self.MockGetGtestJsonResult() |
| 214 pipeline = ExtractSignalPipeline(failure_info) |
| 215 signals = pipeline.run(failure_info) |
| 216 |
| 217 step = WfStep.Get(master_name, builder_name, build_number, step_name) |
| 218 |
| 219 self.assertIsNotNone(step) |
| 220 self.assertIsNotNone(step.log_data) |
| 221 self.assertEqual('flaky', step.log_data) |
| 222 self.assertEqual({}, signals['abc_test']['files']) |
| 223 |
| 224 def testGetSignalFromStepLogInvalid(self): |
| 225 master_name = 'm' |
| 226 builder_name = 'b' |
| 227 build_number = 125 |
| 228 step_name = 'abc_test' |
| 229 |
| 230 failure_info = { |
| 231 'master_name': 'm', |
| 232 'builder_name': 'b', |
| 233 'build_number': 125, |
| 234 'failed_steps': { |
| 235 'abc_test': { |
| 236 'last_pass': 124, |
| 237 'current_failure': 125, |
| 238 'first_failure': 125, |
| 239 } |
| 240 } |
| 241 } |
| 242 |
| 243 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) |
| 244 self.MockGetGtestJsonResult() |
| 245 |
| 246 pipeline = ExtractSignalPipeline(failure_info) |
| 247 signals = pipeline.run(failure_info) |
| 248 |
| 249 step = WfStep.Get(master_name, builder_name, build_number, step_name) |
| 250 |
| 251 expected_files = { |
| 252 'content/common/gpu/media/v4l2_video_encode_accelerator.cc': [306] |
| 253 } |
| 254 |
| 255 self.assertIsNotNone(step) |
| 256 self.assertIsNotNone(step.log_data) |
| 257 self.assertEqual(expected_files, signals['abc_test']['files']) |
| OLD | NEW |