Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: appengine/findit/waterfall/test/extract_signal_pipeline_test.py

Issue 1149743002: [Findit] Use step level analysis to exclude flaky test failures. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Fix name style nit. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « appengine/findit/waterfall/test/data/m_b_125_abc_test.json ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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'])
OLDNEW
« no previous file with comments | « appengine/findit/waterfall/test/data/m_b_125_abc_test.json ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698