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

Side by Side Diff: tests/git_common_test.py

Issue 26109002: Add git-number script to calculate generation numbers for commits. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Address final comments? Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 """Unit tests for git_common.py"""
7
8 import binascii
9 import collections
10 import os
11 import signal
12 import sys
13 import tempfile
14 import time
15 import unittest
16
17 DEPOT_TOOLS_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
18 sys.path.insert(0, DEPOT_TOOLS_ROOT)
19
20 from testing_support import git_test_utils
21 from testing_support import coverage_utils
22
23
24 class GitCommonTestBase(unittest.TestCase):
25 @classmethod
26 def setUpClass(cls):
27 super(GitCommonTestBase, cls).setUpClass()
28 import git_common
29 cls.gc = git_common
30
31
32 class Support(GitCommonTestBase):
33 def _testMemoizeOneBody(self, threadsafe):
34 calls = collections.defaultdict(int)
35 def double_if_even(val):
36 calls[val] += 1
37 if val % 2 == 0:
38 return val * 2
39 else:
40 return None
41 # Use this explicitly as a wrapper fn instead of a decorator. Otherwise
42 # pylint crashes (!!)
43 double_if_even = self.gc.memoize_one(threadsafe=threadsafe)(double_if_even)
44
45 self.assertEqual(4, double_if_even(2))
46 self.assertEqual(4, double_if_even(2))
47 self.assertEqual(None, double_if_even(1))
48 self.assertEqual(None, double_if_even(1))
49 self.assertDictEqual({1: 2, 2: 1}, calls)
50
51 double_if_even.set(10, 20)
52 self.assertEqual(20, double_if_even(10))
53 self.assertDictEqual({1: 2, 2: 1}, calls)
54
55 double_if_even.clear()
56 self.assertEqual(4, double_if_even(2))
57 self.assertEqual(4, double_if_even(2))
58 self.assertEqual(None, double_if_even(1))
59 self.assertEqual(None, double_if_even(1))
60 self.assertEqual(20, double_if_even(10))
61 self.assertDictEqual({1: 4, 2: 2, 10: 1}, calls)
62
63 def testMemoizeOne(self):
64 self._testMemoizeOneBody(threadsafe=False)
65
66 def testMemoizeOneThreadsafe(self):
67 self._testMemoizeOneBody(threadsafe=True)
68
M-A Ruel 2013/11/12 21:13:40 2 lines
69 def slow_square(i):
70 """Helper for ScopedPoolTest.
71
72 Must be global because non top-level functions aren't pickleable.
73 """
74 time.sleep(0.2)
75 return i ** 2
76
77
78 class ScopedPoolTest(GitCommonTestBase):
79 if sys.platform.startswith('win'):
80 CTRL_C = signal.CTRL_C_EVENT
81 else:
82 CTRL_C = signal.SIGINT
83
84 def testThreads(self):
85 result = []
86 with self.gc.ScopedPool(kind='threads') as pool:
87 for i in pool.imap(slow_square, xrange(10)):
88 result.append(i)
89 self.assertEqual([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], result)
90
91 def testThreadsCtrlC(self):
92 result = []
93 with self.assertRaises(KeyboardInterrupt):
94 with self.gc.ScopedPool(kind='threads') as pool:
95 # Make sure this pool is interrupted in mid-swing
96 for i in pool.imap(slow_square, xrange(1000000)):
97 if i > 32:
98 os.kill(os.getpid(), self.CTRL_C)
99 result.append(i)
100 self.assertEqual([0, 1, 4, 9, 16, 25], result)
101
102 def testProcs(self):
103 result = []
104 with self.gc.ScopedPool() as pool:
105 for i in pool.imap(slow_square, xrange(10)):
106 result.append(i)
107 self.assertEqual([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], result)
108
109 def testProcsCtrlC(self):
110 result = []
111 with self.assertRaises(KeyboardInterrupt):
112 with self.gc.ScopedPool() as pool:
113 # Make sure this pool is interrupted in mid-swing
114 for i in pool.imap(slow_square, xrange(1000000)):
115 if i > 32:
116 os.kill(os.getpid(), self.CTRL_C)
117 result.append(i)
118 self.assertEqual([0, 1, 4, 9, 16, 25], result)
119
120
121 class ProgressPrinterTest(GitCommonTestBase):
122 class FakeStream(object):
123 def __init__(self):
124 self.data = set()
125 self.count = 0
126
127 def write(self, line):
128 self.data.add(line)
129
130 def flush(self):
131 self.count += 1
132
133 # This test is probably racy, but I don't have a better alternative.
134 @unittest.expectedFailure
135 def testBasic(self):
136 fmt = '%(count)d/10'
137 stream = self.FakeStream()
138
139 pp = self.gc.ProgressPrinter(fmt, enabled=True, stream=stream, period=0.01)
140 with pp as inc:
141 for _ in xrange(10):
142 time.sleep(0.02)
143 inc()
144
145 filtered = set(x.strip() for x in stream.data)
146 rslt = set(fmt % {'count': i} for i in xrange(11))
147 self.assertSetEqual(filtered, rslt)
148 self.assertGreaterEqual(stream.count, 10)
149
150
151 class GitReadOnlyFunctionsTest(git_test_utils.GitRepoReadOnlyTestBase,
152 GitCommonTestBase):
153 REPO = """
154 A B C D
155 B E D
156 """
157
158 COMMIT_A = {
159 'some/files/file1': {'data': 'file1'},
160 'some/files/file2': {'data': 'file2'},
161 'some/files/file3': {'data': 'file3'},
162 'some/other/file': {'data': 'otherfile'},
163 }
164
165 COMMIT_C = {
166 'some/files/file2': {
167 'mode': 0755,
168 'data': 'file2 - vanilla'},
169 }
170
171 COMMIT_E = {
172 'some/files/file2': {'data': 'file2 - merged'},
173 }
174
175 COMMIT_D = {
176 'some/files/file2': {'data': 'file2 - vanilla\nfile2 - merged'},
177 }
178
179 def testHashes(self):
180 ret = self.repo.run(
181 self.gc.hashes, *[
182 'master',
183 'master~3',
184 self.repo['E']+'~',
185 self.repo['D']+'^2',
186 'tag_C^{}',
187 ]
188 )
189 self.assertEqual([
190 self.repo['D'],
191 self.repo['A'],
192 self.repo['B'],
193 self.repo['E'],
194 self.repo['C'],
195 ], ret)
196
197 def testParseCommitrefs(self):
198 ret = self.repo.run(
199 self.gc.parse_commitrefs, *[
200 'master',
201 'master~3',
202 self.repo['E']+'~',
203 self.repo['D']+'^2',
204 'tag_C^{}',
205 ]
206 )
207 self.assertEqual(ret, map(binascii.unhexlify, [
208 self.repo['D'],
209 self.repo['A'],
210 self.repo['B'],
211 self.repo['E'],
212 self.repo['C'],
213 ]))
214
215 with self.assertRaisesRegexp(Exception, r"one of \('master', 'bananas'\)"):
216 self.repo.run(self.gc.parse_commitrefs, 'master', 'bananas')
217
218 def testTree(self):
219 tree = self.repo.run(self.gc.tree, 'master:some/files')
220 file1 = self.COMMIT_A['some/files/file1']['data']
221 file2 = self.COMMIT_D['some/files/file2']['data']
222 file3 = self.COMMIT_A['some/files/file3']['data']
223 self.assertEquals(tree['file1'],
224 ('100644', 'blob', git_test_utils.git_hash_data(file1)))
225 self.assertEquals(tree['file2'],
226 ('100755', 'blob', git_test_utils.git_hash_data(file2)))
227 self.assertEquals(tree['file3'],
228 ('100644', 'blob', git_test_utils.git_hash_data(file3)))
229
230 tree = self.repo.run(self.gc.tree, 'master:some')
231 self.assertEquals(len(tree), 2)
232 # Don't check the tree hash because we're lazy :)
233 self.assertEquals(tree['files'][:2], ('040000', 'tree'))
234
235 tree = self.repo.run(self.gc.tree, 'master:wat')
236 self.assertEqual(tree, None)
237
238 def testTreeRecursive(self):
239 tree = self.repo.run(self.gc.tree, 'master:some', recurse=True)
240 file1 = self.COMMIT_A['some/files/file1']['data']
241 file2 = self.COMMIT_D['some/files/file2']['data']
242 file3 = self.COMMIT_A['some/files/file3']['data']
243 other = self.COMMIT_A['some/other/file']['data']
244 self.assertEquals(tree['files/file1'],
245 ('100644', 'blob', git_test_utils.git_hash_data(file1)))
246 self.assertEquals(tree['files/file2'],
247 ('100755', 'blob', git_test_utils.git_hash_data(file2)))
248 self.assertEquals(tree['files/file3'],
249 ('100644', 'blob', git_test_utils.git_hash_data(file3)))
250 self.assertEquals(tree['other/file'],
251 ('100644', 'blob', git_test_utils.git_hash_data(other)))
252
253 def testError(self):
254 with self.assertRaisesRegexp(self.gc.CalledProcessError, 'status 1'):
255 self.gc.run('rev-parse', 'bananas')
256
257
258 class GitMutableFunctionsTest(git_test_utils.GitRepoReadWriteTestBase,
259 GitCommonTestBase):
260 REPO = ''
261
262 def _intern_data(self, data):
263 with tempfile.TemporaryFile() as f:
264 f.write(data)
265 f.seek(0)
266 return self.repo.run(self.gc.intern_f, f)
267
268 def testIndata(self):
269 data = 'WayCOOL SuperTest!'
270 data_hash = self.repo.run(
271 self.gc.run, 'hash-object', '-t', 'blob', '--stdin', indata=data)
272 self.assertEquals(data_hash, git_test_utils.git_hash_data(data))
273
274 def testInternF(self):
275 data = "CoolBobcatsBro"
276 data_hash = self._intern_data(data)
277 self.assertEquals(git_test_utils.git_hash_data(data), data_hash)
278 self.assertEquals(data, self.repo.git('cat-file', 'blob', data_hash).stdout)
279
280 def testMkTree(self):
281 tree = {}
282 for i in 1, 2, 3:
283 name = 'file%d' % i
284 tree[name] = ('100644', 'blob', self._intern_data(name))
285 tree_hash = self.repo.run(self.gc.mktree, tree)
286 self.assertEquals('37b61866d6e061c4ba478e7eb525be7b5752737d', tree_hash)
287
288
289 if __name__ == '__main__':
290 sys.exit(coverage_utils.covered_main(
291 os.path.join(DEPOT_TOOLS_ROOT, 'git_common.py')
292 ))
OLDNEW
« git_common.py ('K') | « testing_support/git_test_utils.py ('k') | tests/git_number_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698