|
@@ -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()
|