Chromium Code Reviews| 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 | |
|
stgao
2015/05/27 00:18:21
I didn't see the data file for build 124 and 125.
chanli
2015/05/27 00:32:15
Done.
| |
| 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 MockGetArchivedLog(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 step log to test whether Findit will | |
|
stgao
2015/05/27 00:18:21
nit: not "step log", it is "gtest json results".
chanli
2015/05/27 00:32:15
Done.
| |
| 176 # go to step log first when both logs exist. | |
| 177 self.MockGetStdiolog(master_name, builder_name, build_number, step_name) | |
| 178 self.MockGetArchivedLog() | |
| 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.MockGetArchivedLog() | |
| 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.MockGetArchivedLog() | |
| 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 |