You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
depot_tools/tests/gcl_unittest.py

288 lines
11 KiB
Python

#!/usr/bin/python
# Copyright (c) 2009 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for gcl.py."""
import StringIO
import os
import sys
import unittest
# Local imports
import __init__
import gcl
mox = __init__.mox
class GclTestsBase(unittest.TestCase):
"""Setups and tear downs the mocks but doesn't test anything as-is."""
def setUp(self):
self.mox = mox.Mox()
def RunShellMock(filename):
return filename
self._RunShell = gcl.RunShell
gcl.RunShell = RunShellMock
self._gcl_gclient_CaptureSVNInfo = gcl.gclient.CaptureSVNInfo
gcl.gclient.CaptureSVNInfo = self.mox.CreateMockAnything()
self._gcl_os_getcwd = gcl.os.getcwd
gcl.os.getcwd = self.mox.CreateMockAnything()
def tearDown(self):
gcl.RunShell = self._RunShell
gcl.gclient.CaptureSVNInfo = self._gcl_gclient_CaptureSVNInfo
gcl.os.getcwd = self._gcl_os_getcwd
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 GclUnittest(GclTestsBase):
"""General gcl.py tests."""
def testMembersChanged(self):
members = [
'CODEREVIEW_SETTINGS', 'CODEREVIEW_SETTINGS_FILE', 'CPP_EXTENSIONS',
'Change', 'ChangeInfo', 'Changes', 'Commit', 'DoPresubmitChecks',
'ErrorExit', 'FILES_CACHE', 'GenerateChangeName', 'GenerateDiff',
'GetCacheDir', 'GetCachedFile', 'GetChangesDir', 'GetCLs',
'GetChangelistInfoFile', 'GetCodeReviewSetting', 'GetEditor',
'GetFilesNotInCL', 'GetInfoDir', 'GetIssueDescription',
'GetModifiedFiles', 'GetRepositoryRoot',
'GetSVNFileProperty', 'Help', 'IGNORE_PATHS', 'IsSVNMoved', 'IsTreeOpen',
'Lint', 'LoadChangelistInfo', 'LoadChangelistInfoForMultiple',
'MISSING_TEST_MSG', 'Opened', 'PresubmitCL', 'ReadFile',
'REPOSITORY_ROOT', 'RunShell',
'RunShellWithReturnCode', 'SEPARATOR', 'SendToRietveld', 'TryChange',
'UnknownFiles', 'UploadCL', 'Warn', 'WriteFile',
'gclient', 'getpass', 'main', 'os', 'random', 're',
'shutil', 'string', 'subprocess', 'sys', 'tempfile',
'upload', 'urllib2', 'xml',
]
# If this test fails, you should add the relevant test.
self.compareMembers(gcl, members)
def testHelp(self):
old_stdout = sys.stdout
try:
dummy = StringIO.StringIO()
gcl.sys.stdout = dummy
gcl.Help()
self.assertEquals(len(dummy.getvalue()), 1832)
finally:
gcl.sys.stdout = old_stdout
def testGetRepositoryRootNone(self):
gcl.REPOSITORY_ROOT = None
gcl.os.getcwd().AndReturn("/bleh/prout")
result = {
"Repository Root": ""
}
gcl.gclient.CaptureSVNInfo("/bleh/prout", print_error=False).AndReturn(
result)
self.mox.ReplayAll()
self.assertRaises(Exception, gcl.GetRepositoryRoot)
self.mox.VerifyAll()
def testGetRepositoryRootGood(self):
gcl.REPOSITORY_ROOT = None
root_path = os.path.join('bleh', 'prout', 'pouet')
gcl.os.getcwd().AndReturn(root_path)
result1 = { "Repository Root": "Some root" }
gcl.gclient.CaptureSVNInfo(root_path, print_error=False).AndReturn(result1)
gcl.os.getcwd().AndReturn(root_path)
results2 = { "Repository Root": "A different root" }
gcl.gclient.CaptureSVNInfo(
os.path.dirname(root_path),
print_error=False).AndReturn(results2)
self.mox.ReplayAll()
self.assertEquals(gcl.GetRepositoryRoot(), root_path)
self.mox.VerifyAll()
class ChangeInfoUnittest(GclTestsBase):
def testChangeInfoMembers(self):
members = [
'CloseIssue', 'Delete', 'FileList', 'MissingTests', 'Save',
'UpdateRietveldDescription', 'description', 'files', 'issue', 'name',
'patch'
]
# If this test fails, you should add the relevant test.
self.compareMembers(gcl.ChangeInfo(), members)
def testChangeInfoBase(self):
files = [('M', 'foo'), ('A', 'bar')]
o = gcl.ChangeInfo('name2', 'issue2', 'description2', files)
self.assertEquals(o.name, 'name2')
self.assertEquals(o.issue, 'issue2')
self.assertEquals(o.description, 'description2')
self.assertEquals(o.files, files)
self.assertEquals(o.patch, None)
self.assertEquals(o.FileList(), ['foo', 'bar'])
class UploadCLUnittest(GclTestsBase):
def setUp(self):
GclTestsBase.setUp(self)
self._os_chdir = gcl.os.chdir
gcl.os.chdir = self.mox.CreateMockAnything()
self._os_close = gcl.os.close
gcl.os.close = self.mox.CreateMockAnything()
self._os_remove = gcl.os.remove
gcl.os.remove = self.mox.CreateMockAnything()
self._os_write = gcl.os.write
gcl.os.write = self.mox.CreateMockAnything()
self._tempfile = gcl.tempfile
gcl.tempfile = self.mox.CreateMockAnything()
self._upload_RealMain = gcl.upload.RealMain
gcl.upload.RealMain = self.mox.CreateMockAnything()
self._DoPresubmitChecks = gcl.DoPresubmitChecks
gcl.DoPresubmitChecks = self.mox.CreateMockAnything()
self._GenerateDiff = gcl.GenerateDiff
gcl.GenerateDiff = self.mox.CreateMockAnything()
self._GetCodeReviewSetting = gcl.GetCodeReviewSetting
gcl.GetCodeReviewSetting = self.mox.CreateMockAnything()
self._GetRepositoryRoot = gcl.GetRepositoryRoot
gcl.GetRepositoryRoot = self.mox.CreateMockAnything()
self._SendToRietveld = gcl.SendToRietveld
gcl.SendToRietveld = self.mox.CreateMockAnything()
self._TryChange = gcl.TryChange
gcl.TryChange = self.mox.CreateMockAnything()
def tearDown(self):
GclTestsBase.tearDown(self)
gcl.os.chdir = self._os_chdir
gcl.os.close = self._os_close
gcl.os.remove = self._os_remove
gcl.os.write = self._os_write
gcl.tempfile = self._tempfile
gcl.upload.RealMain = self._upload_RealMain
gcl.DoPresubmitChecks = self._DoPresubmitChecks
gcl.GenerateDiff = self._GenerateDiff
gcl.GetCodeReviewSetting = self._GetCodeReviewSetting
gcl.GetRepositoryRoot = self._GetRepositoryRoot
gcl.SendToRietveld = self._SendToRietveld
gcl.TryChange = self._TryChange
def testNew(self):
change_info = gcl.ChangeInfo('naame', 'iissue', 'deescription',
['aa', 'bb'])
change_info.Save = self.mox.CreateMockAnything()
args = ['--foo=bar']
change_info.Save()
gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True)
gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
gcl.os.getcwd().AndReturn('somewhere')
gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None))
gcl.GenerateDiff(change_info.FileList())
gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--foo=bar',
"--message=''", '--issue=iissue'], change_info.patch).AndReturn(("1",
"2"))
gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5)
gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True')
gcl.TryChange(change_info,
['--issue', '1', '--patchset', '2'],
swallow_exception=True)
gcl.os.chdir('somewhere')
self.mox.ReplayAll()
gcl.UploadCL(change_info, args)
self.mox.VerifyAll()
def testServerOverride(self):
change_info = gcl.ChangeInfo('naame', '', 'deescription',
['aa', 'bb'])
change_info.Save = self.mox.CreateMockAnything()
args = ['--server=a']
change_info.Save()
gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True)
gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile'))
gcl.os.write(42, change_info.description)
gcl.os.close(42)
gcl.GetCodeReviewSetting('CC_LIST')
gcl.os.getcwd().AndReturn('somewhere')
gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None))
gcl.GenerateDiff(change_info.FileList())
gcl.upload.RealMain(['upload.py', '-y', '--server=my_server', '--server=a',
"--description_file=descfile",
"--message=deescription"], change_info.patch).AndReturn(("1", "2"))
gcl.os.remove('descfile')
gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5)
#gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True')
#gcl.TryChange(change_info,
# ['--issue', '1', '--patchset', '2'],
# swallow_exception=True)
gcl.os.chdir('somewhere')
self.mox.ReplayAll()
gcl.UploadCL(change_info, args)
self.mox.VerifyAll()
def testNoTry(self):
change_info = gcl.ChangeInfo('naame', '', 'deescription',
['aa', 'bb'])
change_info.Save = self.mox.CreateMockAnything()
args = ['--no-try']
change_info.Save()
gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True)
gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile'))
gcl.os.write(42, change_info.description)
gcl.os.close(42)
gcl.GetCodeReviewSetting('CC_LIST')
gcl.os.getcwd().AndReturn('somewhere')
gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None))
gcl.GenerateDiff(change_info.FileList())
gcl.upload.RealMain(['upload.py', '-y', '--server=my_server',
"--description_file=descfile",
"--message=deescription"], change_info.patch).AndReturn(("1", "2"))
gcl.os.remove('descfile')
gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5)
gcl.os.chdir('somewhere')
self.mox.ReplayAll()
gcl.UploadCL(change_info, args)
self.mox.VerifyAll()
def testNormal(self):
change_info = gcl.ChangeInfo('naame', '', 'deescription',
['aa', 'bb'])
change_info.Save = self.mox.CreateMockAnything()
args = []
change_info.Save()
gcl.DoPresubmitChecks(change_info, committing=False).AndReturn(True)
gcl.GetCodeReviewSetting('CODE_REVIEW_SERVER').AndReturn('my_server')
gcl.tempfile.mkstemp(text=True).AndReturn((42, 'descfile'))
gcl.os.write(42, change_info.description)
gcl.os.close(42)
gcl.GetCodeReviewSetting('CC_LIST')
gcl.os.getcwd().AndReturn('somewhere')
gcl.os.chdir(gcl.GetRepositoryRoot().AndReturn(None))
gcl.GenerateDiff(change_info.FileList())
gcl.upload.RealMain(['upload.py', '-y', '--server=my_server',
"--description_file=descfile",
"--message=deescription"], change_info.patch).AndReturn(("1", "2"))
gcl.os.remove('descfile')
gcl.SendToRietveld("/lint/issue%s_%s" % ('1', '2'), timeout=0.5)
gcl.GetCodeReviewSetting('TRY_ON_UPLOAD').AndReturn('True')
gcl.TryChange(change_info,
['--issue', '1', '--patchset', '2'],
swallow_exception=True)
gcl.os.chdir('somewhere')
self.mox.ReplayAll()
gcl.UploadCL(change_info, args)
self.mox.VerifyAll()
if __name__ == '__main__':
unittest.main()