blob: 4a5c8c80be81fd8d605f76a8ed6b8b53e6816690 [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import unicode_literals
import os
import sys
import unittest
from mozfile.mozfile import NamedTemporaryFile
from mozunit import main
from mach.logging import LoggingManager
from mozbuild.base import (
BuildConfig,
MozbuildObject,
PathArgument,
)
from mozbuild.backend.configenvironment import ConfigEnvironment
curdir = os.path.dirname(__file__)
topsrcdir = os.path.abspath(os.path.join(curdir, '..', '..', '..', '..'))
log_manager = LoggingManager()
class TestMozbuildObject(unittest.TestCase):
def get_base(self):
return MozbuildObject(topsrcdir, None, log_manager)
def test_objdir_config_guess(self):
base = self.get_base()
with NamedTemporaryFile() as mozconfig:
os.environ[b'MOZCONFIG'] = mozconfig.name
self.assertIsNotNone(base.topobjdir)
self.assertEqual(len(base.topobjdir.split()), 1)
self.assertTrue(base.topobjdir.endswith(base._config_guess))
self.assertTrue(os.path.isabs(base.topobjdir))
self.assertTrue(base.topobjdir.startswith(topsrcdir))
del os.environ[b'MOZCONFIG']
def test_config_guess(self):
# It's difficult to test for exact values from the output of
# config.guess because they vary depending on platform.
base = self.get_base()
result = base._config_guess
self.assertIsNotNone(result)
self.assertGreater(len(result), 0)
@unittest.skip('Failing on buildbot (bug 853954).')
def test_config_environment(self):
base = self.get_base()
ce = base.config_environment
self.assertIsInstance(ce, ConfigEnvironment)
self.assertEqual(base.defines, ce.defines)
self.assertEqual(base.substs, ce.substs)
self.assertIsInstance(base.defines, dict)
self.assertIsInstance(base.substs, dict)
@unittest.skip('Failing on buildbot (bug 853954).')
def test_get_binary_path(self):
base = self.get_base()
platform = sys.platform
# We should ideally use the config.status from the build. Let's install
# a fake one.
substs = [('MOZ_APP_NAME', 'awesomeapp')]
if sys.platform.startswith('darwin'):
substs.append(('OS_ARCH', 'Darwin'))
substs.append(('BIN_SUFFIX', ''))
substs.append(('MOZ_MACBUNDLE_NAME', 'Nightly.app'))
elif sys.platform.startswith(('win32', 'cygwin')):
substs.append(('OS_ARCH', 'WINNT'))
substs.append(('BIN_SUFFIX', '.exe'))
else:
substs.append(('OS_ARCH', 'something'))
substs.append(('BIN_SUFFIX', ''))
base._config_environment = ConfigEnvironment(base.topsrcdir,
base.topobjdir, substs=substs)
p = base.get_binary_path('xpcshell', False)
if platform.startswith('darwin'):
self.assertTrue(p.endswith('Contents/MacOS/xpcshell'))
elif platform.startswith(('win32', 'cygwin')):
self.assertTrue(p.endswith('xpcshell.exe'))
else:
self.assertTrue(p.endswith('dist/bin/xpcshell'))
p = base.get_binary_path(validate_exists=False)
if platform.startswith('darwin'):
self.assertTrue(p.endswith('Contents/MacOS/awesomeapp'))
elif platform.startswith(('win32', 'cygwin')):
self.assertTrue(p.endswith('awesomeapp.exe'))
else:
self.assertTrue(p.endswith('dist/bin/awesomeapp'))
p = base.get_binary_path(validate_exists=False, where="staged-package")
if platform.startswith('darwin'):
self.assertTrue(p.endswith('awesomeapp/Nightly.app/Contents/MacOS/awesomeapp'))
elif platform.startswith(('win32', 'cygwin')):
self.assertTrue(p.endswith('awesomeapp/awesomeapp.exe'))
else:
self.assertTrue(p.endswith('awesomeapp/awesomeapp'))
self.assertRaises(Exception, base.get_binary_path, where="somewhere")
p = base.get_binary_path('foobar', validate_exists=False)
if platform.startswith('win32'):
self.assertTrue(p.endswith('foobar.exe'))
else:
self.assertTrue(p.endswith('foobar'))
class TestPathArgument(unittest.TestCase):
def test_path_argument(self):
# Absolute path
p = PathArgument("/obj/foo", "/src", "/obj", "/src")
self.assertEqual(p.relpath(), "foo")
self.assertEqual(p.srcdir_path(), "/src/foo")
self.assertEqual(p.objdir_path(), "/obj/foo")
# Relative path within srcdir
p = PathArgument("foo", "/src", "/obj", "/src")
self.assertEqual(p.relpath(), "foo")
self.assertEqual(p.srcdir_path(), "/src/foo")
self.assertEqual(p.objdir_path(), "/obj/foo")
# Relative path within subdirectory
p = PathArgument("bar", "/src", "/obj", "/src/foo")
self.assertEqual(p.relpath(), "foo/bar")
self.assertEqual(p.srcdir_path(), "/src/foo/bar")
self.assertEqual(p.objdir_path(), "/obj/foo/bar")
# Relative path within objdir
p = PathArgument("foo", "/src", "/obj", "/obj")
self.assertEqual(p.relpath(), "foo")
self.assertEqual(p.srcdir_path(), "/src/foo")
self.assertEqual(p.objdir_path(), "/obj/foo")
# "." path
p = PathArgument(".", "/src", "/obj", "/src/foo")
self.assertEqual(p.relpath(), "foo")
self.assertEqual(p.srcdir_path(), "/src/foo")
self.assertEqual(p.objdir_path(), "/obj/foo")
# Nested src/obj directories
p = PathArgument("bar", "/src", "/src/obj", "/src/obj/foo")
self.assertEqual(p.relpath(), "foo/bar")
self.assertEqual(p.srcdir_path(), "/src/foo/bar")
self.assertEqual(p.objdir_path(), "/src/obj/foo/bar")
if __name__ == '__main__':
main()