| 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 import json |
| 5 import webapp2 | 5 import webapp2 |
| 6 | 6 |
| 7 from testing_utils import testing | 7 from testing_utils import testing |
| 8 | 8 |
| 9 from handlers import try_job_result | 9 from handlers import try_job_result |
| 10 from model.wf_analysis import WfAnalysis | 10 from model.wf_analysis import WfAnalysis |
| 11 from model import wf_analysis_status | 11 from model import wf_analysis_status |
| 12 from model.wf_try_job import WfTryJob | 12 from model.wf_try_job import WfTryJob |
| 13 from waterfall import buildbot | 13 from waterfall import buildbot |
| 14 | 14 |
| 15 | 15 |
| 16 class TryJobResultTest(testing.AppengineTestCase): | 16 class TryJobResultTest(testing.AppengineTestCase): |
| 17 app_module = webapp2.WSGIApplication([ | 17 app_module = webapp2.WSGIApplication([ |
| 18 ('/try-job-result', try_job_result.TryJobResult), ], debug=True) | 18 ('/try-job-result', try_job_result.TryJobResult),], debug=True) |
| 19 | 19 |
| 20 def setUp(self): | 20 def setUp(self): |
| 21 super(TryJobResultTest, self).setUp() | 21 super(TryJobResultTest, self).setUp() |
| 22 self.master_name = 'm' | 22 self.master_name = 'm' |
| 23 self.builder_name = 'b' | 23 self.builder_name = 'b' |
| 24 self.build_number = 121 | 24 self.build_number = 121 |
| 25 self.mock_current_user(user_email='test@chromium.org', is_admin=True) | 25 self.mock_current_user(user_email='test@chromium.org', is_admin=True) |
| 26 | 26 |
| 27 def testGetTryJobResultReturnNoneIfNoFailureResultMap(self): | 27 def testGetTryJobResultReturnNoneIfNoFailureResultMap(self): |
| 28 analysis = WfAnalysis.Create( | 28 analysis = WfAnalysis.Create( |
| 29 self.master_name, self.builder_name, self.build_number) | 29 self.master_name, self.builder_name, self.build_number) |
| 30 analysis.put() | 30 analysis.put() |
| 31 | 31 |
| 32 result = try_job_result._GetTryJobResult( | 32 result = try_job_result._GetAllTryJobResults( |
| 33 self.master_name, self.builder_name, self.build_number) | 33 self.master_name, self.builder_name, self.build_number) |
| 34 | 34 |
| 35 self.assertEqual({}, result) | 35 self.assertEqual({}, result) |
| 36 | |
| 37 def testGetTryJobResultReturnNoneIfNoCompileFailure(self): | |
| 38 analysis = WfAnalysis.Create( | |
| 39 self.master_name, self.builder_name, self.build_number) | |
| 40 analysis.failure_result_map = { | |
| 41 'browser_tests': 'm/b/121' | |
| 42 } | |
| 43 analysis.put() | |
| 44 | |
| 45 result = try_job_result._GetTryJobResult( | |
| 46 self.master_name, self.builder_name, self.build_number) | |
| 47 | |
| 48 self.assertEqual({}, result) | |
| 49 | 36 |
| 50 def testGetTryJobResultReturnNoneIfNoTryJob(self): | 37 def testGetTryJobResultReturnNoneIfNoTryJob(self): |
| 51 analysis = WfAnalysis.Create( | 38 analysis = WfAnalysis.Create( |
| 52 self.master_name, self.builder_name, self.build_number) | 39 self.master_name, self.builder_name, self.build_number) |
| 53 analysis.failure_result_map = { | 40 analysis.failure_result_map = { |
| 54 'compile': 'm/b/121' | 41 'compile': 'm/b/121' |
| 55 } | 42 } |
| 56 analysis.put() | 43 analysis.put() |
| 57 | 44 |
| 58 result = try_job_result._GetTryJobResult( | 45 result = try_job_result._GetAllTryJobResults( |
| 59 self.master_name, self.builder_name, self.build_number) | 46 self.master_name, self.builder_name, self.build_number) |
| 60 | 47 |
| 61 self.assertEqual({}, result) | 48 expected_result = { |
| 49 'compile': { |
| 50 'step': 'compile', |
| 51 'test': 'N/A', |
| 52 'try_job_key': 'm/b/121' |
| 53 } |
| 54 } |
| 62 | 55 |
| 56 self.assertEqual(expected_result, result) |
| 63 | 57 |
| 64 def testGetTryJobResultOnlyReturnStatusIfPending(self): | 58 def testGetTryJobResultOnlyReturnStatusIfPending(self): |
| 65 analysis = WfAnalysis.Create( | 59 analysis = WfAnalysis.Create( |
| 66 self.master_name, self.builder_name, self.build_number) | 60 self.master_name, self.builder_name, self.build_number) |
| 67 analysis.failure_result_map = { | 61 analysis.failure_result_map = { |
| 68 'compile': 'm/b/121' | 62 'compile': 'm/b/121' |
| 69 } | 63 } |
| 70 analysis.put() | 64 analysis.put() |
| 71 | 65 |
| 72 try_job = WfTryJob.Create( | 66 try_job = WfTryJob.Create( |
| 73 self.master_name, self.builder_name, self.build_number) | 67 self.master_name, self.builder_name, self.build_number) |
| 74 try_job.put() | 68 try_job.put() |
| 75 | 69 |
| 76 result = try_job_result._GetTryJobResult( | 70 result = try_job_result._GetAllTryJobResults( |
| 77 self.master_name, self.builder_name, self.build_number) | 71 self.master_name, self.builder_name, self.build_number) |
| 78 | 72 |
| 79 expected_result = { | 73 expected_result = { |
| 80 'status': 'Pending' | 74 'compile': { |
| 75 'step': 'compile', |
| 76 'test': 'N/A', |
| 77 'try_job_key': 'm/b/121', |
| 78 'status': 'Pending' |
| 79 } |
| 81 } | 80 } |
| 82 | 81 |
| 83 self.assertEqual(expected_result, result) | 82 self.assertEqual(expected_result, result) |
| 84 | 83 |
| 85 def testGetTryJobResultOnlyReturnUrlIfStarts(self): | 84 def testGetTryJobResultOnlyReturnUrlIfStarts(self): |
| 86 analysis = WfAnalysis.Create( | 85 analysis = WfAnalysis.Create( |
| 87 self.master_name, self.builder_name, self.build_number) | 86 self.master_name, self.builder_name, self.build_number) |
| 88 analysis.failure_result_map = { | 87 analysis.failure_result_map = { |
| 89 'compile': 'm/b/121' | 88 'compile': 'm/b/121' |
| 90 } | 89 } |
| 91 analysis.put() | 90 analysis.put() |
| 92 | 91 |
| 93 try_job = WfTryJob.Create( | 92 try_job = WfTryJob.Create( |
| 94 self.master_name, self.builder_name, self.build_number) | 93 self.master_name, self.builder_name, self.build_number) |
| 95 try_job.status = wf_analysis_status.ANALYZING | 94 try_job.status = wf_analysis_status.ANALYZING |
| 96 try_job.compile_results = [ | 95 try_job.compile_results = [ |
| 97 { | 96 { |
| 98 'result': None, | 97 'result': None, |
| 99 'url': 'url' | 98 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' |
| 99 'builders/linux_chromium_variable/builds/121') |
| 100 } | 100 } |
| 101 ] | 101 ] |
| 102 try_job.put() | 102 try_job.put() |
| 103 | 103 |
| 104 result = try_job_result._GetTryJobResult( | 104 result = try_job_result._GetAllTryJobResults( |
| 105 self.master_name, self.builder_name, self.build_number) | 105 self.master_name, self.builder_name, self.build_number) |
| 106 | 106 |
| 107 expected_result = { | 107 expected_result = { |
| 108 'status': 'Analyzing', | 108 'compile': { |
| 109 'try_job_url': 'url' | 109 'step': 'compile', |
| 110 'test': 'N/A', |
| 111 'try_job_key': 'm/b/121', |
| 112 'status': 'Running', |
| 113 'try_job_build_number': 121, |
| 114 'try_job_url': ('http://build.chromium.org/p/tryserver.chromium.' |
| 115 'linux/builders/linux_chromium_variable/builds/121') |
| 116 } |
| 110 } | 117 } |
| 111 | |
| 112 self.assertEqual(expected_result, result) | 118 self.assertEqual(expected_result, result) |
| 113 | 119 |
| 114 def testGetTryJobResultOnlyReturnStatusIfError(self): | 120 def testGetTryJobResultOnlyReturnStatusIfError(self): |
| 115 analysis = WfAnalysis.Create( | 121 analysis = WfAnalysis.Create( |
| 116 self.master_name, self.builder_name, self.build_number) | 122 self.master_name, self.builder_name, self.build_number) |
| 117 analysis.failure_result_map = { | 123 analysis.failure_result_map = { |
| 118 'compile': 'm/b/121' | 124 'compile': 'm/b/121' |
| 119 } | 125 } |
| 120 analysis.put() | 126 analysis.put() |
| 121 | 127 |
| 122 try_job = WfTryJob.Create( | 128 try_job = WfTryJob.Create( |
| 123 self.master_name, self.builder_name, self.build_number) | 129 self.master_name, self.builder_name, self.build_number) |
| 124 try_job.status = wf_analysis_status.ERROR | 130 try_job.status = wf_analysis_status.ERROR |
| 125 try_job.compile_results = [ | 131 try_job.compile_results = [ |
| 126 { | 132 { |
| 127 'try_job_id': '1' | 133 'try_job_id': '1' |
| 128 } | 134 } |
| 129 ] | 135 ] |
| 130 try_job.put() | 136 try_job.put() |
| 131 | 137 |
| 132 result = try_job_result._GetTryJobResult( | 138 result = try_job_result._GetAllTryJobResults( |
| 133 self.master_name, self.builder_name, self.build_number) | 139 self.master_name, self.builder_name, self.build_number) |
| 134 | 140 |
| 135 expected_result = { | 141 expected_result = { |
| 136 'status': 'Error' | 142 'compile': { |
| 143 'step': 'compile', |
| 144 'test': 'N/A', |
| 145 'try_job_key': 'm/b/121', |
| 146 'status': 'Error' |
| 147 } |
| 137 } | 148 } |
| 138 | 149 |
| 139 self.assertEqual(expected_result, result) | 150 self.assertEqual(expected_result, result) |
| 140 | 151 |
| 141 def testGetTryJobResultWhenTryJobCompleted(self): | 152 def testGetTryJobResultWhenTryJobCompleted(self): |
| 142 analysis = WfAnalysis.Create( | 153 analysis = WfAnalysis.Create( |
| 143 self.master_name, self.builder_name, self.build_number) | 154 self.master_name, self.builder_name, self.build_number) |
| 144 analysis.failure_result_map = { | 155 analysis.failure_result_map = { |
| 145 'compile': 'm/b/121' | 156 'compile': 'm/b/121' |
| 146 } | 157 } |
| 147 analysis.put() | 158 analysis.put() |
| 148 | 159 |
| 149 try_job = WfTryJob.Create( | 160 try_job = WfTryJob.Create( |
| 150 self.master_name, self.builder_name, self.build_number) | 161 self.master_name, self.builder_name, self.build_number) |
| 151 try_job.status = wf_analysis_status.ANALYZED | 162 try_job.status = wf_analysis_status.ANALYZED |
| 152 try_job.compile_results = [ | 163 try_job.compile_results = [ |
| 153 { | 164 { |
| 154 'result': [ | 165 'result': [ |
| 155 ['rev1', 'passed'], | 166 ['rev1', 'passed'], |
| 156 ['rev2', 'failed'] | 167 ['rev2', 'failed'] |
| 157 ], | 168 ], |
| 158 'url': 'url', | 169 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' |
| 170 'builders/linux_chromium_variable/builds/121'), |
| 159 'try_job_id': '1', | 171 'try_job_id': '1', |
| 160 'culprit': { | 172 'culprit': { |
| 161 'revision': 'rev2', | 173 'compile': { |
| 162 'commit_position': '2', | 174 'revision': 'rev2', |
| 163 'review_url': 'url_2' | 175 'commit_position': '2', |
| 176 'review_url': 'url_2' |
| 177 } |
| 164 } | 178 } |
| 165 } | 179 } |
| 166 ] | 180 ] |
| 167 try_job.put() | 181 try_job.put() |
| 168 | 182 |
| 169 result = try_job_result._GetTryJobResult( | 183 result = try_job_result._GetAllTryJobResults( |
| 170 self.master_name, self.builder_name, self.build_number) | 184 self.master_name, self.builder_name, self.build_number) |
| 171 | 185 |
| 172 expected_result = { | 186 expected_result = { |
| 173 'status': 'Analyzed', | 187 'compile': { |
| 174 'try_job_url': 'url', | 188 'step': 'compile', |
| 175 'revision': 'rev2', | 189 'test': 'N/A', |
| 176 'commit_position': '2', | 190 'try_job_key': 'm/b/121', |
| 177 'review_url': 'url_2' | 191 'try_job_build_number': 121, |
| 192 'status': 'Completed', |
| 193 'try_job_url': ( |
| 194 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 195 'builders/linux_chromium_variable/builds/121'), |
| 196 'revision': 'rev2', |
| 197 'commit_position': '2', |
| 198 'review_url': 'url_2' |
| 199 } |
| 178 } | 200 } |
| 179 | 201 |
| 180 self.assertEqual(expected_result, result) | 202 self.assertEqual(expected_result, result) |
| 181 | 203 |
| 182 def testGetTryJobResultWhenTryJobCompletedAllPassed(self): | 204 def testGetTryJobResultWhenTryJobCompletedAllPassed(self): |
| 183 analysis = WfAnalysis.Create( | 205 analysis = WfAnalysis.Create( |
| 184 self.master_name, self.builder_name, self.build_number) | 206 self.master_name, self.builder_name, self.build_number) |
| 185 analysis.failure_result_map = { | 207 analysis.failure_result_map = { |
| 186 'compile': 'm/b/121' | 208 'compile': 'm/b/121' |
| 187 } | 209 } |
| 188 analysis.put() | 210 analysis.put() |
| 189 | 211 |
| 190 try_job = WfTryJob.Create( | 212 try_job = WfTryJob.Create( |
| 191 self.master_name, self.builder_name, self.build_number) | 213 self.master_name, self.builder_name, self.build_number) |
| 192 try_job.status = wf_analysis_status.ANALYZED | 214 try_job.status = wf_analysis_status.ANALYZED |
| 193 try_job.compile_results = [ | 215 try_job.compile_results = [ |
| 194 { | 216 { |
| 195 'result': [ | 217 'result': [ |
| 196 ['rev1', 'passed'], | 218 ['rev1', 'passed'], |
| 197 ['rev2', 'passed'] | 219 ['rev2', 'passed'] |
| 198 ], | 220 ], |
| 199 'url': 'url' | 221 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' |
| 222 'builders/linux_chromium_variable/builds/121') |
| 200 } | 223 } |
| 201 ] | 224 ] |
| 202 try_job.put() | 225 try_job.put() |
| 203 | 226 |
| 204 result = try_job_result._GetTryJobResult( | 227 result = try_job_result._GetAllTryJobResults( |
| 205 self.master_name, self.builder_name, self.build_number) | 228 self.master_name, self.builder_name, self.build_number) |
| 206 | 229 |
| 207 expected_result = { | 230 expected_result = { |
| 208 'status': 'Analyzed', | 231 'compile': { |
| 209 'try_job_url': 'url' | 232 'step': 'compile', |
| 233 'test': 'N/A', |
| 234 'try_job_key': 'm/b/121', |
| 235 'try_job_build_number': 121, |
| 236 'status': 'Completed', |
| 237 'try_job_url': ( |
| 238 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 239 'builders/linux_chromium_variable/builds/121') |
| 240 } |
| 210 } | 241 } |
| 211 | 242 |
| 212 self.assertEqual(expected_result, result) | 243 self.assertEqual(expected_result, result) |
| 213 | 244 |
| 214 def testTryJobResultHandler(self): | 245 def testTryJobResultHandler(self): |
| 215 build_url = buildbot.CreateBuildUrl( | 246 build_url = buildbot.CreateBuildUrl( |
| 216 self.master_name, self.builder_name, self.build_number) | 247 self.master_name, self.builder_name, self.build_number) |
| 217 response = self.test_app.get('/try-job-result', params={'url': build_url}) | 248 response = self.test_app.get('/try-job-result', params={'url': build_url}) |
| 218 expected_results = {} | 249 expected_results = {} |
| 219 | 250 |
| 220 self.assertEqual(200, response.status_int) | 251 self.assertEqual(200, response.status_int) |
| 221 self.assertEqual(expected_results, response.json_body) | 252 self.assertEqual(expected_results, response.json_body) |
| 253 |
| 254 def testGetTryJobResultWhenTryJobForTestCompleted(self): |
| 255 analysis = WfAnalysis.Create( |
| 256 self.master_name, self.builder_name, self.build_number) |
| 257 analysis.failure_result_map = { |
| 258 'a_test': { |
| 259 'a_test1': 'm/b/121', |
| 260 'a_test2': 'm/b/121', |
| 261 'a_test3': 'm/b/120' |
| 262 }, |
| 263 'b_test': { |
| 264 'b_test1': 'm/b/121' |
| 265 }, |
| 266 'c_test': 'm/b/121', |
| 267 'd_test': 'm/b/122' |
| 268 } |
| 269 analysis.put() |
| 270 |
| 271 try_job_120 = WfTryJob.Create( |
| 272 self.master_name, self.builder_name, 120) |
| 273 try_job_120.status = wf_analysis_status.ANALYZED |
| 274 try_job_120.test_results = [ |
| 275 { |
| 276 'result': { |
| 277 'rev0': { |
| 278 'a_test': { |
| 279 'status': 'failed', |
| 280 'valid': True, |
| 281 'failures': ['a_test3'] |
| 282 } |
| 283 } |
| 284 }, |
| 285 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' |
| 286 'builders/linux_chromium_variable/builds/120'), |
| 287 'try_job_id': '0', |
| 288 'culprit': { |
| 289 'a_test': { |
| 290 'tests': { |
| 291 'a_test3': { |
| 292 'revision': 'rev0', |
| 293 'commit_position': '0', |
| 294 'review_url': 'url_0' |
| 295 } |
| 296 } |
| 297 } |
| 298 } |
| 299 } |
| 300 ] |
| 301 try_job_120.put() |
| 302 |
| 303 try_job_121 = WfTryJob.Create( |
| 304 self.master_name, self.builder_name, self.build_number) |
| 305 try_job_121.status = wf_analysis_status.ANALYZED |
| 306 try_job_121.test_results = [ |
| 307 { |
| 308 'result': { |
| 309 'rev1': { |
| 310 'a_test': { |
| 311 'status': 'failed', |
| 312 'valid': True, |
| 313 'failures': ['a_test1'] |
| 314 }, |
| 315 'b_test': { |
| 316 'status': 'failed', |
| 317 'valid': True, |
| 318 'failures': ['b_test1'] |
| 319 }, |
| 320 'c_test': { |
| 321 'status': 'passed', |
| 322 'valid': True |
| 323 } |
| 324 }, |
| 325 'rev2': { |
| 326 'a_test': { |
| 327 'status': 'failed', |
| 328 'valid': True, |
| 329 'failures': ['a_test1'] |
| 330 }, |
| 331 'b_test': { |
| 332 'status': 'passed', |
| 333 'valid': True |
| 334 }, |
| 335 'c_test': { |
| 336 'status': 'failed', |
| 337 'valid': True, |
| 338 'failures': [] |
| 339 } |
| 340 } |
| 341 }, |
| 342 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' |
| 343 'builders/linux_chromium_variable/builds/121'), |
| 344 'try_job_id': '1', |
| 345 'culprit': { |
| 346 'a_test': { |
| 347 'tests': { |
| 348 'a_test1': { |
| 349 'revision': 'rev1', |
| 350 'commit_position': '1', |
| 351 'review_url': 'url_1' |
| 352 } |
| 353 } |
| 354 }, |
| 355 'b_test': { |
| 356 'tests': { |
| 357 'b_test1': { |
| 358 'revision': 'rev1', |
| 359 'commit_position': '1', |
| 360 'review_url': 'url_1' |
| 361 } |
| 362 } |
| 363 }, |
| 364 'c_test': { |
| 365 'revision': 'rev2', |
| 366 'commit_position': '2', |
| 367 'review_url': 'url_2', |
| 368 'tests': {} |
| 369 } |
| 370 } |
| 371 } |
| 372 ] |
| 373 try_job_121.put() |
| 374 |
| 375 try_job_122 = WfTryJob.Create( |
| 376 self.master_name, self.builder_name, 122) |
| 377 try_job_122.status = wf_analysis_status.ANALYZED |
| 378 try_job_122.test_results = [ |
| 379 { |
| 380 'result': { |
| 381 'rev3': { |
| 382 'd_test': { |
| 383 'status': 'passed', |
| 384 'valid': True, |
| 385 'failures': [] |
| 386 } |
| 387 } |
| 388 }, |
| 389 'url': ('http://build.chromium.org/p/tryserver.chromium.linux/' |
| 390 'builders/linux_chromium_variable/builds/122'), |
| 391 'try_job_id': '2' |
| 392 } |
| 393 ] |
| 394 try_job_122.put() |
| 395 |
| 396 result = try_job_result._GetAllTryJobResults( |
| 397 self.master_name, self.builder_name, self.build_number) |
| 398 |
| 399 expected_result = { |
| 400 'a_test-a_test1': { |
| 401 'step': 'a_test', |
| 402 'test': 'a_test1', |
| 403 'try_job_key': 'm/b/121', |
| 404 'try_job_build_number': 121, |
| 405 'status': 'Completed', |
| 406 'try_job_url': ( |
| 407 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 408 'builders/linux_chromium_variable/builds/121'), |
| 409 'revision': 'rev1', |
| 410 'commit_position': '1', |
| 411 'review_url': 'url_1' |
| 412 }, |
| 413 'a_test-a_test2': { |
| 414 'step': 'a_test', |
| 415 'test': 'a_test2', |
| 416 'try_job_key': 'm/b/121', |
| 417 'status': 'Completed', |
| 418 'try_job_build_number': 121, |
| 419 'try_job_url': ( |
| 420 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 421 'builders/linux_chromium_variable/builds/121'), |
| 422 }, |
| 423 'a_test-a_test3': { |
| 424 'step': 'a_test', |
| 425 'test': 'a_test3', |
| 426 'try_job_key': 'm/b/120', |
| 427 'try_job_build_number': 120, |
| 428 'status': 'Completed', |
| 429 'try_job_url': ( |
| 430 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 431 'builders/linux_chromium_variable/builds/120'), |
| 432 'revision': 'rev0', |
| 433 'commit_position': '0', |
| 434 'review_url': 'url_0' |
| 435 }, |
| 436 'b_test-b_test1': { |
| 437 'step': 'b_test', |
| 438 'test': 'b_test1', |
| 439 'try_job_key': 'm/b/121', |
| 440 'try_job_build_number': 121, |
| 441 'status': 'Completed', |
| 442 'try_job_url': ( |
| 443 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 444 'builders/linux_chromium_variable/builds/121'), |
| 445 'revision': 'rev1', |
| 446 'commit_position': '1', |
| 447 'review_url': 'url_1' |
| 448 }, |
| 449 'c_test': { |
| 450 'step': 'c_test', |
| 451 'test': 'N/A', |
| 452 'try_job_key': 'm/b/121', |
| 453 'try_job_build_number': 121, |
| 454 'status': 'Completed', |
| 455 'try_job_url': ( |
| 456 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 457 'builders/linux_chromium_variable/builds/121'), |
| 458 'revision': 'rev2', |
| 459 'commit_position': '2', |
| 460 'review_url': 'url_2' |
| 461 }, |
| 462 'd_test': { |
| 463 'step': 'd_test', |
| 464 'test': 'N/A', |
| 465 'try_job_key': 'm/b/122', |
| 466 'try_job_build_number': 122, |
| 467 'status': 'Completed', |
| 468 'try_job_url': ( |
| 469 'http://build.chromium.org/p/tryserver.chromium.linux/' |
| 470 'builders/linux_chromium_variable/builds/122') |
| 471 } |
| 472 } |
| 473 print json.dumps(result, indent=4, sort_keys=True) |
| 474 print json.dumps(expected_result, indent=4, sort_keys=True) |
| 475 self.assertEqual(expected_result, result) |
| OLD | NEW |