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

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

Issue 2597373002: [Findit] Flake checker: Get full build info for each flake build analyzed (Closed)
Patch Set: Created 3 years, 12 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
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 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 mock 7 import mock
8 8
9 from model import analysis_status 9 from model import analysis_status
10 from model.flake.flake_swarming_task import FlakeSwarmingTask 10 from model.flake.flake_swarming_task import FlakeSwarmingTask
11 from model.flake.master_flake_analysis import MasterFlakeAnalysis 11 from model.flake.master_flake_analysis import MasterFlakeAnalysis
12 from model.wf_build import WfBuild 12 from model.wf_build import WfBuild
13 from waterfall import build_util 13 from waterfall import build_util
14 from waterfall import swarming_util
15 from waterfall import ( 14 from waterfall import (
16 process_flake_swarming_task_result_pipeline as flake_result_pipeline) 15 process_flake_swarming_task_result_pipeline as flake_result_pipeline)
16 from waterfall import swarming_util
17 from waterfall.build_info import BuildInfo
17 from waterfall.process_flake_swarming_task_result_pipeline import ( 18 from waterfall.process_flake_swarming_task_result_pipeline import (
18 ProcessFlakeSwarmingTaskResultPipeline) 19 ProcessFlakeSwarmingTaskResultPipeline)
19 from waterfall.test import ( 20 from waterfall.test import (
20 process_base_swarming_task_result_pipeline_test as base_test) 21 process_base_swarming_task_result_pipeline_test as base_test)
21 from waterfall.test import wf_testcase 22 from waterfall.test import wf_testcase
22 23
23 24
24 class ProcessFlakeSwarmingTaskResultPipelineTest(wf_testcase.WaterfallTestCase): 25 class ProcessFlakeSwarmingTaskResultPipelineTest(wf_testcase.WaterfallTestCase):
25 26
26 def _MockedGetSwarmingTaskResultById(self, task_id, _): 27 def _MockedGetSwarmingTaskResultById(self, task_id, _):
27 return base_test._SWARMING_TASK_RESULTS[task_id], None 28 return base_test._SWARMING_TASK_RESULTS[task_id], None
28 29
29 def setUp(self): 30 def setUp(self):
30 super(ProcessFlakeSwarmingTaskResultPipelineTest, self).setUp() 31 super(ProcessFlakeSwarmingTaskResultPipelineTest, self).setUp()
31 self.pipeline = ProcessFlakeSwarmingTaskResultPipeline() 32 self.pipeline = ProcessFlakeSwarmingTaskResultPipeline()
32 self.master_name = 'm' 33 self.master_name = 'm'
33 self.builder_name = 'b' 34 self.builder_name = 'b'
34 self.build_number = 121 35 self.build_number = 121
35 self.step_name = 'abc_tests on platform' 36 self.step_name = 'abc_tests on platform'
36 self.test_name = 'TestSuite1.test1' 37 self.test_name = 'TestSuite1.test1'
37 self.version_number = 1 38 self.version_number = 1
38 self.mock(swarming_util, 'GetSwarmingTaskResultById', 39 self.mock(swarming_util, 'GetSwarmingTaskResultById',
39 self._MockedGetSwarmingTaskResultById) 40 self._MockedGetSwarmingTaskResultById)
40 41
41 @mock.patch.object(flake_result_pipeline, 42 @mock.patch.object(flake_result_pipeline, '_GetBuildInfo')
42 '_GetCommitPositionAndGitHash', 43 def testCheckTestsRunStatuses(self, mocked_fn):
43 return_value=(12345, 'git_hash')) 44 build_info = BuildInfo(
44 def testCheckTestsRunStatuses(self, _): 45 self.master_name, self.build_number, self.build_number)
46 build_info.commit_position = 12345
47 build_info.chromium_revision = 'a1b2c3d4'
48 mocked_fn.return_value = build_info
45 analysis = MasterFlakeAnalysis.Create( 49 analysis = MasterFlakeAnalysis.Create(
46 self.master_name, self.builder_name, 50 self.master_name, self.builder_name,
47 self.build_number, self.step_name, self.test_name) 51 self.build_number, self.step_name, self.test_name)
48 analysis.Save() 52 analysis.Save()
49 53
50 task = FlakeSwarmingTask.Create( 54 task = FlakeSwarmingTask.Create(
51 self.master_name, self.builder_name, 55 self.master_name, self.builder_name,
52 self.build_number, self.step_name, self.test_name) 56 self.build_number, self.step_name, self.test_name)
53 task.put() 57 task.put()
54 58
55 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs( 59 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs(
56 self.pipeline, self.master_name, self.builder_name, 60 self.pipeline, self.master_name, self.builder_name,
57 self.build_number, self.step_name, self.build_number, 61 self.build_number, self.step_name, self.build_number,
58 self.test_name, self.version_number) 62 self.test_name, self.version_number)
59 63
60 tests_statuses = ( 64 tests_statuses = (
61 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses( 65 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses(
62 self.pipeline, 66 self.pipeline,
63 base_test._SAMPLE_FAILURE_LOG, *call_params)) 67 base_test._SAMPLE_FAILURE_LOG, *call_params))
64 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, tests_statuses) 68 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, tests_statuses)
65 69
66 @mock.patch.object(flake_result_pipeline, 70 @mock.patch.object(flake_result_pipeline, '_GetBuildInfo')
67 '_GetCommitPositionAndGitHash', 71 def testCheckTestsRunStatusesZeroBuildNumber(self, mocked_fn):
68 return_value=(12345, 'git_hash')) 72 build_info = BuildInfo(self.master_name, self.build_number, 0)
69 def testCheckTestsRunStatusesWhenTestDoesNotExist(self, _): 73 build_info.commit_position = 12345
74 build_info.chromium_revision = 'a1b2c3d4'
75 mocked_fn.return_value = build_info
76
77 analysis = MasterFlakeAnalysis.Create(
78 self.master_name, self.builder_name, 0, self.step_name, self.test_name)
79 analysis.Save()
80
81 task = FlakeSwarmingTask.Create(
82 self.master_name, self.builder_name, 0, self.step_name, self.test_name)
83 task.put()
84
85 ProcessFlakeSwarmingTaskResultPipeline()._CheckTestsRunStatuses(
86 {}, self.master_name, self.builder_name, 0, self.step_name, 0,
87 self.test_name, 1)
88 self.assertIsNone(analysis.data_points[0].previous_build_commit_position)
89
90 @mock.patch.object(flake_result_pipeline, '_GetBuildInfo')
91 def testCheckTestsRunStatusesWhenTestDoesNotExist(self, mocked_fn):
92 build_info = BuildInfo(
93 self.master_name, self.builder_name, self.build_number)
94 build_info.commit_position = 12345
95 build_info.chromium_revision = 'a1b2c3d4'
96 mocked_fn.return_value = build_info
97
70 test_name = 'TestSuite1.new_test' 98 test_name = 'TestSuite1.new_test'
71 analysis = MasterFlakeAnalysis.Create( 99 analysis = MasterFlakeAnalysis.Create(
72 self.master_name, self.builder_name, 100 self.master_name, self.builder_name,
73 self.build_number, self.step_name, test_name) 101 self.build_number, self.step_name, test_name)
74 analysis.Save() 102 analysis.Save()
75 103
76 task = FlakeSwarmingTask.Create( 104 task = FlakeSwarmingTask.Create(
77 self.master_name, self.builder_name, 105 self.master_name, self.builder_name,
78 self.build_number, self.step_name, test_name) 106 self.build_number, self.step_name, test_name)
79 task.put() 107 task.put()
(...skipping 12 matching lines...) Expand all
92 self.assertEqual(0, task.tries) 120 self.assertEqual(0, task.tries)
93 self.assertEqual(0, task.successes) 121 self.assertEqual(0, task.successes)
94 122
95 analysis = MasterFlakeAnalysis.GetVersion( 123 analysis = MasterFlakeAnalysis.GetVersion(
96 self.master_name, self.builder_name, 124 self.master_name, self.builder_name,
97 self.build_number, self.step_name, test_name, self.version_number) 125 self.build_number, self.step_name, test_name, self.version_number)
98 self.assertTrue(analysis.data_points[-1].pass_rate < 0) 126 self.assertTrue(analysis.data_points[-1].pass_rate < 0)
99 127
100 @mock.patch.object(swarming_util, 'GetSwarmingTaskFailureLog', 128 @mock.patch.object(swarming_util, 'GetSwarmingTaskFailureLog',
101 return_value=(base_test._SAMPLE_FAILURE_LOG, None)) 129 return_value=(base_test._SAMPLE_FAILURE_LOG, None))
102 @mock.patch.object(flake_result_pipeline, 130 @mock.patch.object(flake_result_pipeline, '_GetBuildInfo',
103 '_GetCommitPositionAndGitHash', 131 return_value=BuildInfo('m', 'b', 123))
104 return_value=(12345, 'git_hash'))
105 def testProcessFlakeSwarmingTaskResultPipeline(self, *_): 132 def testProcessFlakeSwarmingTaskResultPipeline(self, *_):
106 # End to end test. 133 # End to end test.
107 task = FlakeSwarmingTask.Create( 134 task = FlakeSwarmingTask.Create(
108 self.master_name, self.builder_name, 135 self.master_name, self.builder_name,
109 self.build_number, self.step_name, self.test_name) 136 self.build_number, self.step_name, self.test_name)
110 task.task_id = 'task_id1' 137 task.task_id = 'task_id1'
111 task.put() 138 task.put()
112 139
113 analysis = MasterFlakeAnalysis.Create( 140 analysis = MasterFlakeAnalysis.Create(
114 self.master_name, self.builder_name, 141 self.master_name, self.builder_name,
(...skipping 16 matching lines...) Expand all
131 self.assertEqual(analysis_status.COMPLETED, task.status) 158 self.assertEqual(analysis_status.COMPLETED, task.status)
132 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, task.tests_statuses) 159 self.assertEqual(base_test._EXPECTED_TESTS_STATUS, task.tests_statuses)
133 160
134 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220), 161 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220),
135 task.created_time) 162 task.created_time)
136 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550), 163 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550),
137 task.started_time) 164 task.started_time)
138 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9), 165 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9),
139 task.completed_time) 166 task.completed_time)
140 167
141 @mock.patch.object(build_util, '_BuildDataNeedUpdating', return_value=False) 168 @mock.patch.object(build_util, 'DownloadBuildData')
142 def testGetCommitPositionAndGitHash(self, _): 169 def testGetBuildInfo(self, mocked_fn):
143 build = WfBuild.Create('m', 'b', 123) 170 build = WfBuild.Create('m', 'b', 123)
144 build.data = json.dumps({ 171 build.data = json.dumps({
145 'properties': [ 172 'properties': [
146 ['got_revision', 'a_git_hash'], 173 ['got_revision', 'a_git_hash'],
147 ['got_revision_cp', 'refs/heads/master@{#12345}'] 174 ['got_revision_cp', 'refs/heads/master@{#12345}']
148 ], 175 ],
149 }) 176 })
150 build.put() 177 build.put()
151 self.assertEqual( 178 mocked_fn.return_value = build
152 (12345, 'a_git_hash'),
153 flake_result_pipeline._GetCommitPositionAndGitHash('m', 'b', 123))
154 self.assertEqual(
155 (None, None),
156 flake_result_pipeline._GetCommitPositionAndGitHash('m', 'b', -1))
157 179
158 @mock.patch.object(build_util, '_BuildDataNeedUpdating', return_value=False) 180 build_info = flake_result_pipeline._GetBuildInfo('m', 'b', 123)
159 def testGetCommitPositionAndGitHashNoBuildDataAvailable(self, _): 181 self.assertEqual(build_info.chromium_revision, 'a_git_hash')
160 build = WfBuild.Create('m', 'b', 123) 182
183 @mock.patch.object(build_util, 'DownloadBuildData')
184 def testGetBuildInfoBuildNotAvailable(self, mocked_fn):
185 master_name = 'm'
186 builder_name = 'b'
187 build_number = 123
188 build = WfBuild.Create(master_name, builder_name, build_number)
161 build.data = {} 189 build.data = {}
162 build.put() 190 build.put()
191 mocked_fn.return_value = build
163 192
164 self.assertEqual( 193 self.assertIsNone(
165 (None, None), 194 flake_result_pipeline._GetBuildInfo(
166 flake_result_pipeline._GetCommitPositionAndGitHash('m', 'b', 123)) 195 master_name, builder_name, build_number))
167
168 @mock.patch.object(flake_result_pipeline,
169 '_GetCommitPositionAndGitHash',
170 return_value=(12345, 'git_hash'))
171 def testNoGitHashForPreviousBuildNumberIfZero(self, _):
172 analysis = MasterFlakeAnalysis.Create(
173 self.master_name, self.builder_name, 0, self.step_name, self.test_name)
174 analysis.Save()
175
176 task = FlakeSwarmingTask.Create(
177 self.master_name, self.builder_name, 0, self.step_name, self.test_name)
178 task.put()
179
180 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs(
181 self.pipeline, self.master_name, self.builder_name, 0, self.step_name,
182 0, self.test_name, self.version_number)
183
184 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses(
185 self.pipeline, base_test._SAMPLE_FAILURE_LOG, *call_params)
186
187 self.assertIsNone(analysis.data_points[0].previous_build_commit_position)
188 self.assertIsNone(analysis.data_points[0].previous_build_git_hash)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698