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 |