| OLD | NEW |
| 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 logging |
| 9 import os | 9 import os |
| 10 import sys | 10 import sys |
| 11 import unittest | 11 import unittest |
| 12 | 12 |
| 13 ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) | 13 ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| 14 sys.path.insert(0, os.path.join(ROOT_DIR, '..')) | 14 sys.path.insert(0, os.path.join(ROOT_DIR, '..')) |
| 15 | 15 |
| 16 import patch | 16 import patch |
| 17 | 17 from tests.patches_data import GIT, RAW |
| 18 | |
| 19 SVN_PATCH = ( | |
| 20 'Index: chrome/file.cc\n' | |
| 21 '===================================================================\n' | |
| 22 '--- chrome/file.cc\t(revision 74690)\n' | |
| 23 '+++ chrome/file.cc\t(working copy)\n' | |
| 24 '@@ -80,10 +80,13 @@\n' | |
| 25 ' // Foo\n' | |
| 26 ' // Bar\n' | |
| 27 ' void foo() {\n' | |
| 28 '- return bar;\n' | |
| 29 '+ return foo;\n' | |
| 30 ' }\n' | |
| 31 ' \n' | |
| 32 ' \n') | |
| 33 | |
| 34 | |
| 35 GIT_PATCH = ( | |
| 36 'diff --git a/chrome/file.cc b/chrome/file.cc\n' | |
| 37 'index 0e4de76..8320059 100644\n' | |
| 38 '--- a/chrome/file.cc\n' | |
| 39 '+++ b/chrome/file.cc\n' | |
| 40 '@@ -3,6 +3,7 @@ bb\n' | |
| 41 ' ccc\n' | |
| 42 ' dd\n' | |
| 43 ' e\n' | |
| 44 '+FOO!\n' | |
| 45 ' ff\n' | |
| 46 ' ggg\n' | |
| 47 ' hh\n') | |
| 48 | |
| 49 | |
| 50 # http://codereview.chromium.org/download/issue6368055_22_29.diff | |
| 51 GIT_DELETE = ( | |
| 52 'Index: tools/clang_check/README.chromium\n' | |
| 53 'diff --git a/tools/clang_check/README.chromium ' | |
| 54 'b/tools/clang_check/README.chromium\n' | |
| 55 'deleted file mode 100644\n' | |
| 56 'index fcaa7e0e94bb604a026c4f478fecb1c5796f5413..' | |
| 57 '0000000000000000000000000000000000000000\n' | |
| 58 '--- a/tools/clang_check/README.chromium\n' | |
| 59 '+++ /dev/null\n' | |
| 60 '@@ -1,9 +0,0 @@\n' | |
| 61 '-These are terrible, terrible hacks.\n' | |
| 62 '-\n' | |
| 63 '-They are meant to be temporary. clang currently doesn\'t allow running a ' | |
| 64 'plugin\n' | |
| 65 '-AND doing the normal codegen process. We want our syntax complaining ' | |
| 66 'plugins to\n' | |
| 67 '-run during normal compile, but for now, you can user run_plugin.sh to ' | |
| 68 'hack the\n' | |
| 69 '-build system to do a syntax check.\n' | |
| 70 '-\n' | |
| 71 '-Also see http://code.google.com/p/chromium/wiki/WritingClangPlugins\n' | |
| 72 '-\n') | |
| 73 | |
| 74 | |
| 75 # http://codereview.chromium.org/download/issue6250123_3013_6010.diff | |
| 76 GIT_RENAME_PARTIAL = ( | |
| 77 'Index: chromeos/views/webui_menu_widget.h\n' | |
| 78 'diff --git a/chromeos/views/DOMui_menu_widget.h ' | |
| 79 'b/chromeos/views/webui_menu_widget.h\n' | |
| 80 'similarity index 79%\n' | |
| 81 'rename from chromeos/views/DOMui_menu_widget.h\n' | |
| 82 'rename to chromeos/views/webui_menu_widget.h\n' | |
| 83 'index 095d4c474fd9718f5aebfa41a1ccb2d951356d41..' | |
| 84 '157925075434b590e8acaaf605a64f24978ba08b 100644\n' | |
| 85 '--- a/chromeos/views/DOMui_menu_widget.h\n' | |
| 86 '+++ b/chromeos/views/webui_menu_widget.h\n' | |
| 87 '@@ -1,9 +1,9 @@\n' | |
| 88 '-// Copyright (c) 2010 The Chromium Authors. All rights reserved.\n' | |
| 89 '+// Copyright (c) 2011 The Chromium Authors. All rights reserved.\n' | |
| 90 ' // Use of this source code is governed by a BSD-style license that can be' | |
| 91 '\n' | |
| 92 ' // found in the LICENSE file.\n' | |
| 93 ' \n' | |
| 94 '-#ifndef CHROME_BROWSER_CHROMEOS_VIEWS_DOMUI_MENU_WIDGET_H_\n' | |
| 95 '-#define CHROME_BROWSER_CHROMEOS_VIEWS_DOMUI_MENU_WIDGET_H_\n' | |
| 96 '+#ifndef CHROME_BROWSER_CHROMEOS_VIEWS_WEBUI_MENU_WIDGET_H_\n' | |
| 97 '+#define CHROME_BROWSER_CHROMEOS_VIEWS_WEBUI_MENU_WIDGET_H_\n' | |
| 98 ' #pragma once\n' | |
| 99 ' \n' | |
| 100 ' #include <string>\n') | |
| 101 | |
| 102 | |
| 103 # http://codereview.chromium.org/download/issue6287022_3001_4010.diff | |
| 104 GIT_RENAME = ( | |
| 105 'Index: tools/run_local_server.sh\n' | |
| 106 'diff --git a/tools/run_local_server.PY b/tools/run_local_server.sh\n' | |
| 107 'similarity index 100%\n' | |
| 108 'rename from tools/run_local_server.PY\n' | |
| 109 'rename to tools/run_local_server.sh\n') | |
| 110 | |
| 111 | |
| 112 GIT_COPY = ( | |
| 113 'diff --git a/PRESUBMIT.py b/pp\n' | |
| 114 'similarity index 100%\n' | |
| 115 'copy from PRESUBMIT.py\n' | |
| 116 'copy to pp\n') | |
| 117 | |
| 118 | |
| 119 GIT_NEW = ( | |
| 120 'diff --git a/foo b/foo\n' | |
| 121 'new file mode 100644\n' | |
| 122 'index 0000000..5716ca5\n' | |
| 123 '--- /dev/null\n' | |
| 124 '+++ b/foo\n' | |
| 125 '@@ -0,0 +1 @@\n' | |
| 126 '+bar\n') | |
| 127 | |
| 128 | |
| 129 NEW = ( | |
| 130 '--- /dev/null\n' | |
| 131 '+++ foo\n' | |
| 132 '@@ -0,0 +1 @@\n' | |
| 133 '+bar\n') | |
| 134 | |
| 135 | |
| 136 DELETE = ( | |
| 137 '--- tools/clang_check/README.chromium\n' | |
| 138 '+++ /dev/null\n' | |
| 139 '@@ -1,1 +0,0 @@\n' | |
| 140 '-bar\n') | |
| 141 | 18 |
| 142 | 19 |
| 143 class PatchTest(unittest.TestCase): | 20 class PatchTest(unittest.TestCase): |
| 144 def _check_patch(self, | 21 def _check_patch(self, |
| 145 p, | 22 p, |
| 146 filename, | 23 filename, |
| 147 diff, | 24 diff, |
| 148 source_filename=None, | 25 source_filename=None, |
| 149 is_binary=False, | 26 is_binary=False, |
| 150 is_delete=False, | 27 is_delete=False, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 177 | 54 |
| 178 def testFilePatchBinary(self): | 55 def testFilePatchBinary(self): |
| 179 p = patch.FilePatchBinary('foo', 'data', [], is_new=False) | 56 p = patch.FilePatchBinary('foo', 'data', [], is_new=False) |
| 180 self._check_patch(p, 'foo', 'data', is_binary=True) | 57 self._check_patch(p, 'foo', 'data', is_binary=True) |
| 181 | 58 |
| 182 def testFilePatchBinaryNew(self): | 59 def testFilePatchBinaryNew(self): |
| 183 p = patch.FilePatchBinary('foo', 'data', [], is_new=True) | 60 p = patch.FilePatchBinary('foo', 'data', [], is_new=True) |
| 184 self._check_patch(p, 'foo', 'data', is_binary=True, is_new=True) | 61 self._check_patch(p, 'foo', 'data', is_binary=True, is_new=True) |
| 185 | 62 |
| 186 def testFilePatchDiff(self): | 63 def testFilePatchDiff(self): |
| 187 p = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []) | 64 p = patch.FilePatchDiff('chrome/file.cc', RAW.PATCH, []) |
| 188 self._check_patch(p, 'chrome/file.cc', SVN_PATCH) | 65 self._check_patch(p, 'chrome/file.cc', RAW.PATCH) |
| 189 | 66 |
| 190 def testFilePatchDiffHeaderMode(self): | 67 def testFilePatchDiffHeaderMode(self): |
| 191 diff = ( | 68 p = patch.FilePatchDiff('git_cl/git-cl', GIT.MODE_EXE, []) |
| 192 'diff --git a/git_cl/git-cl b/git_cl/git-cl\n' | |
| 193 'old mode 100644\n' | |
| 194 'new mode 100755\n') | |
| 195 p = patch.FilePatchDiff('git_cl/git-cl', diff, []) | |
| 196 self._check_patch( | 69 self._check_patch( |
| 197 p, 'git_cl/git-cl', diff, is_git_diff=True, patchlevel=1, | 70 p, 'git_cl/git-cl', GIT.MODE_EXE, is_git_diff=True, patchlevel=1, |
| 198 svn_properties=[('svn:executable', '*')]) | 71 svn_properties=[('svn:executable', '*')]) |
| 199 | 72 |
| 200 def testFilePatchDiffHeaderModeIndex(self): | 73 def testFilePatchDiffHeaderModeIndex(self): |
| 201 diff = ( | 74 p = patch.FilePatchDiff('git_cl/git-cl', GIT.MODE_EXE_JUNK, []) |
| 202 'Index: Junk\n' | |
| 203 'diff --git a/git_cl/git-cl b/git_cl/git-cl\n' | |
| 204 'old mode 100644\n' | |
| 205 'new mode 100755\n') | |
| 206 p = patch.FilePatchDiff('git_cl/git-cl', diff, []) | |
| 207 self._check_patch( | 75 self._check_patch( |
| 208 p, 'git_cl/git-cl', diff, is_git_diff=True, patchlevel=1, | 76 p, 'git_cl/git-cl', GIT.MODE_EXE_JUNK, is_git_diff=True, patchlevel=1, |
| 209 svn_properties=[('svn:executable', '*')]) | 77 svn_properties=[('svn:executable', '*')]) |
| 210 | 78 |
| 211 def testFilePatchDiffSvnNew(self): | 79 def testFilePatchDiffSvnNew(self): |
| 212 # The code path is different for git and svn. | 80 # The code path is different for git and svn. |
| 213 p = patch.FilePatchDiff('foo', NEW, []) | 81 p = patch.FilePatchDiff('foo', RAW.NEW, []) |
| 214 self._check_patch(p, 'foo', NEW, is_new=True) | 82 self._check_patch(p, 'foo', RAW.NEW, is_new=True) |
| 215 | 83 |
| 216 def testFilePatchDiffGitNew(self): | 84 def testFilePatchDiffGitNew(self): |
| 217 # The code path is different for git and svn. | 85 # The code path is different for git and svn. |
| 218 p = patch.FilePatchDiff('foo', GIT_NEW, []) | 86 p = patch.FilePatchDiff('foo', GIT.NEW, []) |
| 219 self._check_patch( | 87 self._check_patch( |
| 220 p, 'foo', GIT_NEW, is_new=True, is_git_diff=True, patchlevel=1) | 88 p, 'foo', GIT.NEW, is_new=True, is_git_diff=True, patchlevel=1) |
| 221 | 89 |
| 222 def testValidSvn(self): | 90 def testValidSvn(self): |
| 223 # pylint: disable=R0201 | 91 # pylint: disable=R0201 |
| 224 # Method could be a function | 92 # Method could be a function |
| 225 # Should not throw. | 93 # Should not throw. |
| 226 p = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []) | 94 p = patch.FilePatchDiff('chrome/file.cc', RAW.PATCH, []) |
| 227 lines = SVN_PATCH.splitlines(True) | 95 lines = RAW.PATCH.splitlines(True) |
| 228 header = ''.join(lines[:4]) | 96 header = ''.join(lines[:4]) |
| 229 hunks = ''.join(lines[4:]) | 97 hunks = ''.join(lines[4:]) |
| 230 self.assertEquals(header, p.diff_header) | 98 self.assertEquals(header, p.diff_header) |
| 231 self.assertEquals(hunks, p.diff_hunks) | 99 self.assertEquals(hunks, p.diff_hunks) |
| 232 self.assertEquals(SVN_PATCH, p.get()) | 100 self.assertEquals(RAW.PATCH, p.get()) |
| 233 | 101 |
| 234 def testValidSvnNew(self): | 102 def testValidSvnNew(self): |
| 235 text = '--- /dev/null\t2\n+++ chrome/file.cc\tfoo\n' | 103 p = patch.FilePatchDiff('chrome/file.cc', RAW.MINIMAL_NEW, []) |
| 236 p = patch.FilePatchDiff('chrome/file.cc', text, []) | 104 self.assertEquals(RAW.MINIMAL_NEW, p.diff_header) |
| 237 self.assertEquals(text, p.diff_header) | |
| 238 self.assertEquals('', p.diff_hunks) | 105 self.assertEquals('', p.diff_hunks) |
| 239 self.assertEquals(text, p.get()) | 106 self.assertEquals(RAW.MINIMAL_NEW, p.get()) |
| 240 | 107 |
| 241 def testValidSvnDelete(self): | 108 def testValidSvnDelete(self): |
| 242 text = '--- chrome/file.cc\tbar\n+++ /dev/null\tfoo\n' | 109 p = patch.FilePatchDiff('chrome/file.cc', RAW.MINIMAL_DELETE, []) |
| 243 p = patch.FilePatchDiff('chrome/file.cc', text, []) | 110 self.assertEquals(RAW.MINIMAL_DELETE, p.diff_header) |
| 244 self.assertEquals(text, p.diff_header) | |
| 245 self.assertEquals('', p.diff_hunks) | 111 self.assertEquals('', p.diff_hunks) |
| 246 self.assertEquals(text, p.get()) | 112 self.assertEquals(RAW.MINIMAL_DELETE, p.get()) |
| 247 | 113 |
| 248 def testRelPath(self): | 114 def testRelPath(self): |
| 249 patches = patch.PatchSet([ | 115 patches = patch.PatchSet([ |
| 250 patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []), | 116 patch.FilePatchDiff('chrome/file.cc', RAW.PATCH, []), |
| 251 patch.FilePatchDiff( | 117 patch.FilePatchDiff( |
| 252 'tools\\clang_check/README.chromium', GIT_DELETE, []), | 118 'tools\\clang_check/README.chromium', GIT.DELETE, []), |
| 253 patch.FilePatchDiff('tools/run_local_server.sh', GIT_RENAME, []), | 119 patch.FilePatchDiff('tools/run_local_server.sh', GIT.RENAME, []), |
| 254 patch.FilePatchDiff( | 120 patch.FilePatchDiff( |
| 255 'chromeos\\views/webui_menu_widget.h', GIT_RENAME_PARTIAL, []), | 121 'chromeos\\views/webui_menu_widget.h', GIT.RENAME_PARTIAL, []), |
| 256 patch.FilePatchDiff('pp', GIT_COPY, []), | 122 patch.FilePatchDiff('pp', GIT.COPY, []), |
| 257 patch.FilePatchDiff('foo', GIT_NEW, []), | 123 patch.FilePatchDiff('foo', GIT.NEW, []), |
| 258 patch.FilePatchDelete('other/place/foo', True), | 124 patch.FilePatchDelete('other/place/foo', True), |
| 259 patch.FilePatchBinary('bar', 'data', [], is_new=False), | 125 patch.FilePatchBinary('bar', 'data', [], is_new=False), |
| 260 ]) | 126 ]) |
| 261 expected = [ | 127 expected = [ |
| 262 'chrome/file.cc', 'tools/clang_check/README.chromium', | 128 'chrome/file.cc', 'tools/clang_check/README.chromium', |
| 263 'tools/run_local_server.sh', | 129 'tools/run_local_server.sh', |
| 264 'chromeos/views/webui_menu_widget.h', 'pp', 'foo', | 130 'chromeos/views/webui_menu_widget.h', 'pp', 'foo', |
| 265 'other/place/foo', 'bar'] | 131 'other/place/foo', 'bar'] |
| 266 self.assertEquals(expected, patches.filenames) | 132 self.assertEquals(expected, patches.filenames) |
| 267 orig_name = patches.patches[0].filename | 133 orig_name = patches.patches[0].filename |
| 268 orig_source_name = patches.patches[0].source_filename or orig_name | 134 orig_source_name = patches.patches[0].source_filename or orig_name |
| 269 patches.set_relpath(os.path.join('a', 'bb')) | 135 patches.set_relpath(os.path.join('a', 'bb')) |
| 270 expected = [os.path.join('a', 'bb', x) for x in expected] | 136 expected = [os.path.join('a', 'bb', x) for x in expected] |
| 271 self.assertEquals(expected, patches.filenames) | 137 self.assertEquals(expected, patches.filenames) |
| 272 # Make sure each header is updated accordingly. | 138 # Make sure each header is updated accordingly. |
| 273 header = [] | 139 header = [] |
| 274 new_name = os.path.join('a', 'bb', orig_name) | 140 new_name = os.path.join('a', 'bb', orig_name) |
| 275 new_source_name = os.path.join('a', 'bb', orig_source_name) | 141 new_source_name = os.path.join('a', 'bb', orig_source_name) |
| 276 for line in SVN_PATCH.splitlines(True): | 142 for line in RAW.PATCH.splitlines(True): |
| 277 if line.startswith('@@'): | 143 if line.startswith('@@'): |
| 278 break | 144 break |
| 279 if line[:3] == '---': | 145 if line[:3] == '---': |
| 280 line = line.replace(orig_source_name, new_source_name) | 146 line = line.replace(orig_source_name, new_source_name) |
| 281 if line[:3] == '+++': | 147 if line[:3] == '+++': |
| 282 line = line.replace(orig_name, new_name) | 148 line = line.replace(orig_name, new_name) |
| 283 header.append(line) | 149 header.append(line) |
| 284 header = ''.join(header) | 150 header = ''.join(header) |
| 285 self.assertEquals(header, patches.patches[0].diff_header) | 151 self.assertEquals(header, patches.patches[0].diff_header) |
| 286 | 152 |
| 287 def testRelPathEmpty(self): | 153 def testRelPathEmpty(self): |
| 288 patches = patch.PatchSet([ | 154 patches = patch.PatchSet([ |
| 289 patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []), | 155 patch.FilePatchDiff('chrome\\file.cc', RAW.PATCH, []), |
| 290 patch.FilePatchDelete('other\\place\\foo', True), | 156 patch.FilePatchDelete('other\\place\\foo', True), |
| 291 ]) | 157 ]) |
| 292 patches.set_relpath('') | 158 patches.set_relpath('') |
| 293 self.assertEquals( | 159 self.assertEquals( |
| 294 ['chrome/file.cc', 'other/place/foo'], | 160 ['chrome/file.cc', 'other/place/foo'], |
| 295 [f.filename for f in patches]) | 161 [f.filename for f in patches]) |
| 296 self.assertEquals([None, None], [f.source_filename for f in patches]) | 162 self.assertEquals([None, None], [f.source_filename for f in patches]) |
| 297 | 163 |
| 298 def testBackSlash(self): | 164 def testBackSlash(self): |
| 299 mangled_patch = SVN_PATCH.replace('chrome/', 'chrome\\') | 165 mangled_patch = RAW.PATCH.replace('chrome/', 'chrome\\') |
| 300 patches = patch.PatchSet([ | 166 patches = patch.PatchSet([ |
| 301 patch.FilePatchDiff('chrome\\file.cc', mangled_patch, []), | 167 patch.FilePatchDiff('chrome\\file.cc', mangled_patch, []), |
| 302 patch.FilePatchDelete('other\\place\\foo', True), | 168 patch.FilePatchDelete('other\\place\\foo', True), |
| 303 ]) | 169 ]) |
| 304 expected = ['chrome/file.cc', 'other/place/foo'] | 170 expected = ['chrome/file.cc', 'other/place/foo'] |
| 305 self.assertEquals(expected, patches.filenames) | 171 self.assertEquals(expected, patches.filenames) |
| 306 self.assertEquals(SVN_PATCH, patches.patches[0].get()) | 172 self.assertEquals(RAW.PATCH, patches.patches[0].get()) |
| 307 | 173 |
| 308 def testDelete(self): | 174 def testDelete(self): |
| 309 p = patch.FilePatchDiff('tools/clang_check/README.chromium', DELETE, []) | 175 p = patch.FilePatchDiff('tools/clang_check/README.chromium', RAW.DELETE, []) |
| 310 self._check_patch( | 176 self._check_patch( |
| 311 p, 'tools/clang_check/README.chromium', DELETE, is_delete=True) | 177 p, 'tools/clang_check/README.chromium', RAW.DELETE, is_delete=True) |
| 312 | 178 |
| 313 def testGitDelete(self): | 179 def testGitDelete(self): |
| 314 p = patch.FilePatchDiff('tools/clang_check/README.chromium', GIT_DELETE, []) | 180 p = patch.FilePatchDiff('tools/clang_check/README.chromium', GIT.DELETE, []) |
| 315 self._check_patch( | 181 self._check_patch( |
| 316 p, 'tools/clang_check/README.chromium', GIT_DELETE, is_delete=True, | 182 p, 'tools/clang_check/README.chromium', GIT.DELETE, is_delete=True, |
| 317 is_git_diff=True, patchlevel=1) | 183 is_git_diff=True, patchlevel=1) |
| 318 | 184 |
| 319 def testGitRename(self): | 185 def testGitRename(self): |
| 320 p = patch.FilePatchDiff('tools/run_local_server.sh', GIT_RENAME, []) | 186 p = patch.FilePatchDiff('tools/run_local_server.sh', GIT.RENAME, []) |
| 321 self._check_patch(p, 'tools/run_local_server.sh', GIT_RENAME, | 187 self._check_patch(p, 'tools/run_local_server.sh', GIT.RENAME, |
| 322 is_git_diff=True, patchlevel=1, | 188 is_git_diff=True, patchlevel=1, |
| 323 source_filename='tools/run_local_server.PY', is_new=True) | 189 source_filename='tools/run_local_server.PY', is_new=True) |
| 324 | 190 |
| 325 def testGitRenamePartial(self): | 191 def testGitRenamePartial(self): |
| 326 p = patch.FilePatchDiff( | 192 p = patch.FilePatchDiff( |
| 327 'chromeos/views/webui_menu_widget.h', GIT_RENAME_PARTIAL, []) | 193 'chromeos/views/webui_menu_widget.h', GIT.RENAME_PARTIAL, []) |
| 328 self._check_patch( | 194 self._check_patch( |
| 329 p, 'chromeos/views/webui_menu_widget.h', GIT_RENAME_PARTIAL, | 195 p, 'chromeos/views/webui_menu_widget.h', GIT.RENAME_PARTIAL, |
| 330 source_filename='chromeos/views/DOMui_menu_widget.h', is_git_diff=True, | 196 source_filename='chromeos/views/DOMui_menu_widget.h', is_git_diff=True, |
| 331 patchlevel=1, is_new=True) | 197 patchlevel=1, is_new=True) |
| 332 | 198 |
| 333 def testGitCopy(self): | 199 def testGitCopy(self): |
| 334 p = patch.FilePatchDiff('pp', GIT_COPY, []) | 200 p = patch.FilePatchDiff('pp', GIT.COPY, []) |
| 335 self._check_patch(p, 'pp', GIT_COPY, is_git_diff=True, patchlevel=1, | 201 self._check_patch(p, 'pp', GIT.COPY, is_git_diff=True, patchlevel=1, |
| 336 source_filename='PRESUBMIT.py', is_new=True) | 202 source_filename='PRESUBMIT.py', is_new=True) |
| 337 | 203 |
| 338 def testOnlyHeader(self): | 204 def testOnlyHeader(self): |
| 339 diff = '--- file_a\n+++ file_a\n' | 205 p = patch.FilePatchDiff('file_a', RAW.MINIMAL, []) |
| 340 p = patch.FilePatchDiff('file_a', diff, []) | 206 self._check_patch(p, 'file_a', RAW.MINIMAL) |
| 341 self._check_patch(p, 'file_a', diff) | |
| 342 | 207 |
| 343 def testSmallest(self): | 208 def testSmallest(self): |
| 344 diff = '--- file_a\n+++ file_a\n@@ -0,0 +1 @@\n+foo\n' | 209 p = patch.FilePatchDiff('file_a', RAW.NEW_NOT_NULL, []) |
| 345 p = patch.FilePatchDiff('file_a', diff, []) | 210 self._check_patch(p, 'file_a', RAW.NEW_NOT_NULL) |
| 346 self._check_patch(p, 'file_a', diff) | |
| 347 | 211 |
| 348 def testRenameOnlyHeader(self): | 212 def testRenameOnlyHeader(self): |
| 349 diff = '--- file_a\n+++ file_b\n' | 213 p = patch.FilePatchDiff('file_b', RAW.MINIMAL_RENAME, []) |
| 350 p = patch.FilePatchDiff('file_b', diff, []) | 214 self._check_patch( |
| 351 # Should it be marked as new? | 215 p, 'file_b', RAW.MINIMAL_RENAME, source_filename='file_a', is_new=True) |
| 352 self._check_patch(p, 'file_b', diff, source_filename='file_a', is_new=True) | |
| 353 | 216 |
| 354 def testGitCopyPartial(self): | 217 def testGitCopyPartial(self): |
| 355 diff = ( | 218 p = patch.FilePatchDiff('wtf2', GIT.COPY_PARTIAL, []) |
| 356 'diff --git a/wtf b/wtf2\n' | |
| 357 'similarity index 98%\n' | |
| 358 'copy from wtf\n' | |
| 359 'copy to wtf2\n' | |
| 360 'index 79fbaf3..3560689 100755\n' | |
| 361 '--- a/wtf\n' | |
| 362 '+++ b/wtf2\n' | |
| 363 '@@ -1,4 +1,4 @@\n' | |
| 364 '-#!/usr/bin/env python\n' | |
| 365 '+#!/usr/bin/env python1.3\n' | |
| 366 ' # Copyright (c) 2010 The Chromium Authors. All rights reserved.\n' | |
| 367 ' # blah blah blah as\n' | |
| 368 ' # found in the LICENSE file.\n') | |
| 369 p = patch.FilePatchDiff('wtf2', diff, []) | |
| 370 # Should it be marked as new? | |
| 371 self._check_patch( | 219 self._check_patch( |
| 372 p, 'wtf2', diff, source_filename='wtf', is_git_diff=True, patchlevel=1, | 220 p, 'wtf2', GIT.COPY_PARTIAL, source_filename='wtf', is_git_diff=True, |
| 373 is_new=True) | 221 patchlevel=1, is_new=True) |
| 374 | 222 |
| 375 def testGitExe(self): | 223 def testGitNewExe(self): |
| 376 diff = ( | 224 p = patch.FilePatchDiff('natsort_test.py', GIT.NEW_EXE, []) |
| 377 'diff --git a/natsort_test.py b/natsort_test.py\n' | |
| 378 'new file mode 100755\n' | |
| 379 '--- /dev/null\n' | |
| 380 '+++ b/natsort_test.py\n' | |
| 381 '@@ -0,0 +1,1 @@\n' | |
| 382 '+#!/usr/bin/env python\n') | |
| 383 p = patch.FilePatchDiff('natsort_test.py', diff, []) | |
| 384 self._check_patch( | 225 self._check_patch( |
| 385 p, 'natsort_test.py', diff, is_new=True, is_git_diff=True, patchlevel=1, | 226 p, 'natsort_test.py', GIT.NEW_EXE, is_new=True, is_git_diff=True, |
| 386 svn_properties=[('svn:executable', '*')]) | 227 patchlevel=1, svn_properties=[('svn:executable', '*')]) |
| 387 | 228 |
| 388 def testGitExe2(self): | 229 def testGitNewMode(self): |
| 389 diff = ( | 230 p = patch.FilePatchDiff('natsort_test.py', GIT.NEW_MODE, []) |
| 390 'diff --git a/natsort_test.py b/natsort_test.py\n' | |
| 391 'new file mode 100644\n' | |
| 392 '--- /dev/null\n' | |
| 393 '+++ b/natsort_test.py\n' | |
| 394 '@@ -0,0 +1,1 @@\n' | |
| 395 '+#!/usr/bin/env python\n') | |
| 396 p = patch.FilePatchDiff('natsort_test.py', diff, []) | |
| 397 self._check_patch( | 231 self._check_patch( |
| 398 p, 'natsort_test.py', diff, is_new=True, is_git_diff=True, patchlevel=1) | 232 p, 'natsort_test.py', GIT.NEW_MODE, is_new=True, is_git_diff=True, |
| 233 patchlevel=1) |
| 399 | 234 |
| 400 | 235 |
| 401 class PatchTestFail(unittest.TestCase): | 236 class PatchTestFail(unittest.TestCase): |
| 402 # All patches that should throw. | 237 # All patches that should throw. |
| 403 def testFilePatchDelete(self): | 238 def testFilePatchDelete(self): |
| 404 p = patch.FilePatchDelete('foo', False) | 239 p = patch.FilePatchDelete('foo', False) |
| 405 try: | 240 try: |
| 406 p.get() | 241 p.get() |
| 407 self.fail() | 242 self.fail() |
| 408 except NotImplementedError: | 243 except NotImplementedError: |
| (...skipping 23 matching lines...) Expand all Loading... |
| 432 | 267 |
| 433 def testFilePatchDiffNone(self): | 268 def testFilePatchDiffNone(self): |
| 434 try: | 269 try: |
| 435 patch.FilePatchDiff('foo', None, []) | 270 patch.FilePatchDiff('foo', None, []) |
| 436 self.fail() | 271 self.fail() |
| 437 except patch.UnsupportedPatchFormat: | 272 except patch.UnsupportedPatchFormat: |
| 438 pass | 273 pass |
| 439 | 274 |
| 440 def testFilePatchBadDiffName(self): | 275 def testFilePatchBadDiffName(self): |
| 441 try: | 276 try: |
| 442 patch.FilePatchDiff('foo', SVN_PATCH, []) | 277 patch.FilePatchDiff('foo', RAW.PATCH, []) |
| 443 self.fail() | 278 self.fail() |
| 444 except patch.UnsupportedPatchFormat, e: | 279 except patch.UnsupportedPatchFormat, e: |
| 445 self.assertEquals( | 280 self.assertEquals( |
| 446 "Can't process patch for file foo.\nUnexpected diff: chrome/file.cc.", | 281 "Can't process patch for file foo.\nUnexpected diff: chrome/file.cc.", |
| 447 str(e)) | 282 str(e)) |
| 448 | 283 |
| 449 def testFilePatchDiffBadHeader(self): | 284 def testFilePatchDiffBadHeader(self): |
| 450 try: | 285 try: |
| 451 diff = ( | 286 diff = ( |
| 452 '+++ b/foo\n' | 287 '+++ b/foo\n' |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 'ff\n' | 364 'ff\n' |
| 530 'ggg\n' | 365 'ggg\n' |
| 531 'hh\n'), | 366 'hh\n'), |
| 532 []) | 367 []) |
| 533 self.fail() | 368 self.fail() |
| 534 except patch.UnsupportedPatchFormat: | 369 except patch.UnsupportedPatchFormat: |
| 535 pass | 370 pass |
| 536 | 371 |
| 537 def testRelPathBad(self): | 372 def testRelPathBad(self): |
| 538 patches = patch.PatchSet([ | 373 patches = patch.PatchSet([ |
| 539 patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []), | 374 patch.FilePatchDiff('chrome\\file.cc', RAW.PATCH, []), |
| 540 patch.FilePatchDelete('other\\place\\foo', True), | 375 patch.FilePatchDelete('other\\place\\foo', True), |
| 541 ]) | 376 ]) |
| 542 try: | 377 try: |
| 543 patches.set_relpath('..') | 378 patches.set_relpath('..') |
| 544 self.fail() | 379 self.fail() |
| 545 except patch.UnsupportedPatchFormat: | 380 except patch.UnsupportedPatchFormat: |
| 546 pass | 381 pass |
| 547 | 382 |
| 548 def testInverted(self): | 383 def testInverted(self): |
| 549 try: | 384 try: |
| 550 patch.FilePatchDiff( | 385 patch.FilePatchDiff( |
| 551 'file_a', '+++ file_a\n--- file_a\n@@ -0,0 +1 @@\n+foo\n', []) | 386 'file_a', '+++ file_a\n--- file_a\n@@ -0,0 +1 @@\n+foo\n', []) |
| 552 self.fail() | 387 self.fail() |
| 553 except patch.UnsupportedPatchFormat: | 388 except patch.UnsupportedPatchFormat: |
| 554 pass | 389 pass |
| 555 | 390 |
| 556 def testInvertedOnlyHeader(self): | 391 def testInvertedOnlyHeader(self): |
| 557 try: | 392 try: |
| 558 patch.FilePatchDiff('file_a', '+++ file_a\n--- file_a\n', []) | 393 patch.FilePatchDiff('file_a', '+++ file_a\n--- file_a\n', []) |
| 559 self.fail() | 394 self.fail() |
| 560 except patch.UnsupportedPatchFormat: | 395 except patch.UnsupportedPatchFormat: |
| 561 pass | 396 pass |
| 562 | 397 |
| 563 | 398 |
| 564 if __name__ == '__main__': | 399 if __name__ == '__main__': |
| 565 logging.basicConfig(level= | 400 logging.basicConfig(level= |
| 566 [logging.WARNING, logging.INFO, logging.DEBUG][ | 401 [logging.WARNING, logging.INFO, logging.DEBUG][ |
| 567 min(2, sys.argv.count('-v'))]) | 402 min(2, sys.argv.count('-v'))]) |
| 568 unittest.main() | 403 unittest.main() |
| OLD | NEW |