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

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: Add version checking for coverage module 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
« no previous file with comments | « testing_support/git_test_utils.py ('k') | tests/git_number_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 coverage_utils
21 from testing_support import git_test_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 return val * 2 if val % 2 == 0 else 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(threadsafe=threadsafe)(double_if_even)
41
42 self.assertEqual(4, double_if_even(2))
43 self.assertEqual(4, double_if_even(2))
44 self.assertEqual(None, double_if_even(1))
45 self.assertEqual(None, double_if_even(1))
46 self.assertDictEqual({1: 2, 2: 1}, calls)
47
48 double_if_even.set(10, 20)
49 self.assertEqual(20, double_if_even(10))
50 self.assertDictEqual({1: 2, 2: 1}, calls)
51
52 double_if_even.clear()
53 self.assertEqual(4, double_if_even(2))
54 self.assertEqual(4, double_if_even(2))
55 self.assertEqual(None, double_if_even(1))
56 self.assertEqual(None, double_if_even(1))
57 self.assertEqual(20, double_if_even(10))
58 self.assertDictEqual({1: 4, 2: 2, 10: 1}, calls)
59
60 def testMemoizeOne(self):
61 self._testMemoizeOneBody(threadsafe=False)
62
63 def testMemoizeOneThreadsafe(self):
64 self._testMemoizeOneBody(threadsafe=True)
65
66
67 def slow_square(i):
68 """Helper for ScopedPoolTest.
69
70 Must be global because non top-level functions aren't pickleable.
71 """
72 return i ** 2
73
74
75 class ScopedPoolTest(GitCommonTestBase):
76 CTRL_C = signal.CTRL_C_EVENT if sys.platform == 'win32' else signal.SIGINT
77
78 def testThreads(self):
79 result = []
80 with self.gc.ScopedPool(kind='threads') as pool:
81 result = list(pool.imap(slow_square, xrange(10)))
82 self.assertEqual([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], result)
83
84 def testThreadsCtrlC(self):
85 result = []
86 with self.assertRaises(KeyboardInterrupt):
87 with self.gc.ScopedPool(kind='threads') as pool:
88 # Make sure this pool is interrupted in mid-swing
89 for i in pool.imap(slow_square, xrange(1000000)):
90 if i > 32:
91 os.kill(os.getpid(), self.CTRL_C)
92 result.append(i)
93 self.assertEqual([0, 1, 4, 9, 16, 25], result)
94
95 def testProcs(self):
96 result = []
97 with self.gc.ScopedPool() as pool:
98 result = list(pool.imap(slow_square, xrange(10)))
99 self.assertEqual([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], result)
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([0, 1, 4, 9, 16, 25], result)
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 @unittest.expectedFailure
126 def testBasic(self):
127 """This test is probably racy, but I don't have a better alternative."""
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 for _ in xrange(10):
134 time.sleep(0.02)
135 inc()
136
137 filtered = set(x.strip() for x in stream.data)
138 rslt = set(fmt % {'count': i} for i in xrange(11))
139 self.assertSetEqual(filtered, rslt)
140 self.assertGreaterEqual(stream.count, 10)
141
142
143 class GitReadOnlyFunctionsTest(git_test_utils.GitRepoReadOnlyTestBase,
144 GitCommonTestBase):
145 REPO = """
146 A B C D
147 B E D
148 """
149
150 COMMIT_A = {
151 'some/files/file1': {'data': 'file1'},
152 'some/files/file2': {'data': 'file2'},
153 'some/files/file3': {'data': 'file3'},
154 'some/other/file': {'data': 'otherfile'},
155 }
156
157 COMMIT_C = {
158 'some/files/file2': {
159 'mode': 0755,
160 'data': 'file2 - vanilla'},
161 }
162
163 COMMIT_E = {
164 'some/files/file2': {'data': 'file2 - merged'},
165 }
166
167 COMMIT_D = {
168 'some/files/file2': {'data': 'file2 - vanilla\nfile2 - merged'},
169 }
170
171 def testHashes(self):
172 ret = self.repo.run(
173 self.gc.hashes, *[
174 'master',
175 'master~3',
176 self.repo['E']+'~',
177 self.repo['D']+'^2',
178 'tag_C^{}',
179 ]
180 )
181 self.assertEqual([
182 self.repo['D'],
183 self.repo['A'],
184 self.repo['B'],
185 self.repo['E'],
186 self.repo['C'],
187 ], ret)
188
189 def testParseCommitrefs(self):
190 ret = self.repo.run(
191 self.gc.parse_commitrefs, *[
192 'master',
193 'master~3',
194 self.repo['E']+'~',
195 self.repo['D']+'^2',
196 'tag_C^{}',
197 ]
198 )
199 self.assertEqual(ret, map(binascii.unhexlify, [
200 self.repo['D'],
201 self.repo['A'],
202 self.repo['B'],
203 self.repo['E'],
204 self.repo['C'],
205 ]))
206
207 with self.assertRaisesRegexp(Exception, r"one of \('master', 'bananas'\)"):
208 self.repo.run(self.gc.parse_commitrefs, 'master', 'bananas')
209
210 def testTree(self):
211 tree = self.repo.run(self.gc.tree, 'master:some/files')
212 file1 = self.COMMIT_A['some/files/file1']['data']
213 file2 = self.COMMIT_D['some/files/file2']['data']
214 file3 = self.COMMIT_A['some/files/file3']['data']
215 self.assertEquals(
216 tree['file1'],
217 ('100644', 'blob', git_test_utils.git_hash_data(file1)))
218 self.assertEquals(
219 tree['file2'],
220 ('100755', 'blob', git_test_utils.git_hash_data(file2)))
221 self.assertEquals(
222 tree['file3'],
223 ('100644', 'blob', git_test_utils.git_hash_data(file3)))
224
225 tree = self.repo.run(self.gc.tree, 'master:some')
226 self.assertEquals(len(tree), 2)
227 # Don't check the tree hash because we're lazy :)
228 self.assertEquals(tree['files'][:2], ('040000', 'tree'))
229
230 tree = self.repo.run(self.gc.tree, 'master:wat')
231 self.assertEqual(tree, None)
232
233 def testTreeRecursive(self):
234 tree = self.repo.run(self.gc.tree, 'master:some', recurse=True)
235 file1 = self.COMMIT_A['some/files/file1']['data']
236 file2 = self.COMMIT_D['some/files/file2']['data']
237 file3 = self.COMMIT_A['some/files/file3']['data']
238 other = self.COMMIT_A['some/other/file']['data']
239 self.assertEquals(
240 tree['files/file1'],
241 ('100644', 'blob', git_test_utils.git_hash_data(file1)))
242 self.assertEquals(
243 tree['files/file2'],
244 ('100755', 'blob', git_test_utils.git_hash_data(file2)))
245 self.assertEquals(
246 tree['files/file3'],
247 ('100644', 'blob', git_test_utils.git_hash_data(file3)))
248 self.assertEquals(
249 tree['other/file'],
250 ('100644', 'blob', git_test_utils.git_hash_data(other)))
251
252
253 class GitMutableFunctionsTest(git_test_utils.GitRepoReadWriteTestBase,
254 GitCommonTestBase):
255 REPO = ''
256
257 def _intern_data(self, data):
258 with tempfile.TemporaryFile() as f:
259 f.write(data)
260 f.seek(0)
261 return self.repo.run(self.gc.intern_f, f)
262
263 def testInternF(self):
264 data = 'CoolBobcatsBro'
265 data_hash = self._intern_data(data)
266 self.assertEquals(git_test_utils.git_hash_data(data), data_hash)
267 self.assertEquals(data, self.repo.git('cat-file', 'blob', data_hash).stdout)
268
269 def testMkTree(self):
270 tree = {}
271 for i in 1, 2, 3:
272 name = 'file%d' % i
273 tree[name] = ('100644', 'blob', self._intern_data(name))
274 tree_hash = self.repo.run(self.gc.mktree, tree)
275 self.assertEquals('37b61866d6e061c4ba478e7eb525be7b5752737d', tree_hash)
276
277
278 if __name__ == '__main__':
279 sys.exit(coverage_utils.covered_main(
280 os.path.join(DEPOT_TOOLS_ROOT, 'git_common.py')
281 ))
OLDNEW
« no previous file with comments | « 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