Index: tests/gclient_scm_test.py |
diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py |
index 3267745bb5c674d4d7152b0c719620f258612384..43cae2b75383e18c6e9953d3079e227617908094 100755 |
--- a/tests/gclient_scm_test.py |
+++ b/tests/gclient_scm_test.py |
@@ -11,17 +11,18 @@ from shutil import rmtree |
import StringIO |
from subprocess import Popen, PIPE, STDOUT |
import tempfile |
+import unittest |
import __builtin__ |
# Fixes include path. |
-from super_mox import mox, SuperMoxBaseTestBase, SuperMoxTestBase |
+from super_mox import mox, TestCaseUtils, SuperMoxTestBase |
import gclient_scm |
-class GCBaseTestCase(SuperMoxTestBase): |
- # Like unittest's assertRaises, but checks for Gclient.Error. |
+class GCBaseTestCase(object): |
def assertRaisesError(self, msg, fn, *args, **kwargs): |
+ """Like unittest's assertRaises() but checks for Gclient.Error.""" |
try: |
fn(*args, **kwargs) |
except gclient_scm.gclient_utils.Error, e: |
@@ -29,15 +30,33 @@ class GCBaseTestCase(SuperMoxTestBase): |
else: |
self.fail('%s not raised' % msg) |
+ def setUp(self): |
+ self.stdout = StringIO.StringIO() |
-class BaseTestCase(GCBaseTestCase): |
+ def tearDown(self): |
+ try: |
+ self.stdout.getvalue() |
+ self.fail() |
+ except AttributeError: |
+ pass |
+ |
+ def checkstdout(self, expected): |
+ value = self.stdout.getvalue() |
+ self.stdout.close() |
+ self.assertEquals(expected, value) |
+ |
+ |
+class BaseTestCase(GCBaseTestCase, SuperMoxTestBase): |
def setUp(self): |
GCBaseTestCase.setUp(self) |
+ SuperMoxTestBase.setUp(self) |
+ self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCall') |
self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'CheckCallAndFilter') |
self.mox.StubOutWithMock(gclient_scm.gclient_utils, |
'CheckCallAndFilterAndHeader') |
self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileRead') |
self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'FileWrite') |
+ self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'Popen') |
self.mox.StubOutWithMock(gclient_scm.gclient_utils, 'RemoveDirectory') |
self._CaptureSVNInfo = gclient_scm.scm.SVN.CaptureInfo |
self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture') |
@@ -47,20 +66,10 @@ class BaseTestCase(GCBaseTestCase): |
self._scm_wrapper = gclient_scm.CreateSCM |
gclient_scm.sys.stdout.flush = lambda: None |
gclient_scm.scm.SVN.current_version = None |
- self.stdout = StringIO.StringIO() |
def tearDown(self): |
GCBaseTestCase.tearDown(self) |
- try: |
- self.stdout.getvalue() |
- self.fail() |
- except AttributeError: |
- pass |
- |
- def checkstdout(self, expected): |
- value = self.stdout.getvalue() |
- self.stdout.close() |
- self.assertEquals(expected, value) |
+ SuperMoxTestBase.tearDown(self) |
class SVNWrapperTestCase(BaseTestCase): |
@@ -80,10 +89,7 @@ class SVNWrapperTestCase(BaseTestCase): |
def setUp(self): |
BaseTestCase.setUp(self) |
- self.root_dir = self.Dir() |
- self.args = self.Args() |
- self.url = self.Url() |
- self.relpath = 'asf' |
+ self.url = self.SvnUrl() |
def testDir(self): |
members = [ |
@@ -497,7 +503,7 @@ class SVNWrapperTestCase(BaseTestCase): |
('________ found .git directory; skipping %s\n' % self.relpath)) |
-class GitWrapperTestCase(BaseTestCase): |
+class GitWrapperTestCase(GCBaseTestCase, TestCaseUtils, unittest.TestCase): |
"""This class doesn't use pymox.""" |
class OptionsObject(object): |
def __init__(self, test_case, verbose=False, revision=None): |
@@ -508,7 +514,7 @@ class GitWrapperTestCase(BaseTestCase): |
self.force = False |
self.reset = False |
self.nohooks = False |
- self.stdout = StringIO.StringIO() |
+ self.stdout = test_case.stdout |
sample_git_import = """blob |
mark :1 |
@@ -561,36 +567,39 @@ from :3 |
def CreateGitRepo(self, git_import, path): |
"""Do it for real.""" |
try: |
- Popen(['git', 'init'], stdout=PIPE, stderr=STDOUT, |
+ Popen(['git', 'init', '-q'], stdout=PIPE, stderr=STDOUT, |
cwd=path).communicate() |
except OSError: |
# git is not available, skip this test. |
return False |
- Popen(['git', 'fast-import'], stdin=PIPE, stdout=PIPE, stderr=STDOUT, |
- cwd=path).communicate(input=git_import) |
- Popen(['git', 'checkout'], stdout=PIPE, stderr=STDOUT, |
- cwd=path).communicate() |
+ Popen(['git', 'fast-import', '--quiet'], stdin=PIPE, stdout=PIPE, |
+ stderr=STDOUT, cwd=path).communicate(input=git_import) |
+ Popen(['git', 'checkout', '-q'], stdout=PIPE, stderr=STDOUT, |
+ cwd=path).communicate() |
Popen(['git', 'remote', 'add', '-f', 'origin', '.'], stdout=PIPE, |
- stderr=STDOUT, cwd=path).communicate() |
- Popen(['git', 'checkout', '-b', 'new', 'origin/master'], stdout=PIPE, |
- stderr=STDOUT, cwd=path).communicate() |
- Popen(['git', 'push', 'origin', 'origin/origin:origin/master'], stdout=PIPE, |
- stderr=STDOUT, cwd=path).communicate() |
+ stderr=STDOUT, cwd=path).communicate() |
+ Popen(['git', 'checkout', '-b', 'new', 'origin/master', '-q'], stdout=PIPE, |
+ stderr=STDOUT, cwd=path).communicate() |
+ Popen(['git', 'push', 'origin', 'origin/origin:origin/master', '-q'], |
+ stdout=PIPE, stderr=STDOUT, cwd=path).communicate() |
Popen(['git', 'config', '--unset', 'remote.origin.fetch'], stdout=PIPE, |
- stderr=STDOUT, cwd=path).communicate() |
+ stderr=STDOUT, cwd=path).communicate() |
return True |
def setUp(self): |
- self.args = self.Args() |
+ GCBaseTestCase.setUp(self) |
+ TestCaseUtils.setUp(self) |
+ unittest.TestCase.setUp(self) |
self.url = 'git://foo' |
self.root_dir = tempfile.mkdtemp() |
self.relpath = '.' |
self.base_path = gclient_scm.os.path.join(self.root_dir, self.relpath) |
self.enabled = self.CreateGitRepo(self.sample_git_import, self.base_path) |
- BaseTestBase.setUp(self) |
def tearDown(self): |
- BaseTestBase.tearDown(self) |
+ GCBaseTestCase.tearDown(self) |
+ TestCaseUtils.tearDown(self) |
+ unittest.TestCase.tearDown(self) |
rmtree(self.root_dir) |
def testDir(self): |
@@ -602,6 +611,7 @@ from :3 |
# If you add a member, be sure to add the relevant test! |
self.compareMembers(gclient_scm.CreateSCM(url=self.url), members) |
+ self.checkstdout('') |
def testRevertMissing(self): |
if not self.enabled: |
@@ -619,6 +629,11 @@ from :3 |
file_list = [] |
scm.diff(options, self.args, file_list) |
self.assertEquals(file_list, []) |
+ self.checkstdout( |
+ ('\n_____ . at refs/heads/master\n\n\n' |
+ '________ running \'git reset --hard origin/master\' in \'%s\'\n' |
+ 'HEAD is now at a7142dc Personalized\n') % |
+ gclient_scm.os.path.join(self.root_dir, '.')) |
def testRevertNone(self): |
if not self.enabled: |
@@ -633,7 +648,11 @@ from :3 |
self.assertEquals(file_list, []) |
self.assertEquals(scm.revinfo(options, self.args, None), |
'a7142dc9f0009350b96a11f372b6ea658592aa95') |
- |
+ self.checkstdout( |
+ ('\n_____ . at refs/heads/master\n\n\n' |
+ '________ running \'git reset --hard origin/master\' in \'%s\'\n' |
+ 'HEAD is now at a7142dc Personalized\n') % |
+ gclient_scm.os.path.join(self.root_dir, '.')) |
def testRevertModified(self): |
if not self.enabled: |
@@ -653,6 +672,11 @@ from :3 |
self.assertEquals(file_list, []) |
self.assertEquals(scm.revinfo(options, self.args, None), |
'a7142dc9f0009350b96a11f372b6ea658592aa95') |
+ self.checkstdout( |
+ ('\n_____ . at refs/heads/master\n\n\n' |
+ '________ running \'git reset --hard origin/master\' in \'%s\'\n' |
+ 'HEAD is now at a7142dc Personalized\n') % |
+ gclient_scm.os.path.join(self.root_dir, '.')) |
def testRevertNew(self): |
if not self.enabled: |
@@ -676,6 +700,11 @@ from :3 |
self.assertEquals(file_list, []) |
self.assertEquals(scm.revinfo(options, self.args, None), |
'a7142dc9f0009350b96a11f372b6ea658592aa95') |
+ self.checkstdout( |
+ ('\n_____ . at refs/heads/master\n\n\n' |
+ '________ running \'git reset --hard origin/master\' in \'%s\'\n' |
+ 'HEAD is now at a7142dc Personalized\n') % |
+ gclient_scm.os.path.join(self.root_dir, '.')) |
def testStatusNew(self): |
if not self.enabled: |
@@ -688,6 +717,10 @@ from :3 |
file_list = [] |
scm.status(options, self.args, file_list) |
self.assertEquals(file_list, [file_path]) |
+ self.checkstdout( |
+ ('\n________ running \'git diff --name-status ' |
+ '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\n') % |
+ gclient_scm.os.path.join(self.root_dir, '.')) |
def testStatus2New(self): |
if not self.enabled: |
@@ -705,6 +738,10 @@ from :3 |
expected_file_list = [gclient_scm.os.path.join(self.base_path, x) |
for x in ['a', 'b']] |
self.assertEquals(sorted(file_list), expected_file_list) |
+ self.checkstdout( |
+ ('\n________ running \'git diff --name-status ' |
+ '069c602044c5388d2d15c3f875b057c852003458\' in \'%s\'\nM\ta\nM\tb\n') % |
+ gclient_scm.os.path.join(self.root_dir, '.')) |
def testUpdateCheckout(self): |
if not self.enabled: |
@@ -726,6 +763,13 @@ from :3 |
'069c602044c5388d2d15c3f875b057c852003458') |
finally: |
rmtree(root_dir) |
+ join = gclient_scm.os.path.join |
+ self.checkstdout( |
+ ('\n_____ foo at refs/heads/master\n\n' |
+ '________ running \'git clone -b master --verbose %s %s\' in \'%s\'\n' |
+ 'Initialized empty Git repository in %s\n') % |
+ (join(self.root_dir, '.', '.git'), join(root_dir, 'foo'), root_dir, |
+ join(root_dir, 'foo', '.git') + '/')) |
def testUpdateUpdate(self): |
if not self.enabled: |
@@ -740,6 +784,7 @@ from :3 |
self.assertEquals(file_list, expected_file_list) |
self.assertEquals(scm.revinfo(options, (), None), |
'a7142dc9f0009350b96a11f372b6ea658592aa95') |
+ self.checkstdout('\n_____ . at refs/heads/master\n\n') |
def testUpdateUnstagedConflict(self): |
if not self.enabled: |
@@ -754,6 +799,7 @@ from :3 |
"Aborting.\n" |
"Please, commit your changes or stash them before you can merge.\n") |
self.assertRaisesError(exception, scm.update, options, (), []) |
+ self.checkstdout('\n_____ . at refs/heads/master\n') |
def testUpdateConflict(self): |
if not self.enabled: |
@@ -763,23 +809,26 @@ from :3 |
relpath=self.relpath) |
file_path = gclient_scm.os.path.join(self.base_path, 'b') |
f = open(file_path, 'w').writelines('conflict\n') |
- scm._Run(['commit', '-am', 'test']) |
- self.mox.StubOutWithMock(__builtin__, 'raw_input') |
- __builtin__.raw_input.__call__(mox.StrContains('Cannot fast-forward merge, ' |
- 'attempt to rebase? (y)es / ' |
- '(q)uit / (s)kip : ') |
- ).AndReturn('y') |
- self.mox.ReplayAll() |
- exception = \ |
- 'Conflict while rebasing this branch.\n' \ |
- 'Fix the conflict and run gclient again.\n' \ |
- "See 'man git-rebase' for details.\n" |
+ scm._Run(['commit', '-am', 'test'], options) |
+ __builtin__.raw_input = lambda x: 'y' |
+ exception = ('Conflict while rebasing this branch.\n' |
+ 'Fix the conflict and run gclient again.\n' |
+ 'See \'man git-rebase\' for details.\n') |
self.assertRaisesError(exception, scm.update, options, (), []) |
- exception = \ |
- '\n____ . at refs/heads/master\n' \ |
- '\tYou have unstaged changes.\n' \ |
- '\tPlease commit, stash, or reset.\n' |
+ exception = ('\n____ . at refs/heads/master\n' |
+ '\tYou have unstaged changes.\n' |
+ '\tPlease commit, stash, or reset.\n') |
self.assertRaisesError(exception, scm.update, options, (), []) |
+ # The hash always changes. Use a cheap trick. |
+ start = ('\n________ running \'git commit -am test\' in \'%s\'\n' |
+ '[new ') % gclient_scm.os.path.join(self.root_dir, '.') |
+ end = ('] test\n 1 files changed, 1 insertions(+), ' |
+ '1 deletions(-)\n\n_____ . at refs/heads/master\n' |
+ 'Attempting rebase onto refs/remotes/origin/master...\n') |
+ self.assertTrue(self.stdout.getvalue().startswith(start)) |
+ self.assertTrue(self.stdout.getvalue().endswith(end)) |
+ self.assertEquals(len(self.stdout.getvalue()), len(start) + len(end) + 7) |
+ self.stdout.close() |
def testUpdateNotGit(self): |
if not self.enabled: |
@@ -789,13 +838,13 @@ from :3 |
relpath=self.relpath) |
git_path = gclient_scm.os.path.join(self.base_path, '.git') |
rename(git_path, git_path + 'foo') |
- exception = \ |
- '\n____ . at refs/heads/master\n' \ |
- '\tPath is not a git repo. No .git dir.\n' \ |
- '\tTo resolve:\n' \ |
- '\t\trm -rf .\n' \ |
- '\tAnd run gclient sync again\n' |
+ exception = ('\n____ . at refs/heads/master\n' |
+ '\tPath is not a git repo. No .git dir.\n' |
+ '\tTo resolve:\n' |
+ '\t\trm -rf .\n' |
+ '\tAnd run gclient sync again\n') |
self.assertRaisesError(exception, scm.update, options, (), []) |
+ self.checkstdout('') |
def testRevinfo(self): |
if not self.enabled: |
@@ -805,10 +854,10 @@ from :3 |
relpath=self.relpath) |
rev_info = scm.revinfo(options, (), None) |
self.assertEquals(rev_info, '069c602044c5388d2d15c3f875b057c852003458') |
+ self.checkstdout('') |
if __name__ == '__main__': |
- import unittest |
unittest.main() |
# vim: ts=2:sw=2:tw=80:et: |