| 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 unittest | 5 import unittest |
| 6 | 6 |
| 7 import mock | 7 import mock |
| 8 | 8 |
| 9 from google.appengine.ext import ndb | 9 from google.appengine.ext import ndb |
| 10 from google.appengine.ext import testbed | 10 from google.appengine.ext import testbed |
| 11 | 11 |
| 12 from dashboard.common import namespaced_stored_object | 12 from dashboard.common import namespaced_stored_object |
| 13 from dashboard.pinpoint.models import change as change_module | 13 from dashboard.pinpoint.models import change as change_module |
| 14 from dashboard.pinpoint.models import isolate | 14 from dashboard.pinpoint.models import isolate |
| 15 from dashboard.pinpoint.models.quest import find_isolate | 15 from dashboard.pinpoint.models.quest import find_isolate |
| 16 | 16 |
| 17 | 17 |
| 18 class _FindIsolateTest(unittest.TestCase): | 18 class _FindIsolateTest(unittest.TestCase): |
| 19 | 19 |
| 20 def setUp(self): | 20 def setUp(self): |
| 21 self.testbed = testbed.Testbed() | 21 self.testbed = testbed.Testbed() |
| 22 self.testbed.activate() | 22 self.testbed.activate() |
| 23 self.testbed.init_datastore_v3_stub() | 23 self.testbed.init_datastore_v3_stub() |
| 24 self.testbed.init_memcache_stub() | 24 self.testbed.init_memcache_stub() |
| 25 ndb.get_context().clear_cache() | 25 ndb.get_context().clear_cache() |
| 26 | 26 |
| 27 change = change_module.Change(change_module.Dep('src', 'f9f2b720')) | 27 change = change_module.Change((change_module.Commit('src', 'f9f2b720'),)) |
| 28 isolate.Put(( | 28 isolate.Put(( |
| 29 ('Mac Builder', change, 'telemetry_perf_tests', '7c7e90be'), | 29 ('Mac Builder', change, 'telemetry_perf_tests', '7c7e90be'), |
| 30 )) | 30 )) |
| 31 | 31 |
| 32 namespaced_stored_object.Set('repositories', { | 32 namespaced_stored_object.Set('repositories', { |
| 33 'src': { | 33 'src': { |
| 34 'repository_url': 'https://chromium.googlesource.com/chromium/src' | 34 'repository_url': 'https://chromium.googlesource.com/chromium/src' |
| 35 }, | 35 }, |
| 36 'v8': { | 36 'v8': { |
| 37 'repository_url': 'https://chromium.googlesource.com/v8/v8' | 37 'repository_url': 'https://chromium.googlesource.com/v8/v8' |
| (...skipping 13 matching lines...) Expand all Loading... |
| 51 | 51 |
| 52 def assertExecutionSuccess(self, execution): | 52 def assertExecutionSuccess(self, execution): |
| 53 self.assertTrue(execution.completed) | 53 self.assertTrue(execution.completed) |
| 54 self.assertFalse(execution.failed) | 54 self.assertFalse(execution.failed) |
| 55 self.assertIsNone(execution.exception) | 55 self.assertIsNone(execution.exception) |
| 56 | 56 |
| 57 | 57 |
| 58 class IsolateLookupTest(_FindIsolateTest): | 58 class IsolateLookupTest(_FindIsolateTest): |
| 59 | 59 |
| 60 def testIsolateLookupSuccess(self): | 60 def testIsolateLookupSuccess(self): |
| 61 change = change_module.Change(change_module.Dep('src', 'f9f2b720')) | 61 change = change_module.Change((change_module.Commit('src', 'f9f2b720'),)) |
| 62 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') | 62 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') |
| 63 execution = quest.Start(change) | 63 execution = quest.Start(change) |
| 64 execution.Poll() | 64 execution.Poll() |
| 65 | 65 |
| 66 self.assertExecutionSuccess(execution) | 66 self.assertExecutionSuccess(execution) |
| 67 self.assertEqual(execution.result_values, ()) | 67 self.assertEqual(execution.result_values, ()) |
| 68 self.assertEqual(execution.result_arguments, {'isolate_hash': '7c7e90be'}) | 68 self.assertEqual(execution.result_arguments, {'isolate_hash': '7c7e90be'}) |
| 69 self.assertEqual( | 69 self.assertEqual( |
| 70 { | 70 { |
| 71 'completed': True, | 71 'completed': True, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 83 builder_testers = ( | 83 builder_testers = ( |
| 84 ('arm-builder-rel', 'health-plan-clankium-phone'), | 84 ('arm-builder-rel', 'health-plan-clankium-phone'), |
| 85 ('Android Builder', 'Android Nexus5 Perf'), | 85 ('Android Builder', 'Android Nexus5 Perf'), |
| 86 ('Android arm64 Builder', 'Android Nexus5X Perf'), | 86 ('Android arm64 Builder', 'Android Nexus5X Perf'), |
| 87 ('Linux Builder', 'Linux Perf'), | 87 ('Linux Builder', 'Linux Perf'), |
| 88 ('Mac Builder', 'Mac Air Perf'), | 88 ('Mac Builder', 'Mac Air Perf'), |
| 89 ('Win Builder', 'Win 7 Perf'), | 89 ('Win Builder', 'Win 7 Perf'), |
| 90 ('Win x64 Builder', 'Win Zenbook Perf'), | 90 ('Win x64 Builder', 'Win Zenbook Perf'), |
| 91 ) | 91 ) |
| 92 | 92 |
| 93 change = change_module.Change(change_module.Dep('src', 'git hash')) | 93 change = change_module.Change((change_module.Commit('src', 'git hash'),)) |
| 94 isolate.Put( | 94 isolate.Put( |
| 95 (builder, change, 'telemetry_perf_tests', hex(hash(builder))) | 95 (builder, change, 'telemetry_perf_tests', hex(hash(builder))) |
| 96 for builder, _ in builder_testers) | 96 for builder, _ in builder_testers) |
| 97 | 97 |
| 98 for builder, tester in builder_testers: | 98 for builder, tester in builder_testers: |
| 99 quest = find_isolate.FindIsolate(tester, 'telemetry_perf_tests') | 99 quest = find_isolate.FindIsolate(tester, 'telemetry_perf_tests') |
| 100 execution = quest.Start(change) | 100 execution = quest.Start(change) |
| 101 execution.Poll() | 101 execution.Poll() |
| 102 | 102 |
| 103 self.assertExecutionSuccess(execution) | 103 self.assertExecutionSuccess(execution) |
| 104 self.assertEqual(execution.result_arguments, | 104 self.assertEqual(execution.result_arguments, |
| 105 {'isolate_hash': hex(hash(builder))}) | 105 {'isolate_hash': hex(hash(builder))}) |
| 106 | 106 |
| 107 def testUnknownBuilder(self): | 107 def testUnknownBuilder(self): |
| 108 with self.assertRaises(NotImplementedError): | 108 with self.assertRaises(NotImplementedError): |
| 109 find_isolate.FindIsolate('Unix Perf', 'telemetry_perf_tests') | 109 find_isolate.FindIsolate('Unix Perf', 'telemetry_perf_tests') |
| 110 | 110 |
| 111 | 111 |
| 112 @mock.patch('dashboard.services.buildbucket_service.GetJobStatus') | 112 @mock.patch('dashboard.services.buildbucket_service.GetJobStatus') |
| 113 @mock.patch('dashboard.services.buildbucket_service.Put') | 113 @mock.patch('dashboard.services.buildbucket_service.Put') |
| 114 class BuildTest(_FindIsolateTest): | 114 class BuildTest(_FindIsolateTest): |
| 115 | 115 |
| 116 def testBuildLifecycle(self, put, get_job_status): | 116 def testBuildLifecycle(self, put, get_job_status): |
| 117 change = change_module.Change( | 117 change = change_module.Change( |
| 118 change_module.Dep('src', 'base git hash'), | 118 (change_module.Commit('src', 'base git hash'), |
| 119 (change_module.Dep('v8', 'dep git hash'),), | 119 change_module.Commit('v8', 'dep git hash')), |
| 120 patch=change_module.Patch('https://example.org', 2565263002, 20001)) | 120 patch=change_module.Patch('https://example.org', 2565263002, 20001)) |
| 121 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') | 121 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') |
| 122 execution = quest.Start(change) | 122 execution = quest.Start(change) |
| 123 | 123 |
| 124 # Request a build. | 124 # Request a build. |
| 125 put.return_value = {'build': {'id': 'build_id'}} | 125 put.return_value = {'build': {'id': 'build_id'}} |
| 126 execution.Poll() | 126 execution.Poll() |
| 127 | 127 |
| 128 self.assertFalse(execution.completed) | 128 self.assertFalse(execution.completed) |
| 129 put.assert_called_once_with(find_isolate.BUCKET, { | 129 put.assert_called_once_with(find_isolate.BUCKET, { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 151 # Look up isolate hash. | 151 # Look up isolate hash. |
| 152 isolate.Put((('Mac Builder', change, | 152 isolate.Put((('Mac Builder', change, |
| 153 'telemetry_perf_tests', 'isolate git hash'),)) | 153 'telemetry_perf_tests', 'isolate git hash'),)) |
| 154 execution.Poll() | 154 execution.Poll() |
| 155 | 155 |
| 156 self.assertExecutionSuccess(execution) | 156 self.assertExecutionSuccess(execution) |
| 157 | 157 |
| 158 def testSimultaneousBuilds(self, put, get_job_status): | 158 def testSimultaneousBuilds(self, put, get_job_status): |
| 159 # Two builds started at the same time on the same Change should reuse the | 159 # Two builds started at the same time on the same Change should reuse the |
| 160 # same build request. | 160 # same build request. |
| 161 change = change_module.Change(change_module.Dep('src', 'base git hash')) | 161 change = change_module.Change( |
| 162 (change_module.Commit('src', 'base git hash'),)) |
| 162 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') | 163 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') |
| 163 execution_1 = quest.Start(change) | 164 execution_1 = quest.Start(change) |
| 164 execution_2 = quest.Start(change) | 165 execution_2 = quest.Start(change) |
| 165 | 166 |
| 166 # Request a build. | 167 # Request a build. |
| 167 put.return_value = {'build': {'id': 'build_id'}} | 168 put.return_value = {'build': {'id': 'build_id'}} |
| 168 execution_1.Poll() | 169 execution_1.Poll() |
| 169 execution_2.Poll() | 170 execution_2.Poll() |
| 170 | 171 |
| 171 self.assertFalse(execution_1.completed) | 172 self.assertFalse(execution_1.completed) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 185 isolate.Put((('Mac Builder', change, | 186 isolate.Put((('Mac Builder', change, |
| 186 'telemetry_perf_tests', 'isolate git hash'),)) | 187 'telemetry_perf_tests', 'isolate git hash'),)) |
| 187 execution_1.Poll() | 188 execution_1.Poll() |
| 188 execution_2.Poll() | 189 execution_2.Poll() |
| 189 | 190 |
| 190 self.assertExecutionSuccess(execution_1) | 191 self.assertExecutionSuccess(execution_1) |
| 191 self.assertExecutionSuccess(execution_2) | 192 self.assertExecutionSuccess(execution_2) |
| 192 | 193 |
| 193 def testBuildFailure(self, put, get_job_status): | 194 def testBuildFailure(self, put, get_job_status): |
| 194 change = change_module.Change( | 195 change = change_module.Change( |
| 195 change_module.Dep('src', 'base git hash'), | 196 (change_module.Commit('src', 'base git hash'), |
| 196 (change_module.Dep('v8', 'dep git hash'),), | 197 change_module.Commit('v8', 'dep git hash')), |
| 197 patch=change_module.Patch('https://example.org', 2565263002, 20001)) | 198 patch=change_module.Patch('https://example.org', 2565263002, 20001)) |
| 198 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') | 199 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') |
| 199 execution = quest.Start(change) | 200 execution = quest.Start(change) |
| 200 | 201 |
| 201 # Request a build. | 202 # Request a build. |
| 202 put.return_value = {'build': {'id': 'build_id'}} | 203 put.return_value = {'build': {'id': 'build_id'}} |
| 203 execution.Poll() | 204 execution.Poll() |
| 204 | 205 |
| 205 # Check build status. | 206 # Check build status. |
| 206 get_job_status.return_value = { | 207 get_job_status.return_value = { |
| 207 'build': { | 208 'build': { |
| 208 'status': 'COMPLETED', | 209 'status': 'COMPLETED', |
| 209 'result': 'FAILURE', | 210 'result': 'FAILURE', |
| 210 'failure_reason': 'BUILD_FAILURE', | 211 'failure_reason': 'BUILD_FAILURE', |
| 211 } | 212 } |
| 212 } | 213 } |
| 213 execution.Poll() | 214 execution.Poll() |
| 214 | 215 |
| 215 self.assertExecutionFailure(execution, find_isolate.BuildError) | 216 self.assertExecutionFailure(execution, find_isolate.BuildError) |
| 216 | 217 |
| 217 def testBuildCanceled(self, put, get_job_status): | 218 def testBuildCanceled(self, put, get_job_status): |
| 218 change = change_module.Change( | 219 change = change_module.Change( |
| 219 change_module.Dep('src', 'base git hash'), | 220 (change_module.Commit('src', 'base git hash'), |
| 220 (change_module.Dep('v8', 'dep git hash'),), | 221 change_module.Commit('v8', 'dep git hash')), |
| 221 patch=change_module.Patch('https://example.org', 2565263002, 20001)) | 222 patch=change_module.Patch('https://example.org', 2565263002, 20001)) |
| 222 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') | 223 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') |
| 223 execution = quest.Start(change) | 224 execution = quest.Start(change) |
| 224 | 225 |
| 225 # Request a build. | 226 # Request a build. |
| 226 put.return_value = {'build': {'id': 'build_id'}} | 227 put.return_value = {'build': {'id': 'build_id'}} |
| 227 execution.Poll() | 228 execution.Poll() |
| 228 | 229 |
| 229 # Check build status. | 230 # Check build status. |
| 230 get_job_status.return_value = { | 231 get_job_status.return_value = { |
| 231 'build': { | 232 'build': { |
| 232 'status': 'COMPLETED', | 233 'status': 'COMPLETED', |
| 233 'result': 'CANCELED', | 234 'result': 'CANCELED', |
| 234 'cancelation_reason': 'TIMEOUT', | 235 'cancelation_reason': 'TIMEOUT', |
| 235 } | 236 } |
| 236 } | 237 } |
| 237 execution.Poll() | 238 execution.Poll() |
| 238 | 239 |
| 239 self.assertExecutionFailure(execution, find_isolate.BuildError) | 240 self.assertExecutionFailure(execution, find_isolate.BuildError) |
| 240 | 241 |
| 241 def testBuildSucceededButIsolateIsMissing(self, put, get_job_status): | 242 def testBuildSucceededButIsolateIsMissing(self, put, get_job_status): |
| 242 change = change_module.Change( | 243 change = change_module.Change( |
| 243 change_module.Dep('src', 'base git hash'), | 244 (change_module.Commit('src', 'base git hash'), |
| 244 (change_module.Dep('v8', 'dep git hash'),), | 245 change_module.Commit('v8', 'dep git hash')), |
| 245 patch=change_module.Patch('https://example.org', 2565263002, 20001)) | 246 patch=change_module.Patch('https://example.org', 2565263002, 20001)) |
| 246 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') | 247 quest = find_isolate.FindIsolate('Mac Pro Perf', 'telemetry_perf_tests') |
| 247 execution = quest.Start(change) | 248 execution = quest.Start(change) |
| 248 | 249 |
| 249 # Request a build. | 250 # Request a build. |
| 250 put.return_value = {'build': {'id': 'build_id'}} | 251 put.return_value = {'build': {'id': 'build_id'}} |
| 251 execution.Poll() | 252 execution.Poll() |
| 252 | 253 |
| 253 # Check build status. | 254 # Check build status. |
| 254 get_job_status.return_value = { | 255 get_job_status.return_value = { |
| 255 'build': { | 256 'build': { |
| 256 'status': 'COMPLETED', | 257 'status': 'COMPLETED', |
| 257 'result': 'SUCCESS', | 258 'result': 'SUCCESS', |
| 258 } | 259 } |
| 259 } | 260 } |
| 260 execution.Poll() | 261 execution.Poll() |
| 261 | 262 |
| 262 self.assertExecutionFailure(execution, find_isolate.BuildError) | 263 self.assertExecutionFailure(execution, find_isolate.BuildError) |
| OLD | NEW |