| 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 from testing_utils import testing | 5 from testing_utils import testing |
| 6 | 6 |
| 7 from model import wf_analysis_status | 7 from model import wf_analysis_status |
| 8 from model.wf_analysis import WfAnalysis | 8 from model.wf_analysis import WfAnalysis |
| 9 from model.wf_try_job import WfTryJob | 9 from model.wf_try_job import WfTryJob |
| 10 from waterfall import try_job_util | 10 from waterfall import try_job_util |
| 11 from waterfall import waterfall_config | 11 from waterfall import waterfall_config |
| 12 from waterfall.try_job_type import TryJobType |
| 12 | 13 |
| 13 | 14 |
| 14 class _MockRootPipeline(object): | 15 class _MockRootPipeline(object): |
| 15 STARTED = False | 16 STARTED = False |
| 16 | 17 |
| 17 def __init__(self, *_): | 18 def __init__(self, *_): |
| 18 pass | 19 pass |
| 19 | 20 |
| 20 def start(self, *_, **__): | 21 def start(self, *_, **__): |
| 21 _MockRootPipeline.STARTED = True | 22 _MockRootPipeline.STARTED = True |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 } | 121 } |
| 121 | 122 |
| 122 self.mock( | 123 self.mock( |
| 123 try_job_util.try_job_pipeline, 'TryJobPipeline', _MockRootPipeline) | 124 try_job_util.try_job_pipeline, 'TryJobPipeline', _MockRootPipeline) |
| 124 _MockRootPipeline.STARTED = False | 125 _MockRootPipeline.STARTED = False |
| 125 | 126 |
| 126 try_job_util.ScheduleTryJobIfNeeded(failure_info) | 127 try_job_util.ScheduleTryJobIfNeeded(failure_info) |
| 127 | 128 |
| 128 self.assertFalse(_MockRootPipeline.STARTED) | 129 self.assertFalse(_MockRootPipeline.STARTED) |
| 129 | 130 |
| 130 def testNotNeedANewTryJobIfNotCompileFailure(self): | |
| 131 master_name = 'm' | |
| 132 builder_name = 'b' | |
| 133 build_number = 223 | |
| 134 failed_steps = { | |
| 135 'a': { | |
| 136 'current_failure': 223, | |
| 137 'first_failure': 223, | |
| 138 'last_pass': 222 | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 need_try_job, failure_result_map, last_pass = try_job_util._NeedANewTryJob( | |
| 143 master_name, builder_name, build_number, failed_steps) | |
| 144 | |
| 145 self.assertFalse(need_try_job) | |
| 146 self.assertEqual({}, failure_result_map) | |
| 147 self.assertIsNone(last_pass) | |
| 148 | |
| 149 def testNotNeedANewTryJobIfOneWithResultExists(self): | 131 def testNotNeedANewTryJobIfOneWithResultExists(self): |
| 150 master_name = 'm' | 132 master_name = 'm' |
| 151 builder_name = 'b' | 133 builder_name = 'b' |
| 152 build_number = 223 | 134 build_number = 223 |
| 153 failed_steps = { | 135 failed_steps = { |
| 154 'compile': { | 136 'compile': { |
| 155 'current_failure': 223, | 137 'current_failure': 223, |
| 156 'first_failure': 223, | 138 'first_failure': 223, |
| 157 'last_pass': 220 | 139 'last_pass': 220 |
| 158 } | 140 } |
| 159 } | 141 } |
| 160 | 142 |
| 161 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 143 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 162 try_job.compile_results = [['rev', 'failed']] | 144 try_job.compile_results = [['rev', 'failed']] |
| 163 try_job.status = wf_analysis_status.ANALYZED | 145 try_job.status = wf_analysis_status.ANALYZED |
| 164 try_job.put() | 146 try_job.put() |
| 165 | 147 |
| 166 need_try_job, failure_result_map, last_pass = try_job_util._NeedANewTryJob( | 148 failure_result_map = {} |
| 167 master_name, builder_name, build_number, failed_steps) | 149 need_try_job, last_pass, try_job_type, targeted_tests = ( |
| 150 try_job_util._NeedANewTryJob(master_name, builder_name, build_number, |
| 151 failed_steps, failure_result_map)) |
| 168 | 152 |
| 169 expected_failure_result_map = { | 153 expected_failure_result_map = { |
| 170 'compile': 'm/b/223' | 154 'compile': 'm/b/223' |
| 171 } | 155 } |
| 172 | 156 |
| 173 self.assertFalse(need_try_job) | 157 self.assertFalse(need_try_job) |
| 174 self.assertEqual(expected_failure_result_map, failure_result_map) | 158 self.assertEqual(expected_failure_result_map, failure_result_map) |
| 175 self.assertEqual(220, last_pass) | 159 self.assertEqual(220, last_pass) |
| 160 self.assertEqual(TryJobType.COMPILE, try_job_type) |
| 161 self.assertIsNone(targeted_tests) |
| 176 | 162 |
| 177 def testNeedANewTryJobIfExistingOneHasError(self): | 163 def testNeedANewTryJobIfExistingOneHasError(self): |
| 178 master_name = 'm' | 164 master_name = 'm' |
| 179 builder_name = 'b' | 165 builder_name = 'b' |
| 180 build_number = 223 | 166 build_number = 223 |
| 181 failed_steps = { | 167 failed_steps = { |
| 182 'compile': { | 168 'compile': { |
| 183 'current_failure': 223, | 169 'current_failure': 223, |
| 184 'first_failure': 223, | 170 'first_failure': 223, |
| 185 'last_pass': 220 | 171 'last_pass': 220 |
| 186 } | 172 } |
| 187 } | 173 } |
| 188 | 174 |
| 189 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 175 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 190 try_job.status = wf_analysis_status.ERROR | 176 try_job.status = wf_analysis_status.ERROR |
| 191 try_job.put() | 177 try_job.put() |
| 192 | 178 |
| 193 need_try_job, failure_result_map, last_pass = try_job_util._NeedANewTryJob( | 179 failure_result_map = {} |
| 194 master_name, builder_name, build_number, failed_steps) | 180 need_try_job, last_pass, try_job_type, targeted_tests = ( |
| 181 try_job_util._NeedANewTryJob(master_name, builder_name, build_number, |
| 182 failed_steps, failure_result_map)) |
| 195 | 183 |
| 196 expected_failure_result_map = { | 184 expected_failure_result_map = { |
| 197 'compile': 'm/b/223' | 185 'compile': 'm/b/223' |
| 198 } | 186 } |
| 199 self.assertTrue(need_try_job) | 187 self.assertTrue(need_try_job) |
| 200 self.assertEqual(expected_failure_result_map, failure_result_map) | 188 self.assertEqual(expected_failure_result_map, failure_result_map) |
| 201 self.assertEqual(220, last_pass) | 189 self.assertEqual(220, last_pass) |
| 190 self.assertEqual(TryJobType.COMPILE, try_job_type) |
| 191 self.assertIsNone(targeted_tests) |
| 202 | 192 |
| 203 def testNotNeedANewTryJobIfLastPassCannotDetermine(self): | 193 def testNotNeedANewTryJobIfLastPassCannotDetermine(self): |
| 204 master_name = 'm' | 194 master_name = 'm' |
| 205 builder_name = 'b' | 195 builder_name = 'b' |
| 206 build_number = 223 | 196 build_number = 223 |
| 207 failed_steps = { | 197 failed_steps = { |
| 208 'compile': { | 198 'compile': { |
| 209 'current_failure': 223, | 199 'current_failure': 223, |
| 210 'first_failure': 223 | 200 'first_failure': 223 |
| 211 } | 201 } |
| 212 } | 202 } |
| 213 | 203 |
| 214 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 204 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 215 try_job.status = wf_analysis_status.ERROR | 205 try_job.status = wf_analysis_status.ERROR |
| 216 try_job.put() | 206 try_job.put() |
| 217 | 207 |
| 218 need_try_job, failure_result_map, last_pass = try_job_util._NeedANewTryJob( | 208 failure_result_map = {} |
| 219 master_name, builder_name, build_number, failed_steps) | 209 need_try_job, last_pass, try_job_type, targeted_tests = ( |
| 210 try_job_util._NeedANewTryJob(master_name, builder_name, build_number, |
| 211 failed_steps, failure_result_map)) |
| 220 | 212 |
| 221 self.assertFalse(need_try_job) | 213 self.assertFalse(need_try_job) |
| 222 self.assertEqual({}, failure_result_map) | 214 self.assertEqual({}, failure_result_map) |
| 223 self.assertIsNone(last_pass) | 215 self.assertIsNone(last_pass) |
| 216 self.assertEqual(TryJobType.COMPILE, try_job_type) |
| 217 self.assertIsNone(targeted_tests) |
| 218 |
| 219 def testNeedANewTryJobIfTestFailureNonSwarming(self): |
| 220 master_name = 'm' |
| 221 builder_name = 'b' |
| 222 build_number = 223 |
| 223 failed_steps = { |
| 224 'a': { |
| 225 'current_failure': 223, |
| 226 'first_failure': 223, |
| 227 'last_pass': 222 |
| 228 }, |
| 229 'b': { |
| 230 'current_failure': 223, |
| 231 'first_failure': 222, |
| 232 'last_pass': 221 |
| 233 } |
| 234 } |
| 235 |
| 236 failure_result_map = {} |
| 237 need_try_job, last_pass, try_job_type, targeted_tests = ( |
| 238 try_job_util._NeedANewTryJob(master_name, builder_name, build_number, |
| 239 failed_steps, failure_result_map)) |
| 240 |
| 241 expected_failure_result_map = { |
| 242 'a': 'm/b/223', |
| 243 'b': 'm/b/222' |
| 244 } |
| 245 |
| 246 expected_targeted_tests = { |
| 247 'a': [] |
| 248 } |
| 249 |
| 250 self.assertTrue(need_try_job) |
| 251 self.assertEqual(expected_failure_result_map, failure_result_map) |
| 252 self.assertEqual(222, last_pass) |
| 253 self.assertEqual('test', try_job_type) |
| 254 self.assertEqual(expected_targeted_tests, targeted_tests) |
| 255 |
| 256 def testNeedANewTryJobIfTestFailureSwarming(self): |
| 257 master_name = 'm' |
| 258 builder_name = 'b' |
| 259 build_number = 223 |
| 260 failed_steps = { |
| 261 'a': { |
| 262 'current_failure': 223, |
| 263 'first_failure': 222, |
| 264 'last_pass': 221, |
| 265 'tests': { |
| 266 'a.t1': { |
| 267 'current_failure': 223, |
| 268 'first_failure': 223, |
| 269 'last_pass': 221 |
| 270 }, |
| 271 'a.t2': { |
| 272 'current_failure': 223, |
| 273 'first_failure': 222, |
| 274 'last_pass': 221 |
| 275 }, |
| 276 'a.t3': { |
| 277 'current_failure': 223, |
| 278 'first_failure': 223, |
| 279 'last_pass': 222 |
| 280 } |
| 281 } |
| 282 }, |
| 283 'b': { |
| 284 'current_failure': 223, |
| 285 'first_failure': 222, |
| 286 'last_pass': 221, |
| 287 'tests': { |
| 288 'b.t1': { |
| 289 'current_failure': 223, |
| 290 'first_failure': 222, |
| 291 'last_pass': 221 |
| 292 }, |
| 293 'b.t2': { |
| 294 'current_failure': 223, |
| 295 'first_failure': 222, |
| 296 'last_pass': 221 |
| 297 } |
| 298 } |
| 299 } |
| 300 } |
| 301 |
| 302 failure_result_map = {} |
| 303 need_try_job, last_pass, try_job_type, targeted_tests = ( |
| 304 try_job_util._NeedANewTryJob(master_name, builder_name, build_number, |
| 305 failed_steps, failure_result_map)) |
| 306 |
| 307 expected_failure_result_map = { |
| 308 'a': { |
| 309 'a.t1': 'm/b/223', |
| 310 'a.t2': 'm/b/222', |
| 311 'a.t3': 'm/b/223' |
| 312 }, |
| 313 'b': { |
| 314 'b.t1': 'm/b/222', |
| 315 'b.t2': 'm/b/222' |
| 316 }, |
| 317 } |
| 318 |
| 319 expected_targeted_tests = { |
| 320 'a': ['a.t1', 'a.t3'] |
| 321 } |
| 322 |
| 323 self.assertTrue(need_try_job) |
| 324 self.assertEqual(expected_failure_result_map, failure_result_map) |
| 325 self.assertEqual(221, last_pass) |
| 326 self.assertEqual('test', try_job_type) |
| 327 self.assertEqual(expected_targeted_tests, targeted_tests) |
| 224 | 328 |
| 225 def testNeedANewTryJob(self): | 329 def testNeedANewTryJob(self): |
| 226 master_name = 'm' | 330 master_name = 'm' |
| 227 builder_name = 'b' | 331 builder_name = 'b' |
| 228 build_number = 223 | 332 build_number = 223 |
| 229 failure_info = { | 333 failure_info = { |
| 230 'master_name': master_name, | 334 'master_name': master_name, |
| 231 'builder_name': builder_name, | 335 'builder_name': builder_name, |
| 232 'build_number': build_number, | 336 'build_number': build_number, |
| 233 'failed_steps': { | 337 'failed_steps': { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 'compile': { | 371 'compile': { |
| 268 'failed_targets': [ | 372 'failed_targets': [ |
| 269 {'target': 'a.exe'}, | 373 {'target': 'a.exe'}, |
| 270 {'source': 'b.cc', | 374 {'source': 'b.cc', |
| 271 'target': 'b.o'}] | 375 'target': 'b.o'}] |
| 272 } | 376 } |
| 273 } | 377 } |
| 274 | 378 |
| 275 self.assertEqual( | 379 self.assertEqual( |
| 276 try_job_util._GetFailedTargetsFromSignals(signals), ['a.exe']) | 380 try_job_util._GetFailedTargetsFromSignals(signals), ['a.exe']) |
| 277 | |
| OLD | NEW |