| Index: tests/gclient_test.py
|
| ===================================================================
|
| --- tests/gclient_test.py (revision 15862)
|
| +++ tests/gclient_test.py (working copy)
|
| @@ -23,6 +23,7 @@
|
| import os
|
| import random
|
| import string
|
| +import StringIO
|
| import subprocess
|
| import sys
|
| import unittest
|
| @@ -77,6 +78,21 @@
|
| else:
|
| self.fail('%s not raised' % msg)
|
|
|
| + def compareMembers(self, object, members):
|
| + """If you add a member, be sure to add the relevant test!"""
|
| + # Skip over members starting with '_' since they are usually not meant to
|
| + # be for public use.
|
| + actual_members = [x for x in sorted(dir(object))
|
| + if not x.startswith('_')]
|
| + expected_members = sorted(members)
|
| + if actual_members != expected_members:
|
| + diff = ([i for i in actual_members if i not in expected_members] +
|
| + [i for i in expected_members if i not in actual_members])
|
| + print diff
|
| + self.assertEqual(actual_members, expected_members)
|
| +
|
| +
|
| +class GClientBaseTestCase(BaseTestCase):
|
| def Options(self, *args, **kwargs):
|
| return self.OptionsObject(self, *args, **kwargs)
|
|
|
| @@ -99,13 +115,10 @@
|
| gclient.RunSVN = self.mox.CreateMockAnything()
|
| self._RunSVNAndGetFileList = gclient.RunSVNAndGetFileList
|
| gclient.RunSVNAndGetFileList = self.mox.CreateMockAnything()
|
| - # Doesn't seem to work very well:
|
| - self._os = gclient.os
|
| - gclient.os = self.mox.CreateMock(os)
|
| - self._sys = gclient.sys
|
| - gclient.sys = self.mox.CreateMock(sys)
|
| + self._sys_stdout = gclient.sys.stdout
|
| + gclient.sys.stdout = self.mox.CreateMock(self._sys_stdout)
|
| self._subprocess = gclient.subprocess
|
| - gclient.subprocess = self.mox.CreateMock(subprocess)
|
| + gclient.subprocess = self.mox.CreateMock(self._subprocess)
|
|
|
| def tearDown(self):
|
| gclient.CaptureSVN = self._CaptureSVN
|
| @@ -116,13 +129,11 @@
|
| gclient.RemoveDirectory = self._RemoveDirectory
|
| gclient.RunSVN = self._RunSVN
|
| gclient.RunSVNAndGetFileList = self._RunSVNAndGetFileList
|
| - # Doesn't seem to work very well:
|
| - gclient.os = self._os
|
| - gclient.sys = self._sys
|
| + gclient.sys.stdout = self._sys_stdout
|
| gclient.subprocess = self._subprocess
|
|
|
|
|
| -class GclientTestCase(BaseTestCase):
|
| +class GclientTestCase(GClientBaseTestCase):
|
| class OptionsObject(object):
|
| def __init__(self, test_case, verbose=False, spec=None,
|
| config_filename='a_file_name',
|
| @@ -140,19 +151,16 @@
|
| self.head = False
|
|
|
| # Mox
|
| - self.stdout = test_case.stdout
|
| self.path_exists = test_case.path_exists
|
| self.platform = test_case.platform
|
| self.gclient = test_case.gclient
|
| self.scm_wrapper = test_case.scm_wrapper
|
|
|
| def setUp(self):
|
| - BaseTestCase.setUp(self)
|
| - self.stdout = self.mox.CreateMock(sys.stdout)
|
| + GClientBaseTestCase.setUp(self)
|
| #self.subprocess = self.mox.CreateMock(subprocess)
|
| # Stub os.path.exists.
|
| self.path_exists = self.mox.CreateMockAnything()
|
| - self.sys = self.mox.CreateMock(sys)
|
| self.platform = 'darwin'
|
|
|
| self.gclient = self.mox.CreateMock(gclient.GClient)
|
| @@ -163,7 +171,7 @@
|
| self.url = Url()
|
|
|
|
|
| -class GClientCommandsTestCase(BaseTestCase):
|
| +class GClientCommandsTestCase(GClientBaseTestCase):
|
| def testCommands(self):
|
| known_commands = [gclient.DoCleanup, gclient.DoConfig, gclient.DoDiff,
|
| gclient.DoHelp, gclient.DoStatus, gclient.DoUpdate,
|
| @@ -224,24 +232,23 @@
|
|
|
| class TestDoHelp(GclientTestCase):
|
| def testGetUsage(self):
|
| + print(gclient.COMMAND_USAGE_TEXT['config'])
|
| + self.mox.ReplayAll()
|
| options = self.Options()
|
| - print >> options.stdout, gclient.COMMAND_USAGE_TEXT['config']
|
| -
|
| - self.mox.ReplayAll()
|
| gclient.DoHelp(options, ('config',))
|
| self.mox.VerifyAll()
|
|
|
| def testTooManyArgs(self):
|
| + self.mox.ReplayAll()
|
| options = self.Options()
|
| - self.mox.ReplayAll()
|
| self.assertRaisesError("unknown subcommand 'config'; see 'gclient help'",
|
| gclient.DoHelp, options, ('config',
|
| 'another argument'))
|
| self.mox.VerifyAll()
|
|
|
| def testUnknownSubcommand(self):
|
| + self.mox.ReplayAll()
|
| options = self.Options()
|
| - self.mox.ReplayAll()
|
| self.assertRaisesError("unknown subcommand 'xyzzy'; see 'gclient help'",
|
| gclient.DoHelp, options, ('xyzzy',))
|
| self.mox.VerifyAll()
|
| @@ -273,7 +280,7 @@
|
| self.gclient.LoadCurrentConfig(options).AndReturn(self.gclient)
|
| text = "# Dummy content\nclient = 'my client'"
|
| self.gclient.ConfigContent().AndReturn(text)
|
| - print >>self.stdout, text
|
| + print(text)
|
| self.gclient.RunOnDeps(command, self.args).AndReturn(0)
|
|
|
| self.mox.ReplayAll()
|
| @@ -331,7 +338,7 @@
|
| self.gclient.GetVar("solutions")
|
| text = "# Dummy content\nclient = 'my client'"
|
| self.gclient.ConfigContent().AndReturn(text)
|
| - print >>self.stdout, text
|
| + print(text)
|
| self.gclient.RunOnDeps(command, self.args).AndReturn(0)
|
|
|
| self.mox.ReplayAll()
|
| @@ -377,18 +384,14 @@
|
|
|
| class GClientClassTestCase(GclientTestCase):
|
| def testDir(self):
|
| - members = ['ConfigContent', 'FromImpl', '_VarImpl', '_ParseAllDeps',
|
| - '_ParseSolutionDeps', 'GetVar', '_LoadConfig', 'LoadCurrentConfig',
|
| - '_ReadEntries', '_RunHookAction', '_RunHooks', 'RunOnDeps', 'SaveConfig',
|
| - '_SaveEntries', 'SetConfig', 'SetDefaultConfig', 'supported_commands',
|
| - 'PrintRevInfo']
|
| + members = [
|
| + 'ConfigContent', 'FromImpl', 'GetVar', 'LoadCurrentConfig',
|
| + 'RunOnDeps', 'SaveConfig', 'SetConfig', 'SetDefaultConfig',
|
| + 'supported_commands', 'PrintRevInfo',
|
| + ]
|
|
|
| # If you add a member, be sure to add the relevant test!
|
| - actual_members = [x for x in sorted(dir(gclient.GClient))
|
| - if not x.startswith('__')]
|
| - self.assertEqual(actual_members, sorted(members))
|
| - self.mox.ReplayAll()
|
| - self.mox.VerifyAll()
|
| + self.compareMembers(gclient.GClient('root_dir', 'options'), members)
|
|
|
| def testSetConfig_ConfigContent_GetVar_SaveConfig_SetDefaultConfig(self):
|
| options = self.Options()
|
| @@ -731,11 +734,11 @@
|
| def testRunOnDepsRevisions(self):
|
| def OptIsRev(options, rev):
|
| if not options.revision == str(rev):
|
| - print "options.revision = %s" % options.revision
|
| + print("options.revision = %s" % options.revision)
|
| return options.revision == str(rev)
|
| def OptIsRevNone(options):
|
| if options.revision:
|
| - print "options.revision = %s" % options.revision
|
| + print("options.revision = %s" % options.revision)
|
| return options.revision == None
|
| def OptIsRev42(options):
|
| return OptIsRev(options, 42)
|
| @@ -1058,7 +1061,7 @@
|
| pass
|
|
|
|
|
| -class SCMWrapperTestCase(BaseTestCase):
|
| +class SCMWrapperTestCase(GClientBaseTestCase):
|
| class OptionsObject(object):
|
| def __init__(self, test_case, verbose=False, revision=None):
|
| self.verbose = verbose
|
| @@ -1068,29 +1071,25 @@
|
| self.force = False
|
|
|
| # Mox
|
| - self.stdout = test_case.stdout
|
| self.path_exists = test_case.path_exists
|
|
|
| def setUp(self):
|
| - BaseTestCase.setUp(self)
|
| + GClientBaseTestCase.setUp(self)
|
| self.root_dir = Dir()
|
| self.args = Args()
|
| self.url = Url()
|
| self.relpath = 'asf'
|
| - self.stdout = self.mox.CreateMock(sys.stdout)
|
| # Stub os.path.exists.
|
| self.path_exists = self.mox.CreateMockAnything()
|
|
|
| def testDir(self):
|
| - members = ['FullUrlForRelativeUrl', 'RunCommand',
|
| - 'cleanup', 'diff', 'revert', 'status', 'update']
|
| + members = [
|
| + 'FullUrlForRelativeUrl', 'RunCommand', 'cleanup', 'diff', 'relpath',
|
| + 'revert', 'scm_name', 'status', 'update', 'url',
|
| + ]
|
|
|
| # If you add a member, be sure to add the relevant test!
|
| - actual_members = [x for x in sorted(dir(gclient.SCMWrapper))
|
| - if not x.startswith('__')]
|
| - self.assertEqual(actual_members, sorted(members))
|
| - self.mox.ReplayAll()
|
| - self.mox.VerifyAll()
|
| + self.compareMembers(gclient.SCMWrapper(), members)
|
|
|
| def testFullUrlForRelativeUrl(self):
|
| self.url = 'svn://a/b/c/d'
|
| @@ -1125,12 +1124,11 @@
|
| gclient.os.path.isdir(base_path).AndReturn(False)
|
| # It'll to a checkout instead.
|
| options.path_exists(os.path.join(base_path, '.git')).AndReturn(False)
|
| - print >>options.stdout, ("\n_____ %s is missing, synching instead" %
|
| - self.relpath)
|
| + print("\n_____ %s is missing, synching instead" % self.relpath)
|
| # Checkout.
|
| options.path_exists(base_path).AndReturn(False)
|
| files_list = self.mox.CreateMockAnything()
|
| - gclient.RunSVNAndGetFileList(options, ['checkout', self.url, base_path],
|
| + gclient.RunSVNAndGetFileList(['checkout', self.url, base_path],
|
| self.root_dir, files_list)
|
|
|
| self.mox.ReplayAll()
|
| @@ -1145,7 +1143,7 @@
|
| base_path = os.path.join(self.root_dir, self.relpath)
|
| gclient.os.path.isdir = self.mox.CreateMockAnything()
|
| gclient.os.path.isdir(base_path).AndReturn(True)
|
| - gclient.CaptureSVNStatus(options, base_path).AndReturn([])
|
| + gclient.CaptureSVNStatus(base_path).AndReturn([])
|
|
|
| self.mox.ReplayAll()
|
| scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
|
| @@ -1164,11 +1162,11 @@
|
| gclient.FileStatus('a', 'M', ' ', ' ', ' '),
|
| gclient.FileStatus('b', 'A', ' ', ' ', ' '),
|
| ]
|
| - gclient.CaptureSVNStatus(options, base_path).AndReturn(items)
|
| + gclient.CaptureSVNStatus(base_path).AndReturn(items)
|
|
|
| - print >>options.stdout, os.path.join(base_path, 'a')
|
| - print >>options.stdout, os.path.join(base_path, 'b')
|
| - gclient.RunSVN(options, ['revert', 'a', 'b'], base_path)
|
| + print(os.path.join(base_path, 'a'))
|
| + print(os.path.join(base_path, 'b'))
|
| + gclient.RunSVN(['revert', 'a', 'b'], base_path)
|
|
|
| self.mox.ReplayAll()
|
| scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
|
| @@ -1183,7 +1181,7 @@
|
| base_path = os.path.join(self.root_dir, self.relpath)
|
| gclient.os.path.isdir = self.mox.CreateMockAnything()
|
| gclient.os.path.isdir(base_path).AndReturn(True)
|
| - gclient.RunSVNAndGetFileList(options, ['status'] + self.args, base_path,
|
| + gclient.RunSVNAndGetFileList(['status'] + self.args, base_path,
|
| []).AndReturn(None)
|
|
|
| self.mox.ReplayAll()
|
| @@ -1208,7 +1206,7 @@
|
| # Checkout.
|
| options.path_exists(base_path).AndReturn(False)
|
| files_list = self.mox.CreateMockAnything()
|
| - gclient.RunSVNAndGetFileList(options, ['checkout', self.url, base_path],
|
| + gclient.RunSVNAndGetFileList(['checkout', self.url, base_path],
|
| self.root_dir, files_list)
|
| self.mox.ReplayAll()
|
| scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
|
| @@ -1229,15 +1227,15 @@
|
| options.path_exists(os.path.join(base_path, '.git')).AndReturn(False)
|
| # Checkout or update.
|
| options.path_exists(base_path).AndReturn(True)
|
| - gclient.CaptureSVNInfo(options, os.path.join(base_path, "."), '.'
|
| + gclient.CaptureSVNInfo(os.path.join(base_path, "."), '.'
|
| ).AndReturn(file_info)
|
| # Cheat a bit here.
|
| - gclient.CaptureSVNInfo(options, file_info['URL'], '.').AndReturn(file_info)
|
| + gclient.CaptureSVNInfo(file_info['URL'], '.').AndReturn(file_info)
|
| additional_args = []
|
| if options.manually_grab_svn_rev:
|
| additional_args = ['--revision', str(file_info['Revision'])]
|
| files_list = []
|
| - gclient.RunSVNAndGetFileList(options, ['update', base_path] + additional_args,
|
| + gclient.RunSVNAndGetFileList(['update', base_path] + additional_args,
|
| self.root_dir, files_list)
|
|
|
| self.mox.ReplayAll()
|
| @@ -1250,8 +1248,7 @@
|
| options = self.Options(verbose=True)
|
| options.path_exists(os.path.join(self.root_dir, self.relpath, '.git')
|
| ).AndReturn(True)
|
| - print >> options.stdout, (
|
| - "________ found .git directory; skipping %s" % self.relpath)
|
| + print("________ found .git directory; skipping %s" % self.relpath)
|
|
|
| self.mox.ReplayAll()
|
| scm = gclient.SCMWrapper(url=self.url, root_dir=self.root_dir,
|
| @@ -1276,9 +1273,7 @@
|
| </entry>
|
| </info>
|
| """ % self.url
|
| - options = self.Options(verbose=True)
|
| - gclient.CaptureSVN(options, ['info', '--xml', self.url],
|
| - '.').AndReturn(xml_text)
|
| + gclient.CaptureSVN(['info', '--xml', self.url], '.').AndReturn(xml_text)
|
| expected = {
|
| 'URL': 'http://src.chromium.org/svn/trunk/src/chrome/app/d',
|
| 'UUID': None,
|
| @@ -1291,7 +1286,7 @@
|
| 'Node Kind': 'file',
|
| }
|
| self.mox.ReplayAll()
|
| - file_info = self._CaptureSVNInfo(options, self.url, '.')
|
| + file_info = self._CaptureSVNInfo(self.url, '.')
|
| self.assertEquals(sorted(file_info.items()), sorted(expected.items()))
|
| self.mox.VerifyAll()
|
|
|
| @@ -1319,11 +1314,9 @@
|
| </entry>
|
| </info>
|
| """ % (self.url, self.root_dir)
|
| - options = self.Options(verbose=True)
|
| - gclient.CaptureSVN(options, ['info', '--xml', self.url],
|
| - '.').AndReturn(xml_text)
|
| + gclient.CaptureSVN(['info', '--xml', self.url], '.').AndReturn(xml_text)
|
| self.mox.ReplayAll()
|
| - file_info = self._CaptureSVNInfo(options, self.url, '.')
|
| + file_info = self._CaptureSVNInfo(self.url, '.')
|
| expected = {
|
| 'URL': self.url,
|
| 'UUID': '7b9385f5-0452-0410-af26-ad4892b7a1fb',
|
| @@ -1339,6 +1332,60 @@
|
| self.mox.VerifyAll()
|
|
|
|
|
| +class RunSVNTestCase(BaseTestCase):
|
| + def setUp(self):
|
| + self.mox = mox.Mox()
|
| + self._OldSubprocessCall = gclient.SubprocessCall
|
| + gclient.SubprocessCall = self.mox.CreateMockAnything()
|
| +
|
| + def tearDown(self):
|
| + gclient.SubprocessCall = self._OldSubprocessCall
|
| +
|
| + def testRunSVN(self):
|
| + param2 = 'bleh'
|
| + gclient.SubprocessCall(['svn', 'foo', 'bar'], param2).AndReturn(None)
|
| + self.mox.ReplayAll()
|
| + gclient.RunSVN(['foo', 'bar'], param2)
|
| + self.mox.VerifyAll()
|
| +
|
| +
|
| +class SubprocessCallAndCaptureTestCase(BaseTestCase):
|
| + def setUp(self):
|
| + self.mox = mox.Mox()
|
| + self._sys_stdout = gclient.sys.stdout
|
| + gclient.sys.stdout = self.mox.CreateMock(self._sys_stdout)
|
| + self._subprocess_Popen = gclient.subprocess.Popen
|
| + gclient.subprocess.Popen = self.mox.CreateMockAnything()
|
| +
|
| + def tearDown(self):
|
| + gclient.sys.stdout = self._sys_stdout
|
| + gclient.subprocess.Popen = self._subprocess_Popen
|
| +
|
| + def testSubprocessCallAndCapture(self):
|
| + command = ['boo', 'foo', 'bar']
|
| + in_directory = 'bleh'
|
| + fail_status = None
|
| + pattern = 'a(.*)b'
|
| + test_string = 'ahah\naccb\nallo\naddb\n'
|
| + class Mock(object):
|
| + stdout = StringIO.StringIO(test_string)
|
| + def wait(self):
|
| + pass
|
| + kid = Mock()
|
| + print("\n________ running 'boo foo bar' in 'bleh'")
|
| + for i in test_string:
|
| + sys.stdout.write(i)
|
| + gclient.subprocess.Popen(command, bufsize=0, cwd=in_directory,
|
| + shell=(sys.platform == 'win32'),
|
| + stdout=gclient.subprocess.PIPE).AndReturn(kid)
|
| + self.mox.ReplayAll()
|
| + capture_list = []
|
| + gclient.SubprocessCallAndCapture(command, in_directory, fail_status,
|
| + pattern, capture_list)
|
| + self.assertEquals(capture_list, ['cc', 'dd'])
|
| + self.mox.VerifyAll()
|
| +
|
| +
|
| if __name__ == '__main__':
|
| unittest.main()
|
|
|
|
|