| 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.try_job_enums import TryJobType | 
| 10 from waterfall import try_job_util | 11 from waterfall import try_job_util | 
| 11 from waterfall import waterfall_config | 12 from waterfall import waterfall_config | 
| 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 | 
| (...skipping 100 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 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 | 381 | 
| OLD | NEW | 
|---|