Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: dashboard/dashboard/pinpoint/models/change_test.py

Issue 3013013002: [pinpoint] Change refactor. (Closed)
Patch Set: UI Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 # found in the LICENSE file.
4
5 import unittest
6
7 import mock
8
9 from dashboard.common import namespaced_stored_object
10 from dashboard.common import testing_common
11 from dashboard.pinpoint.models import change
12
13
14 _CATAPULT_URL = ('https://chromium.googlesource.com/'
15 'external/github.com/catapult-project/catapult')
16 _CHROMIUM_URL = 'https://chromium.googlesource.com/chromium/src'
17
18
19 class ChangeTest(testing_common.TestCase):
20
21 def setUp(self):
22 super(ChangeTest, self).setUp()
23
24 self.SetCurrentUser('internal@chromium.org', is_admin=True)
25
26 namespaced_stored_object.Set('repositories', {
27 'catapult': {'repository_url': _CATAPULT_URL},
28 'chromium': {'repository_url': _CHROMIUM_URL},
29 })
30
31 def testChange(self):
32 base_commit = change.Dep('chromium', 'aaa7336c821888839f759c6c0a36b56c6678')
33 dep = change.Dep('catapult', 'e0a2efbb3d1a81aac3c90041eefec24f066d26ba')
34 patch = change.Patch('https://codereview.chromium.org', 2565263002, 20001)
35
36 # Also test the deps conversion to frozenset.
37 c = change.Change(base_commit, [dep], patch)
38
39 self.assertEqual(c, change.Change(base_commit, (dep,), patch))
40 string = ('chromium@aaa7336 catapult@e0a2efb + '
41 'https://codereview.chromium.org/2565263002/20001')
42 id_string = ('chromium@aaa7336c821888839f759c6c0a36b56c6678 '
43 'catapult@e0a2efbb3d1a81aac3c90041eefec24f066d26ba + '
44 'https://codereview.chromium.org/2565263002/20001')
45 self.assertEqual(str(c), string)
46 self.assertEqual(c.id_string, id_string)
47 self.assertEqual(c.base_commit, base_commit)
48 self.assertEqual(c.deps, frozenset((dep,)))
49 self.assertEqual(c.all_deps, (base_commit, dep))
50 self.assertEqual(c.patch, patch)
51
52 def testAsDict(self):
53 base_commit = change.Dep('chromium', 'aaa7336c82')
54 dep = change.Dep('catapult', 'e0a2efbb3d')
55 patch = change.Patch('https://codereview.chromium.org', 2565263002, 20001)
56 c = change.Change(base_commit, [dep], patch)
57
58 expected = {
59 'base_commit': {
60 'repository': 'chromium',
61 'git_hash': 'aaa7336c82',
62 'url': _CHROMIUM_URL + '/+/aaa7336c82',
63 },
64 'deps': [{
65 'repository': 'catapult',
66 'git_hash': 'e0a2efbb3d',
67 'url': _CATAPULT_URL + '/+/e0a2efbb3d',
68 }],
69 'patch': {
70 'server': 'https://codereview.chromium.org',
71 'issue': 2565263002,
72 'patchset': 20001,
73 },
74 }
75 self.assertEqual(c.AsDict(), expected)
76
77 @mock.patch('dashboard.services.gitiles_service.CommitInfo')
78 def testFromDictWithJustBaseCommit(self, _):
79 c = change.Change.FromDict({
80 'base_commit': {'repository': 'chromium', 'git_hash': 'aaa7336'},
81 })
82
83 expected = change.Change(change.Dep('chromium', 'aaa7336'))
84 self.assertEqual(c, expected)
85
86 @mock.patch('dashboard.services.gitiles_service.CommitInfo')
87 def testFromDictWithAllFields(self, _):
88 c = change.Change.FromDict({
89 'base_commit': {'repository': 'chromium', 'git_hash': 'aaa7336'},
90 'deps': ({'repository': 'catapult', 'git_hash': 'e0a2efb'},),
91 'patch': {
92 'server': 'https://codereview.chromium.org',
93 'issue': 2565263002,
94 'patchset': 20001,
95 },
96 })
97
98 base_commit = change.Dep('chromium', 'aaa7336')
99 deps = (change.Dep('catapult', 'e0a2efb'),)
100 patch = change.Patch('https://codereview.chromium.org', 2565263002, 20001)
101 expected = change.Change(base_commit, deps, patch)
102 self.assertEqual(c, expected)
103
104 @mock.patch('dashboard.services.gitiles_service.CommitRange')
105 def testMidpointSuccess(self, commit_range):
106 commit_range.return_value = [
107 {'commit': 'babe852'},
108 {'commit': 'b57345e'},
109 {'commit': '949b36d'},
110 {'commit': '1ef4789'},
111 ]
112
113 change_a = change.Change(change.Dep('chromium', '0e57e2b'),
114 (change.Dep('catapult', 'e0a2efb'),))
115 change_b = change.Change(change.Dep('chromium', 'babe852'),
116 (change.Dep('catapult', 'e0a2efb'),))
117 self.assertEqual(change.Change.Midpoint(change_a, change_b),
118 change.Change(change.Dep('chromium', '949b36d'),
119 (change.Dep('catapult', 'e0a2efb'),)))
120
121 @mock.patch('dashboard.services.gitiles_service.FileContents')
122 @mock.patch('dashboard.services.gitiles_service.CommitRange')
123 def testMidpointWithDepsRoll(self, commit_range, file_contents):
124 def _CommitRange(repository_url, first_git_hash, last_git_hash):
125 del repository_url
126 if first_git_hash == '0e57e2b' and last_git_hash == 'babe852':
127 return [{'commit': 'babe852'}]
128 if first_git_hash == '0000000' and last_git_hash == '2222222':
129 return [{'commit': '2222222'}, {'commit': '1111111'}]
130 raise NotImplementedError()
131 commit_range.side_effect = _CommitRange
132
133 def _FileContents(repository_url, git_hash, path):
134 del repository_url
135 del path
136 if git_hash == '0e57e2b':
137 # Also test the stripping of '.git' from repository URLs.
138 return 'deps = {"chromium/catapult": "%s@0000000"}' % (
139 _CATAPULT_URL + '.git')
140 if git_hash == 'babe852':
141 return 'deps = {"chromium/catapult": "%s@2222222"}' % _CATAPULT_URL
142 raise NotImplementedError()
143 file_contents.side_effect = _FileContents
144
145 change_a = change.Change(change.Dep('chromium', '0e57e2b'))
146 change_b = change.Change(change.Dep('chromium', 'babe852'))
147 expected = change.Change(change.Dep('chromium', '0e57e2b'),
148 (change.Dep('catapult', '1111111'),))
149
150 self.assertEqual(change.Change.Midpoint(change_a, change_b), expected)
151
152 @mock.patch('dashboard.services.gitiles_service.FileContents')
153 @mock.patch('dashboard.services.gitiles_service.CommitRange')
154 def testMidpointAcrossDepsRoll(self, commit_range, file_contents):
155 def _CommitRange(repository_url, first_git_hash, last_git_hash):
156 del repository_url
157 if first_git_hash == '0e57e2b' and last_git_hash == 'babe852':
158 return [{'commit': 'babe852'}]
159 if first_git_hash == '1111111' and last_git_hash == '3333333':
160 return [{'commit': '3333333'}, {'commit': '2222222'}]
161 raise NotImplementedError()
162 commit_range.side_effect = _CommitRange
163
164 def _FileContents(repository_url, git_hash, path):
165 del repository_url
166 del path
167 if git_hash == '0e57e2b':
168 return 'deps = {"src/catapult": "%s@0000000"}' % _CATAPULT_URL
169 if git_hash == 'babe852':
170 return 'deps = {"src/catapult": "%s@3333333"}' % _CATAPULT_URL
171 raise NotImplementedError()
172 file_contents.side_effect = _FileContents
173
174 change_a = change.Change(change.Dep('chromium', '0e57e2b'),
175 (change.Dep('catapult', '1111111'),))
176 change_b = change.Change(change.Dep('chromium', 'babe852'))
177 expected = change.Change(change.Dep('chromium', '0e57e2b'),
178 (change.Dep('catapult', '2222222'),))
179
180 self.assertEqual(change.Change.Midpoint(change_a, change_b), expected)
181
182 def testMidpointRaisesWithDifferingPatch(self):
183 change_a = change.Change(change.Dep('chromium', '0e57e2b'))
184 change_b = change.Change(
185 change.Dep('chromium', 'babe852'),
186 patch=change.Patch('https://codereview.chromium.org', 2565263002, 20001) )
187 with self.assertRaises(change.NonLinearError):
188 change.Change.Midpoint(change_a, change_b)
189
190 def testMidpointRaisesWithDifferingRepository(self):
191 change_a = change.Change(change.Dep('chromium', '0e57e2b'))
192 change_b = change.Change(change.Dep('not_chromium', 'babe852'))
193 with self.assertRaises(change.NonLinearError):
194 change.Change.Midpoint(change_a, change_b)
195
196 @mock.patch('dashboard.services.gitiles_service.FileContents')
197 @mock.patch('dashboard.services.gitiles_service.CommitRange')
198 def testMidpointRaisesAcrossDepsRollWhenDepAlreadyOverridden(
199 self, commit_range, file_contents):
200 def _CommitRange(repository_url, first_git_hash, last_git_hash):
201 del repository_url
202 if first_git_hash == '0e57e2b' and last_git_hash == 'babe852':
203 return [{'commit': 'babe852'}]
204 if first_git_hash == '1111111' and last_git_hash == '3333333':
205 return [{'commit': '3333333'}, {'commit': '2222222'}]
206 raise NotImplementedError()
207 commit_range.side_effect = _CommitRange
208
209 def _FileContents(repository_url, git_hash, path):
210 del repository_url
211 del path
212 if git_hash == '0e57e2b':
213 return 'deps = {"src/catapult": "%s@0000000"}' % _CATAPULT_URL
214 if git_hash == 'babe852':
215 return 'deps = {"src/catapult": "%s@4444444"}' % _CATAPULT_URL
216 raise NotImplementedError()
217 file_contents.side_effect = _FileContents
218
219 change_a = change.Change(change.Dep('chromium', '0e57e2b'),
220 (change.Dep('catapult', '1111111'),))
221 change_b = change.Change(change.Dep('chromium', 'babe852'),
222 (change.Dep('catapult', '3333333'),))
223
224 with self.assertRaises(change.NonLinearError):
225 change.Change.Midpoint(change_a, change_b)
226
227 def testMidpointReturnsNoneWithTheSameChange(self):
228 c = change.Change(change.Dep('chromium', '0e57e2b'))
229 self.assertIsNone(change.Change.Midpoint(c, c))
230
231 @mock.patch('dashboard.services.gitiles_service.FileContents')
232 @mock.patch('dashboard.services.gitiles_service.CommitRange')
233 def testMidpointReturnsNoneWithAdjacentCommitsAndNoDepsRoll(
234 self, commit_range, file_contents):
235 commit_range.return_value = [{'commit': 'b57345e'}]
236 file_contents.return_value = 'deps = {}'
237
238 change_a = change.Change(change.Dep('chromium', '949b36d'))
239 change_b = change.Change(change.Dep('chromium', 'b57345e'))
240 self.assertIsNone(change.Change.Midpoint(change_a, change_b))
241
242
243 class DepTest(testing_common.TestCase):
244
245 def setUp(self):
246 super(DepTest, self).setUp()
247
248 self.SetCurrentUser('internal@chromium.org', is_admin=True)
249
250 namespaced_stored_object.Set('repositories', {
251 'chromium': {'repository_url': _CHROMIUM_URL},
252 })
253
254 def testDep(self):
255 dep = change.Dep('chromium', 'aaa7336c821888839f759c6c0a36b56c6678')
256
257 other_dep = change.Dep(u'chromium', u'aaa7336c821888839f759c6c0a36b56c6678')
258 self.assertEqual(dep, other_dep)
259 self.assertEqual(str(dep), 'chromium@aaa7336')
260 self.assertEqual(dep.id_string,
261 'chromium@aaa7336c821888839f759c6c0a36b56c6678')
262 self.assertEqual(dep.repository, 'chromium')
263 self.assertEqual(dep.git_hash, 'aaa7336c821888839f759c6c0a36b56c6678')
264 self.assertEqual(dep.repository_url,
265 'https://chromium.googlesource.com/chromium/src')
266
267 @mock.patch('dashboard.services.gitiles_service.FileContents')
268 def testDeps(self, file_contents):
269 file_contents.return_value = """
270 vars = {
271 'chromium_git': 'https://chromium.googlesource.com',
272 }
273 deps = {
274 'src/v8': Var('chromium_git') + '/v8/v8.git' + '@' + 'c092edb',
275 }
276 deps_os = {
277 'win': {
278 'src/third_party/cygwin':
279 Var('chromium_git') + '/chromium/deps/cygwin.git' + '@' + 'c89e446',
280 }
281 }
282 """
283
284 dep = change.Dep('chromium', 'aaa7336')
285 expected = frozenset((
286 change.Dep('cygwin', 'c89e446'),
287 change.Dep('v8', 'c092edb'),
288 ))
289 self.assertEqual(dep.Deps(), expected)
290
291 def testAsDict(self):
292 dep = change.Dep('chromium', 'aaa7336')
293 expected = {
294 'repository': 'chromium',
295 'git_hash': 'aaa7336',
296 'url': _CHROMIUM_URL + '/+/aaa7336',
297 }
298 self.assertEqual(dep.AsDict(), expected)
299
300 @mock.patch('dashboard.services.gitiles_service.CommitInfo')
301 def testFromDict(self, _):
302 dep = change.Dep.FromDict({
303 'repository': 'chromium',
304 'git_hash': 'aaa7336',
305 })
306
307 expected = change.Dep('chromium', 'aaa7336')
308 self.assertEqual(dep, expected)
309
310 @mock.patch('dashboard.services.gitiles_service.CommitInfo')
311 def testFromDictWithRepositoryUrl(self, _):
312 dep = change.Dep.FromDict({
313 'repository': 'https://chromium.googlesource.com/chromium/src',
314 'git_hash': 'aaa7336',
315 })
316
317 expected = change.Dep('chromium', 'aaa7336')
318 self.assertEqual(dep, expected)
319
320 def testFromDictFailureFromUnknownRepo(self):
321 with self.assertRaises(KeyError):
322 change.Dep.FromDict({
323 'repository': 'unknown repo',
324 'git_hash': 'git hash',
325 })
326
327 @mock.patch('dashboard.services.gitiles_service.CommitInfo')
328 def testFromDictFailureFromUnknownCommit(self, commit_info):
329 commit_info.side_effect = KeyError()
330
331 with self.assertRaises(KeyError):
332 change.Dep.FromDict({
333 'repository': 'chromium',
334 'git_hash': 'unknown git hash',
335 })
336
337 @mock.patch('dashboard.services.gitiles_service.CommitRange')
338 def testMidpointSuccess(self, commit_range):
339 commit_range.return_value = [
340 {'commit': 'babe852'},
341 {'commit': 'b57345e'},
342 {'commit': '949b36d'},
343 {'commit': '1ef4789'},
344 ]
345
346 dep_a = change.Dep('chromium', '0e57e2b')
347 dep_b = change.Dep('chromium', 'babe852')
348 self.assertEqual(change.Dep.Midpoint(dep_a, dep_b),
349 change.Dep('chromium', '949b36d'))
350
351 def testMidpointRaisesWithDifferingRepositories(self):
352 dep_a = change.Dep('chromium', '0e57e2b')
353 dep_b = change.Dep('not_chromium', 'babe852')
354
355 with self.assertRaises(ValueError):
356 change.Dep.Midpoint(dep_a, dep_b)
357
358 @mock.patch('dashboard.services.gitiles_service.CommitRange')
359 def testMidpointReturnsNoneWithAdjacentCommits(self, commit_range):
360 commit_range.return_value = [{'commit': 'b57345e'}]
361
362 dep_a = change.Dep('chromium', '949b36d')
363 dep_b = change.Dep('chromium', 'b57345e')
364 self.assertIsNone(change.Dep.Midpoint(dep_a, dep_b))
365
366 @mock.patch('dashboard.services.gitiles_service.CommitRange')
367 def testMidpointReturnsNoneWithEmptyRange(self, commit_range):
368 commit_range.return_value = []
369
370 dep_b = change.Dep('chromium', 'b57345e')
371 dep_a = change.Dep('chromium', '949b36d')
372 self.assertIsNone(change.Dep.Midpoint(dep_a, dep_b))
373
374
375 class PatchTest(unittest.TestCase):
376
377 def testPatch(self):
378 patch = change.Patch('https://codereview.chromium.org', 2851943002, 40001)
379
380 other_patch = change.Patch(u'https://codereview.chromium.org',
381 2851943002, 40001)
382 self.assertEqual(patch, other_patch)
383 string = 'https://codereview.chromium.org/2851943002/40001'
384 self.assertEqual(str(patch), string)
385 self.assertEqual(patch.id_string, string)
386
387 def testAsDict(self):
388 patch = change.Patch('https://codereview.chromium.org', 2851943002, 40001)
389 expected = {
390 'server': 'https://codereview.chromium.org',
391 'issue': 2851943002,
392 'patchset': 40001,
393 }
394 self.assertEqual(patch.AsDict(), expected)
395
396 def testFromDict(self):
397 patch = change.Patch.FromDict({
398 'server': 'https://codereview.chromium.org',
399 'issue': 2851943002,
400 'patchset': 40001,
401 })
402
403 expected = change.Patch('https://codereview.chromium.org',
404 2851943002, 40001)
405 self.assertEqual(patch, expected)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698