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

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

Powered by Google App Engine
This is Rietveld 408576698