depot_tools: Add tests for gclient_paths
Change-Id: I544aa85b040544508df8ed16310def982356fbcc Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1949417 Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org> Reviewed-by: Anthony Polito <apolito@google.com>changes/17/1949417/9
							parent
							
								
									9253a68574
								
							
						
					
					
						commit
						84b5f9a215
					
				@ -0,0 +1,255 @@
 | 
			
		||||
#!/usr/bin/env vpython3
 | 
			
		||||
# coding=utf-8
 | 
			
		||||
# Copyright (c) 2012 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.
 | 
			
		||||
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import unittest
 | 
			
		||||
 | 
			
		||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 | 
			
		||||
 | 
			
		||||
import gclient_paths
 | 
			
		||||
import gclient_utils
 | 
			
		||||
import subprocess2
 | 
			
		||||
 | 
			
		||||
if sys.version_info.major == 2:
 | 
			
		||||
  from StringIO import StringIO
 | 
			
		||||
  import mock
 | 
			
		||||
else:
 | 
			
		||||
  from io import StringIO
 | 
			
		||||
  from unittest import mock
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
EXCEPTION = subprocess2.CalledProcessError(
 | 
			
		||||
    128, ['cmd'], 'cwd', 'stdout', 'stderr')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestBase(unittest.TestCase):
 | 
			
		||||
  def setUp(self):
 | 
			
		||||
    super(TestBase, self).setUp()
 | 
			
		||||
    self.file_tree = {}
 | 
			
		||||
    self.root = 'C:\\' if sys.platform == 'win32' else '/'
 | 
			
		||||
    self.cwd = self.root
 | 
			
		||||
    mock.patch('gclient_utils.FileRead', self.read).start()
 | 
			
		||||
    mock.patch('os.environ', {}).start()
 | 
			
		||||
    mock.patch('os.getcwd', self.getcwd).start()
 | 
			
		||||
    mock.patch('os.path.exists', self.exists).start()
 | 
			
		||||
    mock.patch('os.path.realpath', side_effect=lambda path: path).start()
 | 
			
		||||
    mock.patch('subprocess2.check_output').start()
 | 
			
		||||
    mock.patch('sys.platform', '').start()
 | 
			
		||||
    mock.patch('sys.stderr', StringIO()).start()
 | 
			
		||||
    self.addCleanup(mock.patch.stopall)
 | 
			
		||||
 | 
			
		||||
  def getcwd(self):
 | 
			
		||||
    return self.cwd
 | 
			
		||||
 | 
			
		||||
  def exists(self, path):
 | 
			
		||||
    return path in self.file_tree
 | 
			
		||||
 | 
			
		||||
  def read(self, path):
 | 
			
		||||
    return self.file_tree[path]
 | 
			
		||||
 | 
			
		||||
  def make_file_tree(self, file_tree):
 | 
			
		||||
    self.file_tree = {
 | 
			
		||||
      self.root + path: content
 | 
			
		||||
      for path, content in file_tree.items()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FindGclientRootTest(TestBase):
 | 
			
		||||
  def testFindGclientRoot(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': ''})
 | 
			
		||||
    self.assertEqual(self.root, gclient_paths.FindGclientRoot(self.root))
 | 
			
		||||
 | 
			
		||||
  def testGclientRootInParentDir(self):
 | 
			
		||||
    self.make_file_tree({
 | 
			
		||||
      '.gclient': '',
 | 
			
		||||
      '.gclient_entries': 'entries = {"foo": "..."}',
 | 
			
		||||
    })
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        self.root,
 | 
			
		||||
        gclient_paths.FindGclientRoot(os.path.join(self.root, 'foo', 'bar')))
 | 
			
		||||
 | 
			
		||||
  def testGclientRootInParentDir_NotInGclientEntries(self):
 | 
			
		||||
    self.make_file_tree({
 | 
			
		||||
      '.gclient': '',
 | 
			
		||||
      '.gclient_entries': 'entries = {"foo": "..."}',
 | 
			
		||||
    })
 | 
			
		||||
    self.assertIsNone(
 | 
			
		||||
        gclient_paths.FindGclientRoot(os.path.join(self.root, 'bar', 'baz')))
 | 
			
		||||
 | 
			
		||||
  def testGclientRootInParentDir_NoGclientEntriesFile(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': ''})
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        self.root,
 | 
			
		||||
        gclient_paths.FindGclientRoot(os.path.join(self.root, 'x', 'y', 'z')))
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        '%s missing, .gclient file in parent directory %s might not be the '
 | 
			
		||||
        'file you want to use.\n' % (
 | 
			
		||||
            os.path.join(self.root, '.gclient_entries'), self.root),
 | 
			
		||||
        sys.stderr.getvalue())
 | 
			
		||||
 | 
			
		||||
  def testGclientRootInParentDir_ErrorWhenParsingEntries(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', '.gclient_entries': ':P'})
 | 
			
		||||
    with self.assertRaises(Exception):
 | 
			
		||||
      gclient_paths.FindGclientRoot(os.path.join(self.root, 'foo', 'bar'))
 | 
			
		||||
 | 
			
		||||
  def testRootNotFound(self):
 | 
			
		||||
    self.assertIsNone(
 | 
			
		||||
        gclient_paths.FindGclientRoot(os.path.join(self.root, 'x', 'y', 'z')))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetGClientPrimarySolutionNameTest(TestBase):
 | 
			
		||||
  def testGetGClientPrimarySolutionName(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': 'solutions = [{"name": "foo"}]'})
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
      'foo', gclient_paths.GetGClientPrimarySolutionName(self.root))
 | 
			
		||||
 | 
			
		||||
  def testNoSolutionsInGclientFile(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': ''})
 | 
			
		||||
    self.assertIsNone(gclient_paths.GetGClientPrimarySolutionName(self.root))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetPrimarySolutionPathTest(TestBase):
 | 
			
		||||
  def testGetPrimarySolutionPath(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': 'solutions = [{"name": "foo"}]'})
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'foo'), gclient_paths.GetPrimarySolutionPath())
 | 
			
		||||
 | 
			
		||||
  def testSolutionNameDefaultsToSrc(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': ''})
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'src'), gclient_paths.GetPrimarySolutionPath())
 | 
			
		||||
 | 
			
		||||
  def testGclientRootNotFound_GitRootHasBuildtools(self):
 | 
			
		||||
    self.make_file_tree({os.path.join('foo', 'buildtools'): ''})
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo', 'bar')
 | 
			
		||||
    subprocess2.check_output.return_value = (
 | 
			
		||||
        os.path.join(self.root, 'foo').replace(os.sep, '/').encode('utf-8')
 | 
			
		||||
        + b'\n')
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'foo'), gclient_paths.GetPrimarySolutionPath())
 | 
			
		||||
 | 
			
		||||
  def testGclientRootNotFound_NoBuildtools(self):
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo', 'bar')
 | 
			
		||||
    subprocess2.check_output.return_value = b'/foo\n'
 | 
			
		||||
 | 
			
		||||
    self.assertIsNone(gclient_paths.GetPrimarySolutionPath())
 | 
			
		||||
 | 
			
		||||
  def testGclientRootNotFound_NotInAGitRepo_CurrentDirHasBuildtools(self):
 | 
			
		||||
    self.make_file_tree({os.path.join('foo', 'bar', 'buildtools'): ''})
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo', 'bar')
 | 
			
		||||
    subprocess2.check_output.side_effect = EXCEPTION
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(self.cwd, gclient_paths.GetPrimarySolutionPath())
 | 
			
		||||
 | 
			
		||||
  def testGclientRootNotFound_NotInAGitRepo_NoBuildtools(self):
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo')
 | 
			
		||||
    subprocess2.check_output.side_effect = EXCEPTION
 | 
			
		||||
 | 
			
		||||
    self.assertIsNone(gclient_paths.GetPrimarySolutionPath())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetBuildtoolsPathTest(TestBase):
 | 
			
		||||
  def testEnvVarOverride(self):
 | 
			
		||||
    os.environ = {'CHROMIUM_BUILDTOOLS_PATH': 'foo'}
 | 
			
		||||
 | 
			
		||||
    self.assertEqual('foo', gclient_paths.GetBuildtoolsPath())
 | 
			
		||||
 | 
			
		||||
  def testNoSolutionsFound(self):
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo', 'bar')
 | 
			
		||||
    subprocess2.check_output.side_effect = EXCEPTION
 | 
			
		||||
 | 
			
		||||
    self.assertIsNone(gclient_paths.GetBuildtoolsPath())
 | 
			
		||||
 | 
			
		||||
  def testBuildtoolsInSolution(self):
 | 
			
		||||
    self.make_file_tree({
 | 
			
		||||
      '.gclient': '',
 | 
			
		||||
      os.path.join('src', 'buildtools'): '',
 | 
			
		||||
    })
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'src', 'foo')
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'src', 'buildtools'),
 | 
			
		||||
        gclient_paths.GetBuildtoolsPath())
 | 
			
		||||
 | 
			
		||||
  def testBuildtoolsInGclientRoot(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', 'buildtools': ''})
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'src', 'foo')
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'buildtools'),
 | 
			
		||||
        gclient_paths.GetBuildtoolsPath())
 | 
			
		||||
 | 
			
		||||
  def testNoBuildtools(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': ''})
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo', 'bar')
 | 
			
		||||
 | 
			
		||||
    self.assertIsNone(gclient_paths.GetBuildtoolsPath())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetBuildtoolsPlatformBinaryPath(TestBase):
 | 
			
		||||
  def testNoBuildtoolsPath(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': ''})
 | 
			
		||||
    self.cwd = os.path.join(self.root, 'foo', 'bar')
 | 
			
		||||
    self.assertIsNone(gclient_paths.GetBuildtoolsPlatformBinaryPath())
 | 
			
		||||
 | 
			
		||||
  def testWin(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', 'buildtools': ''})
 | 
			
		||||
    sys.platform = 'win'
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'buildtools', 'win'),
 | 
			
		||||
        gclient_paths.GetBuildtoolsPlatformBinaryPath())
 | 
			
		||||
 | 
			
		||||
  def testCygwin(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', 'buildtools': ''})
 | 
			
		||||
    sys.platform = 'cygwin'
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'buildtools', 'win'),
 | 
			
		||||
        gclient_paths.GetBuildtoolsPlatformBinaryPath())
 | 
			
		||||
 | 
			
		||||
  def testMac(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', 'buildtools': ''})
 | 
			
		||||
    sys.platform = 'darwin'
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'buildtools', 'mac'),
 | 
			
		||||
        gclient_paths.GetBuildtoolsPlatformBinaryPath())
 | 
			
		||||
 | 
			
		||||
  def testLinux(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', 'buildtools': ''})
 | 
			
		||||
    sys.platform = 'linux'
 | 
			
		||||
 | 
			
		||||
    self.assertEqual(
 | 
			
		||||
        os.path.join(self.root, 'buildtools', 'linux64'),
 | 
			
		||||
        gclient_paths.GetBuildtoolsPlatformBinaryPath())
 | 
			
		||||
 | 
			
		||||
  def testError(self):
 | 
			
		||||
    self.make_file_tree({'.gclient': '', 'buildtools': ''})
 | 
			
		||||
    sys.platform = 'foo'
 | 
			
		||||
 | 
			
		||||
    with self.assertRaises(gclient_utils.Error, msg='Unknown platform: foo'):
 | 
			
		||||
      gclient_paths.GetBuildtoolsPlatformBinaryPath()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class GetExeSuffixTest(TestBase):
 | 
			
		||||
  def testGetExeSuffix(self):
 | 
			
		||||
    sys.platform = 'win'
 | 
			
		||||
    self.assertEqual('.exe', gclient_paths.GetExeSuffix())
 | 
			
		||||
 | 
			
		||||
    sys.platform = 'cygwin'
 | 
			
		||||
    self.assertEqual('.exe', gclient_paths.GetExeSuffix())
 | 
			
		||||
 | 
			
		||||
    sys.platform = 'foo'
 | 
			
		||||
    self.assertEqual('', gclient_paths.GetExeSuffix())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
  unittest.main()
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue