Index: tests/patch_test.py |
diff --git a/tests/patch_test.py b/tests/patch_test.py |
index c030b883b5f64f66111fec9a7fd1647456198e28..bd8a4c71a1cf8300ec740ddeeca09801d702519b 100755 |
--- a/tests/patch_test.py |
+++ b/tests/patch_test.py |
@@ -15,6 +15,116 @@ sys.path.insert(0, os.path.join(ROOT_DIR, '..')) |
import patch |
+SVN_PATCH = ( |
+ 'Index: chrome/file.cc\n' |
+ '===================================================================\n' |
+ '--- chrome/file.cc\t(revision 74690)\n' |
+ '+++ chrome/file.cc\t(working copy)\n' |
+ '@@ -80,10 +80,13 @@\n' |
+ ' // Foo\n' |
+ ' // Bar\n' |
+ ' void foo() {\n' |
+ '- return bar;\n' |
+ '+ return foo;\n' |
+ ' }\n' |
+ ' \n' |
+ ' \n') |
+ |
+ |
+GIT_PATCH = ( |
+ 'diff --git a/chrome/file.cc b/chrome/file.cc\n' |
+ 'index 0e4de76..8320059 100644\n' |
+ '--- a/chrome/file.cc\n' |
+ '+++ b/chrome/file.cc\n' |
+ '@@ -3,6 +3,7 @@ bb\n' |
+ ' ccc\n' |
+ ' dd\n' |
+ ' e\n' |
+ '+FOO!\n' |
+ ' ff\n' |
+ ' ggg\n' |
+ ' hh\n') |
+ |
+ |
+# http://codereview.chromium.org/download/issue6368055_22_29.diff |
+GIT_DELETE = ( |
+ 'Index: tools/clang_check/README.chromium\n' |
+ 'diff --git a/tools/clang_check/README.chromium ' |
+ 'b/tools/clang_check/README.chromium\n' |
+ 'deleted file mode 100644\n' |
+ 'index fcaa7e0e94bb604a026c4f478fecb1c5796f5413..' |
+ '0000000000000000000000000000000000000000\n' |
+ '--- a/tools/clang_check/README.chromium\n' |
+ '+++ /dev/null\n' |
+ '@@ -1,9 +0,0 @@\n' |
+ '-These are terrible, terrible hacks.\n' |
+ '-\n' |
+ '-They are meant to be temporary. clang currently doesn\'t allow running a ' |
+ 'plugin\n' |
+ '-AND doing the normal codegen process. We want our syntax complaining ' |
+ 'plugins to\n' |
+ '-run during normal compile, but for now, you can user run_plugin.sh to ' |
+ 'hack the\n' |
+ '-build system to do a syntax check.\n' |
+ '-\n' |
+ '-Also see http://code.google.com/p/chromium/wiki/WritingClangPlugins\n' |
+ '-\n') |
+ |
+ |
+# http://codereview.chromium.org/download/issue6250123_3013_6010.diff |
+GIT_RENAME_PARTIAL = ( |
+ 'Index: chrome/browser/chromeos/views/webui_menu_widget.h\n' |
+ 'diff --git a/chrome/browser/chromeos/views/domui_menu_widget.h ' |
+ 'b/chrome/browser/chromeos/views/webui_menu_widget.h\n' |
+ 'similarity index 79%\n' |
+ 'rename from chrome/browser/chromeos/views/domui_menu_widget.h\n' |
+ 'rename to chrome/browser/chromeos/views/webui_menu_widget.h\n' |
+ 'index 095d4c474fd9718f5aebfa41a1ccb2d951356d41..' |
+ '157925075434b590e8acaaf605a64f24978ba08b 100644\n' |
+ '--- a/chrome/browser/chromeos/views/domui_menu_widget.h\n' |
+ '+++ b/chrome/browser/chromeos/views/webui_menu_widget.h\n' |
+ '@@ -1,9 +1,9 @@\n' |
+ '-// Copyright (c) 2010 The Chromium Authors. All rights reserved.\n' |
+ '+// Copyright (c) 2011 The Chromium Authors. All rights reserved.\n' |
+ ' // Use of this source code is governed by a BSD-style license that can be' |
+ '\n' |
+ ' // found in the LICENSE file.\n' |
+ ' \n' |
+ '-#ifndef CHROME_BROWSER_CHROMEOS_VIEWS_DOMUI_MENU_WIDGET_H_\n' |
+ '-#define CHROME_BROWSER_CHROMEOS_VIEWS_DOMUI_MENU_WIDGET_H_\n' |
+ '+#ifndef CHROME_BROWSER_CHROMEOS_VIEWS_WEBUI_MENU_WIDGET_H_\n' |
+ '+#define CHROME_BROWSER_CHROMEOS_VIEWS_WEBUI_MENU_WIDGET_H_\n' |
+ ' #pragma once\n' |
+ ' \n' |
+ ' #include <string>\n') |
+ |
+ |
+# http://codereview.chromium.org/download/issue6287022_3001_4010.diff |
+GIT_RENAME = ( |
+ 'Index: tools/run_local_server.sh\n' |
+ 'diff --git a/tools/run_local_server.py b/tools/run_local_server.sh\n' |
+ 'similarity index 100%\n' |
+ 'rename from tools/run_local_server.py\n' |
+ 'rename to tools/run_local_server.sh\n') |
+ |
+ |
+GIT_COPY = ( |
+ 'diff --git a/PRESUBMIT.py b/pp\n' |
+ 'similarity index 100%\n' |
+ 'copy from PRESUBMIT.py\n' |
+ 'copy to pp\n') |
+ |
+ |
+GIT_NEW = ( |
+ 'diff --git a/foo b/foo\n' |
+ 'new file mode 100644\n' |
+ 'index 0000000..5716ca5\n' |
+ '--- /dev/null\n' |
+ '+++ b/foo\n' |
+ '@@ -0,0 +1 @@\n' |
+ '+bar\n') |
+ |
+ |
class PatchTest(unittest.TestCase): |
def testFilePatchDelete(self): |
c = patch.FilePatchDelete('foo', False) |
@@ -44,13 +154,13 @@ class PatchTest(unittest.TestCase): |
self.assertEquals(c.get(), 'data') |
def testFilePatchDiff(self): |
- c = patch.FilePatchDiff('foo', 'data', []) |
+ c = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []) |
self.assertEquals(c.is_delete, False) |
self.assertEquals(c.is_binary, False) |
- self.assertEquals(c.filename, 'foo') |
+ self.assertEquals(c.filename, 'chrome/file.cc') |
self.assertEquals(c.is_git_diff, False) |
self.assertEquals(c.patchlevel, 0) |
- self.assertEquals(c.get(), 'data') |
+ self.assertEquals(c.get(), SVN_PATCH) |
diff = ( |
'diff --git a/git_cl/git-cl b/git_cl/git-cl\n' |
'old mode 100644\n' |
@@ -75,6 +185,20 @@ class PatchTest(unittest.TestCase): |
self.assertEquals(c.patchlevel, 1) |
self.assertEquals(c.get(), diff) |
+ def testFilePatchBadDiff(self): |
+ try: |
+ patch.FilePatchDiff('foo', 'data', []) |
+ self.fail() |
+ except patch.UnsupportedPatchFormat: |
+ pass |
+ |
+ def testFilePatchBadDiffName(self): |
+ try: |
+ patch.FilePatchDiff('foo', SVN_PATCH, []) |
+ self.fail() |
+ except patch.UnsupportedPatchFormat: |
+ pass |
+ |
def testInvalidFilePatchDiffGit(self): |
try: |
patch.FilePatchDiff('svn_utils_test.txt', ( |
@@ -137,26 +261,95 @@ class PatchTest(unittest.TestCase): |
# pylint: disable=R0201 |
# Method could be a function |
# Should not throw. |
- patch.FilePatchDiff('chrome/file.cc', ( |
- 'Index: chrome/file.cc\n' |
- '===================================================================\n' |
- '--- chrome/file.cc\t(revision 74690)\n' |
- '+++ chrome/file.cc\t(working copy)\n' |
- '@@ -80,10 +80,13 @@\n' |
- ' // Foo\n' |
- ' // Bar\n' |
- ' void foo() {\n' |
- '- return bar;\n' |
- '+ return foo;\n' |
- ' }\n' |
- ' \n' |
- ' \n'), []) |
- patch.FilePatchDiff('chrome/file.cc', ( |
- '--- /dev/null\t2\n' |
- '+++ chrome/file.cc\tfoo\n'), []) |
- patch.FilePatchDiff('chrome/file.cc', ( |
- '--- chrome/file.cc\tbar\n' |
- '+++ /dev/null\tfoo\n'), []) |
+ p = patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []) |
+ lines = SVN_PATCH.splitlines(True) |
+ header = ''.join(lines[:4]) |
+ hunks = ''.join(lines[4:]) |
+ self.assertEquals(header, p.diff_header) |
+ self.assertEquals(hunks, p.diff_hunks) |
+ self.assertEquals(SVN_PATCH, p.get()) |
+ |
+ def testValidSvnNew(self): |
+ text = '--- /dev/null\t2\n+++ chrome/file.cc\tfoo\n' |
+ p = patch.FilePatchDiff('chrome/file.cc', text, []) |
+ self.assertEquals(text, p.diff_header) |
+ self.assertEquals('', p.diff_hunks) |
+ self.assertEquals(text, p.get()) |
+ |
+ def testValidSvnDelete(self): |
+ text = '--- chrome/file.cc\tbar\n+++ /dev/null\tfoo\n' |
+ p = patch.FilePatchDiff('chrome/file.cc', text, []) |
+ self.assertEquals(text, p.diff_header) |
+ self.assertEquals('', p.diff_hunks) |
+ self.assertEquals(text, p.get()) |
+ |
+ def testRelPath(self): |
+ patches = patch.PatchSet([ |
+ patch.FilePatchDiff('chrome/file.cc', SVN_PATCH, []), |
+ patch.FilePatchDiff( |
+ 'tools\\clang_check/README.chromium', GIT_DELETE, []), |
+ patch.FilePatchDiff('tools/run_local_server.sh', GIT_RENAME, []), |
+ patch.FilePatchDiff( |
+ 'chrome\\browser/chromeos/views/webui_menu_widget.h', |
+ GIT_RENAME_PARTIAL, []), |
+ patch.FilePatchDiff('pp', GIT_COPY, []), |
+ patch.FilePatchDiff('foo', GIT_NEW, []), |
+ patch.FilePatchDelete('other/place/foo', True), |
+ patch.FilePatchBinary('bar', 'data', []), |
+ ]) |
+ expected = [ |
+ 'chrome/file.cc', 'tools/clang_check/README.chromium', |
+ 'tools/run_local_server.sh', |
+ 'chrome/browser/chromeos/views/webui_menu_widget.h', 'pp', 'foo', |
+ 'other/place/foo', 'bar'] |
+ self.assertEquals(expected, patches.filenames) |
+ orig_name = patches.patches[0].filename |
+ patches.set_relpath(os.path.join('a', 'bb')) |
+ expected = [os.path.join('a', 'bb', x) for x in expected] |
+ self.assertEquals(expected, patches.filenames) |
+ # Make sure each header is updated accordingly. |
+ header = [] |
+ new_name = os.path.join('a', 'bb', orig_name) |
+ for line in SVN_PATCH.splitlines(True): |
+ if line.startswith('@@'): |
+ break |
+ if line[:3] in ('---', '+++', 'Ind'): |
+ line = line.replace(orig_name, new_name) |
+ header.append(line) |
+ header = ''.join(header) |
+ self.assertEquals(header, patches.patches[0].diff_header) |
+ |
+ def testRelPathBad(self): |
+ patches = patch.PatchSet([ |
+ patch.FilePatchDiff('chrome\\file.cc', SVN_PATCH, []), |
+ patch.FilePatchDelete('other\\place\\foo', True), |
+ ]) |
+ try: |
+ patches.set_relpath('..') |
+ self.fail() |
+ except patch.UnsupportedPatchFormat: |
+ pass |
+ |
+ def testBackSlash(self): |
+ mangled_patch = SVN_PATCH.replace('chrome/', 'chrome\\') |
+ patches = patch.PatchSet([ |
+ patch.FilePatchDiff('chrome\\file.cc', mangled_patch, []), |
+ patch.FilePatchDelete('other\\place\\foo', True), |
+ ]) |
+ expected = ['chrome/file.cc', 'other/place/foo'] |
+ self.assertEquals(expected, patches.filenames) |
+ self.assertEquals(SVN_PATCH, patches.patches[0].get()) |
+ |
+ def testGitPatches(self): |
+ # Shouldn't throw. |
+ patch.FilePatchDiff('tools/clang_check/README.chromium', GIT_DELETE, []) |
+ patch.FilePatchDiff('tools/run_local_server.sh', GIT_RENAME, []) |
+ patch.FilePatchDiff( |
+ 'chrome/browser/chromeos/views/webui_menu_widget.h', |
+ GIT_RENAME_PARTIAL, []) |
+ patch.FilePatchDiff('pp', GIT_COPY, []) |
+ patch.FilePatchDiff('foo', GIT_NEW, []) |
+ self.assertTrue(True) |
if __name__ == '__main__': |