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

Side by Side Diff: tests/patch_test.py

Issue 7054048: Increase coverage to 91%; Much stricter about header parsing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Address review comments Created 9 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « tests/checkout_test.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Unit tests for patch.py.""" 6 """Unit tests for patch.py."""
7 7
8 import logging
8 import os 9 import os
9 import sys 10 import sys
10 import unittest 11 import unittest
11 12
12 ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) 13 ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
13 sys.path.insert(0, os.path.join(ROOT_DIR, '..')) 14 sys.path.insert(0, os.path.join(ROOT_DIR, '..'))
14 15
15 import patch 16 import patch
16 17
17 18
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 GIT_NEW = ( 119 GIT_NEW = (
119 'diff --git a/foo b/foo\n' 120 'diff --git a/foo b/foo\n'
120 'new file mode 100644\n' 121 'new file mode 100644\n'
121 'index 0000000..5716ca5\n' 122 'index 0000000..5716ca5\n'
122 '--- /dev/null\n' 123 '--- /dev/null\n'
123 '+++ b/foo\n' 124 '+++ b/foo\n'
124 '@@ -0,0 +1 @@\n' 125 '@@ -0,0 +1 @@\n'
125 '+bar\n') 126 '+bar\n')
126 127
127 128
129 NEW = (
130 '--- /dev/null\n'
131 '+++ foo\n'
132 '@@ -0,0 +1 @@\n'
133 '+bar\n')
134
135
128 class PatchTest(unittest.TestCase): 136 class PatchTest(unittest.TestCase):
129 def testFilePatchDelete(self): 137 def testFilePatchDelete(self):
130 c = patch.FilePatchDelete('foo', False) 138 c = patch.FilePatchDelete('foo', False)
139 self.assertEquals(c.filename, 'foo')
140 self.assertEquals(c.is_binary, False)
131 self.assertEquals(c.is_delete, True) 141 self.assertEquals(c.is_delete, True)
132 self.assertEquals(c.is_binary, False) 142 self.assertEquals(c.is_new, False)
133 self.assertEquals(c.filename, 'foo')
134 try: 143 try:
135 c.get() 144 c.get()
136 self.fail() 145 self.fail()
137 except NotImplementedError: 146 except NotImplementedError:
138 pass 147 pass
139 c = patch.FilePatchDelete('foo', True) 148 c = patch.FilePatchDelete('foo', True)
149 self.assertEquals(c.filename, 'foo')
150 self.assertEquals(c.is_binary, True)
140 self.assertEquals(c.is_delete, True) 151 self.assertEquals(c.is_delete, True)
141 self.assertEquals(c.is_binary, True) 152 self.assertEquals(c.is_new, False)
142 self.assertEquals(c.filename, 'foo')
143 try: 153 try:
144 c.get() 154 c.get()
145 self.fail() 155 self.fail()
146 except NotImplementedError: 156 except NotImplementedError:
147 pass 157 pass
148 158
149 def testFilePatchBinary(self): 159 def testFilePatchBinary(self):
150 c = patch.FilePatchBinary('foo', 'data', []) 160 c = patch.FilePatchBinary('foo', 'data', [], is_new=False)
161 self.assertEquals(c.filename, 'foo')
162 self.assertEquals(c.is_binary, True)
151 self.assertEquals(c.is_delete, False) 163 self.assertEquals(c.is_delete, False)
164 self.assertEquals(c.is_new, False)
165 self.assertEquals(c.get(), 'data')
166
167 def testFilePatchBinaryNew(self):
168 c = patch.FilePatchBinary('foo', 'data', [], is_new=True)
169 self.assertEquals(c.filename, 'foo')
152 self.assertEquals(c.is_binary, True) 170 self.assertEquals(c.is_binary, True)
153 self.assertEquals(c.filename, 'foo') 171 self.assertEquals(c.is_delete, False)
172 self.assertEquals(c.is_new, True)
154 self.assertEquals(c.get(), 'data') 173 self.assertEquals(c.get(), 'data')
155 174
156 def testFilePatchDiff(self): 175 def testFilePatchDiff(self):
157 c = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []) 176 c = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, [])
177 self.assertEquals(c.filename, 'chrome/file.cc')
178 self.assertEquals(c.is_binary, False)
158 self.assertEquals(c.is_delete, False) 179 self.assertEquals(c.is_delete, False)
159 self.assertEquals(c.is_binary, False)
160 self.assertEquals(c.filename, 'chrome/file.cc')
161 self.assertEquals(c.is_git_diff, False) 180 self.assertEquals(c.is_git_diff, False)
181 self.assertEquals(c.is_new, False)
162 self.assertEquals(c.patchlevel, 0) 182 self.assertEquals(c.patchlevel, 0)
163 self.assertEquals(c.get(), SVN_PATCH) 183 self.assertEquals(c.get(), SVN_PATCH)
184
185 def testFilePatchDiffHeaderMode(self):
164 diff = ( 186 diff = (
165 'diff --git a/git_cl/git-cl b/git_cl/git-cl\n' 187 'diff --git a/git_cl/git-cl b/git_cl/git-cl\n'
166 'old mode 100644\n' 188 'old mode 100644\n'
167 'new mode 100755\n') 189 'new mode 100755\n')
168 c = patch.FilePatchDiff('git_cl/git-cl', diff, []) 190 c = patch.FilePatchDiff('git_cl/git-cl', diff, [])
191 self.assertEquals(c.filename, 'git_cl/git-cl')
192 self.assertEquals(c.is_binary, False)
169 self.assertEquals(c.is_delete, False) 193 self.assertEquals(c.is_delete, False)
170 self.assertEquals(c.is_binary, False)
171 self.assertEquals(c.filename, 'git_cl/git-cl')
172 self.assertEquals(c.is_git_diff, True) 194 self.assertEquals(c.is_git_diff, True)
195 self.assertEquals(c.is_new, False)
173 self.assertEquals(c.patchlevel, 1) 196 self.assertEquals(c.patchlevel, 1)
174 self.assertEquals(c.get(), diff) 197 self.assertEquals(c.get(), diff)
198
199 def testFilePatchDiffHeaderModeIndex(self):
175 diff = ( 200 diff = (
176 'Index: Junk\n' 201 'Index: Junk\n'
177 'diff --git a/git_cl/git-cl b/git_cl/git-cl\n' 202 'diff --git a/git_cl/git-cl b/git_cl/git-cl\n'
178 'old mode 100644\n' 203 'old mode 100644\n'
179 'new mode 100755\n') 204 'new mode 100755\n')
180 c = patch.FilePatchDiff('git_cl/git-cl', diff, []) 205 c = patch.FilePatchDiff('git_cl/git-cl', diff, [])
206 self.assertEquals(c.filename, 'git_cl/git-cl')
207 self.assertEquals(c.is_binary, False)
181 self.assertEquals(c.is_delete, False) 208 self.assertEquals(c.is_delete, False)
182 self.assertEquals(c.is_binary, False)
183 self.assertEquals(c.filename, 'git_cl/git-cl')
184 self.assertEquals(c.is_git_diff, True) 209 self.assertEquals(c.is_git_diff, True)
210 self.assertEquals(c.is_new, False)
185 self.assertEquals(c.patchlevel, 1) 211 self.assertEquals(c.patchlevel, 1)
186 self.assertEquals(c.get(), diff) 212 self.assertEquals(c.get(), diff)
187 213
188 def testFilePatchBadDiff(self): 214 def testFilePatchDiffSvnNew(self):
215 # The code path is different for git and svn.
216 c = patch.FilePatchDiff('foo', NEW, [])
217 self.assertEquals(c.filename, 'foo')
218 self.assertEquals(c.is_binary, False)
219 self.assertEquals(c.is_delete, False)
220 self.assertEquals(c.is_git_diff, False)
221 self.assertEquals(c.is_new, True)
222 self.assertEquals(c.patchlevel, 0)
223 self.assertEquals(c.get(), NEW)
224
225 def testFilePatchDiffGitNew(self):
226 # The code path is different for git and svn.
227 c = patch.FilePatchDiff('foo', GIT_NEW, [])
228 self.assertEquals(c.filename, 'foo')
229 self.assertEquals(c.is_binary, False)
230 self.assertEquals(c.is_delete, False)
231 self.assertEquals(c.is_git_diff, True)
232 self.assertEquals(c.is_new, True)
233 self.assertEquals(c.patchlevel, 1)
234 self.assertEquals(c.get(), GIT_NEW)
235
236 def testFilePatchDiffBad(self):
189 try: 237 try:
190 patch.FilePatchDiff('foo', 'data', []) 238 patch.FilePatchDiff('foo', 'data', [])
191 self.fail() 239 self.fail()
192 except patch.UnsupportedPatchFormat: 240 except patch.UnsupportedPatchFormat:
193 pass 241 pass
194 242
195 def testFilePatchNoDiff(self): 243 def testFilePatchDiffEmpty(self):
196 try: 244 try:
197 patch.FilePatchDiff('foo', '', []) 245 patch.FilePatchDiff('foo', '', [])
198 self.fail() 246 self.fail()
199 except patch.UnsupportedPatchFormat: 247 except patch.UnsupportedPatchFormat:
200 pass 248 pass
201 249
202 def testFilePatchNoneDiff(self): 250 def testFilePatchDiffNone(self):
203 try: 251 try:
204 patch.FilePatchDiff('foo', None, []) 252 patch.FilePatchDiff('foo', None, [])
205 self.fail() 253 self.fail()
206 except patch.UnsupportedPatchFormat: 254 except patch.UnsupportedPatchFormat:
207 pass 255 pass
208 256
209 def testFilePatchBadDiffName(self): 257 def testFilePatchBadDiffName(self):
210 try: 258 try:
211 patch.FilePatchDiff('foo', SVN_PATCH, []) 259 patch.FilePatchDiff('foo', SVN_PATCH, [])
212 self.fail() 260 self.fail()
261 except patch.UnsupportedPatchFormat, e:
262 self.assertEquals(
263 "Can't process patch for file foo.\nUnexpected diff: chrome/file.cc.",
264 str(e))
265
266 def testFilePatchDiffBadHeader(self):
267 try:
268 diff = (
269 '+++ b/foo\n'
270 '@@ -0,0 +1 @@\n'
271 '+bar\n')
272 patch.FilePatchDiff('foo', diff, [])
273 self.fail()
213 except patch.UnsupportedPatchFormat: 274 except patch.UnsupportedPatchFormat:
214 pass 275 pass
215 276
216 def testInvalidFilePatchDiffGit(self): 277 def testFilePatchDiffBadGitHeader(self):
278 try:
279 diff = (
280 'diff --git a/foo b/foo\n'
281 '+++ b/foo\n'
282 '@@ -0,0 +1 @@\n'
283 '+bar\n')
284 patch.FilePatchDiff('foo', diff, [])
285 self.fail()
286 except patch.UnsupportedPatchFormat:
287 pass
288
289 def testFilePatchDiffBadHeaderReversed(self):
290 try:
291 diff = (
292 '+++ b/foo\n'
293 '--- b/foo\n'
294 '@@ -0,0 +1 @@\n'
295 '+bar\n')
296 patch.FilePatchDiff('foo', diff, [])
297 self.fail()
298 except patch.UnsupportedPatchFormat:
299 pass
300
301 def testFilePatchDiffGitBadHeaderReversed(self):
302 try:
303 diff = (
304 'diff --git a/foo b/foo\n'
305 '+++ b/foo\n'
306 '--- b/foo\n'
307 '@@ -0,0 +1 @@\n'
308 '+bar\n')
309 patch.FilePatchDiff('foo', diff, [])
310 self.fail()
311 except patch.UnsupportedPatchFormat:
312 pass
313
314 def testFilePatchDiffInvalidGit(self):
217 try: 315 try:
218 patch.FilePatchDiff('svn_utils_test.txt', ( 316 patch.FilePatchDiff('svn_utils_test.txt', (
219 'diff --git a/tests/svn_utils_test_data/svn_utils_test.txt ' 317 'diff --git a/tests/svn_utils_test_data/svn_utils_test.txt '
220 'b/tests/svn_utils_test_data/svn_utils_test.txt\n' 318 'b/tests/svn_utils_test_data/svn_utils_test.txt\n'
221 'index 0e4de76..8320059 100644\n' 319 'index 0e4de76..8320059 100644\n'
222 '--- a/svn_utils_test.txt\n' 320 '--- a/svn_utils_test.txt\n'
223 '+++ b/svn_utils_test.txt\n' 321 '+++ b/svn_utils_test.txt\n'
224 '@@ -3,6 +3,7 @@ bb\n' 322 '@@ -3,6 +3,7 @@ bb\n'
225 'ccc\n' 323 'ccc\n'
226 'dd\n' 324 'dd\n'
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []), 382 patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []),
285 patch.FilePatchDiff( 383 patch.FilePatchDiff(
286 'tools\\clang_check/README.chromium', GIT_DELETE, []), 384 'tools\\clang_check/README.chromium', GIT_DELETE, []),
287 patch.FilePatchDiff('tools/run_local_server.sh', GIT_RENAME, []), 385 patch.FilePatchDiff('tools/run_local_server.sh', GIT_RENAME, []),
288 patch.FilePatchDiff( 386 patch.FilePatchDiff(
289 'chrome\\browser/chromeos/views/webui_menu_widget.h', 387 'chrome\\browser/chromeos/views/webui_menu_widget.h',
290 GIT_RENAME_PARTIAL, []), 388 GIT_RENAME_PARTIAL, []),
291 patch.FilePatchDiff('pp', GIT_COPY, []), 389 patch.FilePatchDiff('pp', GIT_COPY, []),
292 patch.FilePatchDiff('foo', GIT_NEW, []), 390 patch.FilePatchDiff('foo', GIT_NEW, []),
293 patch.FilePatchDelete('other/place/foo', True), 391 patch.FilePatchDelete('other/place/foo', True),
294 patch.FilePatchBinary('bar', 'data', []), 392 patch.FilePatchBinary('bar', 'data', [], is_new=False),
295 ]) 393 ])
296 expected = [ 394 expected = [
297 'chrome/file.cc', 'tools/clang_check/README.chromium', 395 'chrome/file.cc', 'tools/clang_check/README.chromium',
298 'tools/run_local_server.sh', 396 'tools/run_local_server.sh',
299 'chrome/browser/chromeos/views/webui_menu_widget.h', 'pp', 'foo', 397 'chrome/browser/chromeos/views/webui_menu_widget.h', 'pp', 'foo',
300 'other/place/foo', 'bar'] 398 'other/place/foo', 'bar']
301 self.assertEquals(expected, patches.filenames) 399 self.assertEquals(expected, patches.filenames)
302 orig_name = patches.patches[0].filename 400 orig_name = patches.patches[0].filename
303 patches.set_relpath(os.path.join('a', 'bb')) 401 patches.set_relpath(os.path.join('a', 'bb'))
304 expected = [os.path.join('a', 'bb', x) for x in expected] 402 expected = [os.path.join('a', 'bb', x) for x in expected]
(...skipping 14 matching lines...) Expand all
319 patches = patch.PatchSet([ 417 patches = patch.PatchSet([
320 patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []), 418 patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []),
321 patch.FilePatchDelete('other\\place\\foo', True), 419 patch.FilePatchDelete('other\\place\\foo', True),
322 ]) 420 ])
323 try: 421 try:
324 patches.set_relpath('..') 422 patches.set_relpath('..')
325 self.fail() 423 self.fail()
326 except patch.UnsupportedPatchFormat: 424 except patch.UnsupportedPatchFormat:
327 pass 425 pass
328 426
427 def testRelPathEmpty(self):
428 patches = patch.PatchSet([
429 patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []),
430 patch.FilePatchDelete('other\\place\\foo', True),
431 ])
432 patches.set_relpath('')
433 self.assertEquals(
434 ['chrome/file.cc', 'other/place/foo'],
435 [f.filename for f in patches])
436
329 def testBackSlash(self): 437 def testBackSlash(self):
330 mangled_patch = SVN_PATCH.replace('chrome/', 'chrome\\') 438 mangled_patch = SVN_PATCH.replace('chrome/', 'chrome\\')
331 patches = patch.PatchSet([ 439 patches = patch.PatchSet([
332 patch.FilePatchDiff('chrome\\file.cc', mangled_patch, []), 440 patch.FilePatchDiff('chrome\\file.cc', mangled_patch, []),
333 patch.FilePatchDelete('other\\place\\foo', True), 441 patch.FilePatchDelete('other\\place\\foo', True),
334 ]) 442 ])
335 expected = ['chrome/file.cc', 'other/place/foo'] 443 expected = ['chrome/file.cc', 'other/place/foo']
336 self.assertEquals(expected, patches.filenames) 444 self.assertEquals(expected, patches.filenames)
337 self.assertEquals(SVN_PATCH, patches.patches[0].get()) 445 self.assertEquals(SVN_PATCH, patches.patches[0].get())
338 446
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 '--- /dev/null\n' 508 '--- /dev/null\n'
401 '+++ b/natsort_test.py\n' 509 '+++ b/natsort_test.py\n'
402 '@@ -0,0 +1,1 @@\n' 510 '@@ -0,0 +1,1 @@\n'
403 '+#!/usr/bin/env python\n') 511 '+#!/usr/bin/env python\n')
404 self.assertEquals( 512 self.assertEquals(
405 [('svn:executable', '*')], 513 [('svn:executable', '*')],
406 patch.FilePatchDiff('natsort_test.py', diff, []).svn_properties) 514 patch.FilePatchDiff('natsort_test.py', diff, []).svn_properties)
407 515
408 516
409 if __name__ == '__main__': 517 if __name__ == '__main__':
518 logging.basicConfig(level=
519 [logging.WARNING, logging.INFO, logging.DEBUG][
520 min(2, sys.argv.count('-v'))])
410 unittest.main() 521 unittest.main()
OLDNEW
« no previous file with comments | « tests/checkout_test.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698