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