| OLD | NEW |
| 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 | 6 |
| 7 from model import analysis_status | 7 from model import analysis_status |
| 8 from model.flake.flake_swarming_task import FlakeSwarmingTask | 8 from model.flake.flake_swarming_task import FlakeSwarmingTask |
| 9 from model.flake.master_flake_analysis import MasterFlakeAnalysis | 9 from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| 10 from waterfall import swarming_util | 10 from waterfall import swarming_util |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 'other_info': 'N/A' | 76 'other_info': 'N/A' |
| 77 }, | 77 }, |
| 78 { | 78 { |
| 79 'status': 'FAILURE', | 79 'status': 'FAILURE', |
| 80 'other_info': 'N/A' | 80 'other_info': 'N/A' |
| 81 } | 81 } |
| 82 ] | 82 ] |
| 83 } | 83 } |
| 84 ] | 84 ] |
| 85 } | 85 } |
| 86 _EXPECTED_TESTS_STATUESE = { | 86 _EXPECTED_TEST_STATUS = { |
| 87 'TestSuite1.test1': { | 87 'TestSuite1.test1': { |
| 88 'total_run': 2, | 88 'total_run': 2, |
| 89 'SUCCESS': 2 | 89 'SUCCESS': 2 |
| 90 }, | 90 }, |
| 91 'TestSuite1.test2': { | 91 'TestSuite1.test2': { |
| 92 'total_run': 4, | 92 'total_run': 4, |
| 93 'SUCCESS': 2, | 93 'SUCCESS': 2, |
| 94 'FAILURE': 2 | 94 'FAILURE': 2 |
| 95 }, | 95 }, |
| 96 'TestSuite1.test3': { | 96 'TestSuite1.test3': { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 return mocked_result | 130 return mocked_result |
| 131 | 131 |
| 132 def setUp(self): | 132 def setUp(self): |
| 133 super(ProcessFlakeSwarmingTaskResultPipelineTest, self).setUp() | 133 super(ProcessFlakeSwarmingTaskResultPipelineTest, self).setUp() |
| 134 self.pipeline = ProcessFlakeSwarmingTaskResultPipeline() | 134 self.pipeline = ProcessFlakeSwarmingTaskResultPipeline() |
| 135 self.master_name = 'm' | 135 self.master_name = 'm' |
| 136 self.builder_name = 'b' | 136 self.builder_name = 'b' |
| 137 self.build_number = 121 | 137 self.build_number = 121 |
| 138 self.step_name = 'abc_tests on platform' | 138 self.step_name = 'abc_tests on platform' |
| 139 self.test_name = 'TestSuite1.test1' | 139 self.test_name = 'TestSuite1.test1' |
| 140 self.version_number = 1 |
| 140 self.mock(swarming_util, 'GetSwarmingTaskResultById', | 141 self.mock(swarming_util, 'GetSwarmingTaskResultById', |
| 141 self._MockedGetSwarmingTaskResultById) | 142 self._MockedGetSwarmingTaskResultById) |
| 142 | 143 |
| 143 def testCheckTestsRunStatusesNoOutPutJson(self): | 144 def testCheckTestsRunStatusesNoOutPutJson(self): |
| 144 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs( | 145 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs( |
| 145 self.pipeline, self.master_name, self.builder_name, | 146 self.pipeline, self.master_name, self.builder_name, |
| 146 self.build_number, self.step_name, self.build_number, | 147 self.build_number, self.step_name, self.build_number, |
| 147 self.test_name) | 148 self.test_name, self.version_number) |
| 148 tests_statuses = ( | 149 tests_statuses = ( |
| 149 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses( | 150 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses( |
| 150 self.pipeline, None, *call_params | 151 self.pipeline, None, *call_params)) |
| 151 )) | |
| 152 self.assertEqual({}, tests_statuses) | 152 self.assertEqual({}, tests_statuses) |
| 153 | 153 |
| 154 def testCheckTestsRunStatuses(self): | 154 def testCheckTestsRunStatuses(self): |
| 155 analysis = MasterFlakeAnalysis.Create( | 155 analysis = MasterFlakeAnalysis.Create( |
| 156 self.master_name, self.builder_name, | 156 self.master_name, self.builder_name, |
| 157 self.build_number, self.step_name, self.test_name) | 157 self.build_number, self.step_name, self.test_name) |
| 158 analysis.put() | 158 analysis.Save() |
| 159 | 159 |
| 160 task = FlakeSwarmingTask.Create( | 160 task = FlakeSwarmingTask.Create( |
| 161 self.master_name, self.builder_name, | 161 self.master_name, self.builder_name, |
| 162 self.build_number, self.step_name, self.test_name) | 162 self.build_number, self.step_name, self.test_name) |
| 163 task.put() | 163 task.put() |
| 164 | 164 |
| 165 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs( | 165 call_params = ProcessFlakeSwarmingTaskResultPipeline._GetArgs( |
| 166 self.pipeline, self.master_name, self.builder_name, | 166 self.pipeline, self.master_name, self.builder_name, |
| 167 self.build_number, self.step_name, self.build_number, | 167 self.build_number, self.step_name, self.build_number, |
| 168 self.test_name) | 168 self.test_name, self.version_number) |
| 169 | 169 |
| 170 tests_statuses = ( | 170 tests_statuses = ( |
| 171 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses( | 171 ProcessFlakeSwarmingTaskResultPipeline._CheckTestsRunStatuses( |
| 172 self.pipeline, | 172 self.pipeline, |
| 173 _SAMPLE_FAILURE_LOG, *call_params)) | 173 _SAMPLE_FAILURE_LOG, *call_params)) |
| 174 self.assertEqual(_EXPECTED_TESTS_STATUESE, tests_statuses) | 174 self.assertEqual(_EXPECTED_TEST_STATUS, tests_statuses) |
| 175 | 175 |
| 176 def testCheckTestsRunStatusesWhenTestNotExist(self): | 176 def testCheckTestsRunStatusesWhenTestDoesNotExist(self): |
| 177 test_name = 'TestSuite1.new_test' | 177 test_name = 'TestSuite1.new_test' |
| 178 analysis = MasterFlakeAnalysis.Create( | 178 analysis = MasterFlakeAnalysis.Create( |
| 179 self.master_name, self.builder_name, | 179 self.master_name, self.builder_name, |
| 180 self.build_number, self.step_name, test_name) | 180 self.build_number, self.step_name, test_name) |
| 181 analysis.put() | 181 analysis.Save() |
| 182 | 182 |
| 183 task = FlakeSwarmingTask.Create( | 183 task = FlakeSwarmingTask.Create( |
| 184 self.master_name, self.builder_name, | 184 self.master_name, self.builder_name, |
| 185 self.build_number, self.step_name, test_name) | 185 self.build_number, self.step_name, test_name) |
| 186 task.put() | 186 task.put() |
| 187 | 187 |
| 188 pipeline = ProcessFlakeSwarmingTaskResultPipeline() | 188 pipeline = ProcessFlakeSwarmingTaskResultPipeline() |
| 189 tests_statuses = pipeline._CheckTestsRunStatuses( | 189 tests_statuses = pipeline._CheckTestsRunStatuses( |
| 190 _SAMPLE_FAILURE_LOG, self.master_name, self.builder_name, | 190 _SAMPLE_FAILURE_LOG, self.master_name, self.builder_name, |
| 191 self.build_number, self.step_name, self.build_number, test_name) | 191 self.build_number, self.step_name, self.build_number, test_name, |
| 192 self.version_number) |
| 192 | 193 |
| 193 self.assertEqual(_EXPECTED_TESTS_STATUESE, tests_statuses) | 194 self.assertEqual(_EXPECTED_TEST_STATUS, tests_statuses) |
| 194 | 195 |
| 195 task = FlakeSwarmingTask.Get( | 196 task = FlakeSwarmingTask.Get( |
| 196 self.master_name, self.builder_name, | 197 self.master_name, self.builder_name, |
| 197 self.build_number, self.step_name, test_name) | 198 self.build_number, self.step_name, test_name) |
| 198 self.assertEqual(0, task.tries) | 199 self.assertEqual(0, task.tries) |
| 199 self.assertEqual(0, task.successes) | 200 self.assertEqual(0, task.successes) |
| 200 | 201 |
| 201 analysis = MasterFlakeAnalysis.Get( | 202 analysis = MasterFlakeAnalysis.GetVersion( |
| 202 self.master_name, self.builder_name, | 203 self.master_name, self.builder_name, |
| 203 self.build_number, self.step_name, test_name) | 204 self.build_number, self.step_name, test_name, self.version_number) |
| 204 self.assertTrue(analysis.success_rates[-1] < 0) | 205 self.assertTrue(analysis.data_points[-1].pass_rate < 0) |
| 205 | 206 |
| 206 def _MockedGetSwarmingTaskFailureLog(self, *_): | 207 def _MockedGetSwarmingTaskFailureLog(self, *_): |
| 207 return _SAMPLE_FAILURE_LOG | 208 return _SAMPLE_FAILURE_LOG |
| 208 | 209 |
| 209 def testProcessFlakeSwarmingTaskResultPipeline(self): | 210 def testProcessFlakeSwarmingTaskResultPipeline(self): |
| 210 | 211 |
| 211 self.mock(swarming_util, 'GetSwarmingTaskFailureLog', | 212 self.mock(swarming_util, 'GetSwarmingTaskFailureLog', |
| 212 self._MockedGetSwarmingTaskFailureLog) | 213 self._MockedGetSwarmingTaskFailureLog) |
| 213 | 214 |
| 214 task = FlakeSwarmingTask.Create( | 215 task = FlakeSwarmingTask.Create( |
| 215 self.master_name, self.builder_name, | 216 self.master_name, self.builder_name, |
| 216 self.build_number, self.step_name, self.test_name) | 217 self.build_number, self.step_name, self.test_name) |
| 217 task.task_id = 'task_id1' | 218 task.task_id = 'task_id1' |
| 218 task.put() | 219 task.put() |
| 219 | 220 |
| 220 analysis = MasterFlakeAnalysis.Create( | 221 analysis = MasterFlakeAnalysis.Create( |
| 221 self.master_name, self.builder_name, | 222 self.master_name, self.builder_name, |
| 222 self.build_number, self.step_name, self.test_name) | 223 self.build_number, self.step_name, self.test_name) |
| 223 analysis.put() | 224 analysis.Save() |
| 224 | 225 |
| 225 pipeline = ProcessFlakeSwarmingTaskResultPipeline() | 226 pipeline = ProcessFlakeSwarmingTaskResultPipeline() |
| 226 step_name, task_info = pipeline.run( | 227 step_name, task_info = pipeline.run( |
| 227 self.master_name, self.builder_name, | 228 self.master_name, self.builder_name, |
| 228 self.build_number, self.step_name, | 229 self.build_number, self.step_name, |
| 229 'task_id1', self.build_number, self.test_name) | 230 'task_id1', self.build_number, self.test_name, |
| 231 analysis.version_number) |
| 230 self.assertEqual('abc_tests', task_info) | 232 self.assertEqual('abc_tests', task_info) |
| 231 self.assertEqual(self.step_name, step_name) | 233 self.assertEqual(self.step_name, step_name) |
| 232 | 234 |
| 233 task = FlakeSwarmingTask.Get( | 235 task = FlakeSwarmingTask.Get( |
| 234 self.master_name, self.builder_name, self.build_number, | 236 self.master_name, self.builder_name, self.build_number, |
| 235 self.step_name, self.test_name) | 237 self.step_name, self.test_name) |
| 236 | 238 |
| 237 self.assertEqual(analysis_status.COMPLETED, task.status) | 239 self.assertEqual(analysis_status.COMPLETED, task.status) |
| 238 self.assertEqual(_EXPECTED_TESTS_STATUESE, task.tests_statuses) | 240 self.assertEqual(_EXPECTED_TEST_STATUS, task.tests_statuses) |
| 239 | 241 |
| 240 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220), | 242 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 6, 538220), |
| 241 task.created_time) | 243 task.created_time) |
| 242 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550), | 244 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 32, 9, 90550), |
| 243 task.started_time) | 245 task.started_time) |
| 244 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9), | 246 self.assertEqual(datetime.datetime(2016, 2, 10, 18, 33, 9), |
| 245 task.completed_time) | 247 task.completed_time) |
| 246 | 248 |
| 247 def testProcessFlakeSwarmingTaskResultPipelineTaskNotRunning(self): | 249 def testProcessFlakeSwarmingTaskResultPipelineTaskNotRunning(self): |
| 248 task = FlakeSwarmingTask.Create( | 250 task = FlakeSwarmingTask.Create( |
| 249 self.master_name, self.builder_name, | 251 self.master_name, self.builder_name, |
| 250 self.build_number, self.step_name, self.test_name) | 252 self.build_number, self.step_name, self.test_name) |
| 251 task.task_id = 'task_id2' | 253 task.task_id = 'task_id2' |
| 252 task.put() | 254 task.put() |
| 253 | 255 |
| 254 analysis = MasterFlakeAnalysis.Create( | 256 analysis = MasterFlakeAnalysis.Create( |
| 255 self.master_name, self.builder_name, | 257 self.master_name, self.builder_name, |
| 256 self.build_number, self.step_name, self.test_name) | 258 self.build_number, self.step_name, self.test_name) |
| 257 analysis.put() | 259 analysis.Save() |
| 258 | 260 |
| 259 pipeline = ProcessFlakeSwarmingTaskResultPipeline() | 261 pipeline = ProcessFlakeSwarmingTaskResultPipeline() |
| 260 step_name, task_info = pipeline.run( | 262 step_name, task_info = pipeline.run( |
| 261 self.master_name, self.builder_name, | 263 self.master_name, self.builder_name, self.build_number, self.step_name, |
| 262 self.build_number, self.step_name, | 264 'task_id2', self.build_number, self.test_name, analysis.version_number) |
| 263 'task_id2', self.build_number, self.test_name) | |
| 264 self.assertEqual(None, task_info) | 265 self.assertEqual(None, task_info) |
| 265 self.assertEqual(self.step_name, step_name) | 266 self.assertEqual(self.step_name, step_name) |
| 266 | 267 |
| 267 task = FlakeSwarmingTask.Get( | 268 task = FlakeSwarmingTask.Get( |
| 268 self.master_name, self.builder_name, | 269 self.master_name, self.builder_name, self.build_number, self.step_name, |
| 269 self.build_number, self.step_name, self.test_name) | 270 self.test_name) |
| 270 | 271 |
| 271 self.assertEqual(analysis_status.ERROR, task.status) | 272 self.assertEqual(analysis_status.ERROR, task.status) |
| 272 | 273 |
| 273 def testProcessFlakeSwarmingTaskResultPipelineTaskTimeOut(self): | 274 def testProcessFlakeSwarmingTaskResultPipelineTaskTimeOut(self): |
| 274 # Override swarming config settings to force a timeout. | 275 # Override swarming config settings to force a timeout. |
| 275 override_swarming_settings = { | 276 override_swarming_settings = { |
| 276 'task_timeout_hours': -1 | 277 'task_timeout_hours': -1 |
| 277 } | 278 } |
| 278 self.UpdateUnitTestConfigSettings( | 279 self.UpdateUnitTestConfigSettings( |
| 279 'swarming_settings', override_swarming_settings) | 280 'swarming_settings', override_swarming_settings) |
| 280 | 281 |
| 281 task = FlakeSwarmingTask.Create( | 282 task = FlakeSwarmingTask.Create( |
| 282 self.master_name, self.builder_name, | 283 self.master_name, self.builder_name, self.build_number, self.step_name, |
| 283 self.build_number, self.step_name, self.test_name) | 284 self.test_name) |
| 284 task.task_id = 'task_id1' | 285 task.task_id = 'task_id1' |
| 285 task.put() | 286 task.put() |
| 286 | 287 |
| 287 pipeline = ProcessFlakeSwarmingTaskResultPipeline() | 288 pipeline = ProcessFlakeSwarmingTaskResultPipeline() |
| 288 step_name, task_info = pipeline.run( | 289 step_name, task_info = pipeline.run( |
| 289 self.master_name, self.builder_name, | 290 self.master_name, self.builder_name, self.build_number, self.step_name, |
| 290 self.build_number, self.step_name, | 291 'task_id1', self.build_number, self.test_name, self.version_number) |
| 291 'task_id1', self.build_number, self.test_name) | |
| 292 self.assertEqual('abc_tests', task_info) | 292 self.assertEqual('abc_tests', task_info) |
| 293 self.assertEqual(self.step_name, step_name) | 293 self.assertEqual(self.step_name, step_name) |
| 294 | 294 |
| 295 task = FlakeSwarmingTask.Get( | 295 task = FlakeSwarmingTask.Get( |
| 296 self.master_name, self.builder_name, self.build_number, | 296 self.master_name, self.builder_name, self.build_number, self.step_name, |
| 297 self.step_name, self.test_name) | 297 self.test_name) |
| 298 self.assertEqual(analysis_status.ERROR, task.status) | 298 self.assertEqual(analysis_status.ERROR, task.status) |
| 299 self.assertEqual({}, task.tests_statuses) | 299 self.assertEqual({}, task.tests_statuses) |
| OLD | NEW |