|
Packit |
f0b94e |
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
Packit |
f0b94e |
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
Packit |
f0b94e |
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
from __future__ import unicode_literals
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
import os
|
|
Packit |
f0b94e |
import unittest
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
from mozunit import main
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
from mozbuild.frontend.context import (
|
|
Packit |
f0b94e |
ObjDirPath,
|
|
Packit |
f0b94e |
Path,
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
from mozbuild.frontend.data import (
|
|
Packit |
f0b94e |
ChromeManifestEntry,
|
|
Packit |
f0b94e |
ComputedFlags,
|
|
Packit |
f0b94e |
ConfigFileSubstitution,
|
|
Packit |
f0b94e |
Defines,
|
|
Packit |
f0b94e |
DirectoryTraversal,
|
|
Packit |
f0b94e |
Exports,
|
|
Packit |
f0b94e |
FinalTargetPreprocessedFiles,
|
|
Packit |
f0b94e |
GeneratedFile,
|
|
Packit |
f0b94e |
GeneratedSources,
|
|
Packit |
f0b94e |
HostDefines,
|
|
Packit |
f0b94e |
HostRustLibrary,
|
|
Packit |
f0b94e |
HostRustProgram,
|
|
Packit |
f0b94e |
HostSources,
|
|
Packit |
f0b94e |
IPDLCollection,
|
|
Packit |
f0b94e |
JARManifest,
|
|
Packit |
f0b94e |
LinkageMultipleRustLibrariesError,
|
|
Packit |
f0b94e |
LocalInclude,
|
|
Packit |
f0b94e |
LocalizedFiles,
|
|
Packit |
f0b94e |
LocalizedPreprocessedFiles,
|
|
Packit |
f0b94e |
Program,
|
|
Packit |
f0b94e |
RustLibrary,
|
|
Packit |
f0b94e |
RustProgram,
|
|
Packit |
f0b94e |
SharedLibrary,
|
|
Packit |
f0b94e |
SimpleProgram,
|
|
Packit |
f0b94e |
Sources,
|
|
Packit |
f0b94e |
StaticLibrary,
|
|
Packit |
f0b94e |
TestHarnessFiles,
|
|
Packit |
f0b94e |
TestManifest,
|
|
Packit |
f0b94e |
UnifiedSources,
|
|
Packit |
f0b94e |
VariablePassthru,
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
from mozbuild.frontend.emitter import TreeMetadataEmitter
|
|
Packit |
f0b94e |
from mozbuild.frontend.reader import (
|
|
Packit |
f0b94e |
BuildReader,
|
|
Packit |
f0b94e |
BuildReaderError,
|
|
Packit |
f0b94e |
SandboxValidationError,
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
from mozpack.chrome import manifest
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
from mozbuild.test.common import MockConfig
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
import mozpack.path as mozpath
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
data_path = mozpath.abspath(mozpath.dirname(__file__))
|
|
Packit |
f0b94e |
data_path = mozpath.join(data_path, 'data')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
class TestEmitterBasic(unittest.TestCase):
|
|
Packit |
f0b94e |
def setUp(self):
|
|
Packit |
f0b94e |
self._old_env = dict(os.environ)
|
|
Packit |
f0b94e |
os.environ.pop('MOZ_OBJDIR', None)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def tearDown(self):
|
|
Packit |
f0b94e |
os.environ.clear()
|
|
Packit |
f0b94e |
os.environ.update(self._old_env)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def reader(self, name, enable_tests=False, extra_substs=None):
|
|
Packit |
f0b94e |
substs = dict(
|
|
Packit |
f0b94e |
ENABLE_TESTS='1' if enable_tests else '',
|
|
Packit |
f0b94e |
BIN_SUFFIX='.prog',
|
|
Packit |
f0b94e |
OS_TARGET='WINNT',
|
|
Packit |
f0b94e |
COMPILE_ENVIRONMENT='1',
|
|
Packit |
f0b94e |
STL_FLAGS=['-I/path/to/topobjdir/dist/stl_wrappers'],
|
|
Packit |
f0b94e |
VISIBILITY_FLAGS=['-include',
|
|
Packit |
f0b94e |
'$(topsrcdir)/config/gcc_hidden.h'],
|
|
Packit |
f0b94e |
OBJ_SUFFIX='obj',
|
|
Packit |
f0b94e |
)
|
|
Packit |
f0b94e |
if extra_substs:
|
|
Packit |
f0b94e |
substs.update(extra_substs)
|
|
Packit |
f0b94e |
config = MockConfig(mozpath.join(data_path, name), extra_substs=substs)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return BuildReader(config)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def read_topsrcdir(self, reader, filter_common=True):
|
|
Packit |
f0b94e |
emitter = TreeMetadataEmitter(reader.config)
|
|
Packit |
f0b94e |
objs = list(emitter.emit(reader.read_topsrcdir()))
|
|
Packit |
f0b94e |
self.assertGreater(len(objs), 0)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
filtered = []
|
|
Packit |
f0b94e |
for obj in objs:
|
|
Packit |
f0b94e |
if filter_common and isinstance(obj, DirectoryTraversal):
|
|
Packit |
f0b94e |
continue
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
filtered.append(obj)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
return filtered
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_dirs_traversal_simple(self):
|
|
Packit |
f0b94e |
reader = self.reader('traversal-simple')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader, filter_common=False)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 4)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, DirectoryTraversal)
|
|
Packit |
f0b94e |
self.assertTrue(os.path.isabs(o.context_main_path))
|
|
Packit |
f0b94e |
self.assertEqual(len(o.context_all_paths), 1)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
reldirs = [o.relsrcdir for o in objs]
|
|
Packit |
f0b94e |
self.assertEqual(reldirs, ['', 'foo', 'foo/biz', 'bar'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
dirs = [[d.full_path for d in o.dirs] for o in objs]
|
|
Packit |
f0b94e |
self.assertEqual(dirs, [
|
|
Packit |
f0b94e |
[
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'foo'),
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'bar')
|
|
Packit |
f0b94e |
], [
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'foo', 'biz')
|
|
Packit |
f0b94e |
], [], []])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_traversal_all_vars(self):
|
|
Packit |
f0b94e |
reader = self.reader('traversal-all-vars')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader, filter_common=False)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 2)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, DirectoryTraversal)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
reldirs = set([o.relsrcdir for o in objs])
|
|
Packit |
f0b94e |
self.assertEqual(reldirs, set(['', 'regular']))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
reldir = o.relsrcdir
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if reldir == '':
|
|
Packit |
f0b94e |
self.assertEqual([d.full_path for d in o.dirs], [
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'regular')])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_traversal_all_vars_enable_tests(self):
|
|
Packit |
f0b94e |
reader = self.reader('traversal-all-vars', enable_tests=True)
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader, filter_common=False)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 3)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, DirectoryTraversal)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
reldirs = set([o.relsrcdir for o in objs])
|
|
Packit |
f0b94e |
self.assertEqual(reldirs, set(['', 'regular', 'test']))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
reldir = o.relsrcdir
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if reldir == '':
|
|
Packit |
f0b94e |
self.assertEqual([d.full_path for d in o.dirs], [
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'regular'),
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'test')])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_config_file_substitution(self):
|
|
Packit |
f0b94e |
reader = self.reader('config-file-substitution')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 2)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], ConfigFileSubstitution)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[1], ConfigFileSubstitution)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
topobjdir = mozpath.abspath(reader.config.topobjdir)
|
|
Packit |
f0b94e |
self.assertEqual(objs[0].relpath, 'foo')
|
|
Packit |
f0b94e |
self.assertEqual(mozpath.normpath(objs[0].output_path),
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(topobjdir, 'foo')))
|
|
Packit |
f0b94e |
self.assertEqual(mozpath.normpath(objs[1].output_path),
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(topobjdir, 'bar')))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_variable_passthru(self):
|
|
Packit |
f0b94e |
reader = self.reader('variable-passthru')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], VariablePassthru)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
wanted = {
|
|
Packit |
f0b94e |
'NO_DIST_INSTALL': True,
|
|
Packit |
f0b94e |
'RCFILE': 'foo.rc',
|
|
Packit |
f0b94e |
'RESFILE': 'bar.res',
|
|
Packit |
f0b94e |
'RCINCLUDE': 'bar.rc',
|
|
Packit |
f0b94e |
'DEFFILE': 'baz.def',
|
|
Packit |
f0b94e |
'WIN32_EXE_LDFLAGS': ['-subsystem:console'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
variables = objs[0].variables
|
|
Packit |
f0b94e |
maxDiff = self.maxDiff
|
|
Packit |
f0b94e |
self.maxDiff = None
|
|
Packit |
f0b94e |
self.assertEqual(wanted, variables)
|
|
Packit |
f0b94e |
self.maxDiff = maxDiff
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_compile_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'WARNINGS_AS_ERRORS': '-Werror',
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['STL'], reader.config.substs['STL_FLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['VISIBILITY'], reader.config.substs['VISIBILITY_FLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['WARNINGS_AS_ERRORS'], ['-Werror'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['MOZBUILD_CFLAGS'], ['-Wall', '-funroll-loops'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['MOZBUILD_CXXFLAGS'], ['-funroll-loops', '-Wall'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_asflags(self):
|
|
Packit |
f0b94e |
reader = self.reader('asflags', extra_substs={
|
|
Packit |
f0b94e |
'ASFLAGS': ['-safeseh'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
as_sources, sources, ldflags, lib, flags, asflags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(asflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(asflags.flags['OS'], reader.config.substs['ASFLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(asflags.flags['MOZBUILD'], ['-no-integrated-as'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_debug_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'MOZ_DEBUG_FLAGS': '-g',
|
|
Packit |
f0b94e |
'MOZ_DEBUG_SYMBOLS': '1',
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['DEBUG'], ['-g'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_disable_debug_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'MOZ_DEBUG_FLAGS': '-g',
|
|
Packit |
f0b94e |
'MOZ_DEBUG_SYMBOLS': '',
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['DEBUG'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_link_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('link-flags', extra_substs={
|
|
Packit |
f0b94e |
'OS_LDFLAGS': ['-Wl,rpath-link=/usr/lib'],
|
|
Packit |
f0b94e |
'LINKER_LDFLAGS': ['-fuse-ld=gold'],
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE': '',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_LDFLAGS': ['-Wl,-dead_strip'],
|
|
Packit |
f0b94e |
'MOZ_DEBUG_LDFLAGS': ['-framework ExceptionHandling'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, compile_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(ldflags.flags['OS'], reader.config.substs['OS_LDFLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(ldflags.flags['LINKER'], reader.config.substs['LINKER_LDFLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(ldflags.flags['MOZBUILD'], ['-Wl,-U_foo', '-framework Foo', '-x'])
|
|
Packit |
f0b94e |
self.assertEqual(ldflags.flags['OPTIMIZE'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_debug_ldflags(self):
|
|
Packit |
f0b94e |
reader = self.reader('link-flags', extra_substs={
|
|
Packit |
f0b94e |
'MOZ_DEBUG_SYMBOLS': '1',
|
|
Packit |
f0b94e |
'MOZ_DEBUG_LDFLAGS': ['-framework ExceptionHandling'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, compile_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(ldflags.flags['OS'],
|
|
Packit |
f0b94e |
reader.config.substs['MOZ_DEBUG_LDFLAGS'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_windows_opt_link_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('link-flags', extra_substs={
|
|
Packit |
f0b94e |
'OS_ARCH': 'WINNT',
|
|
Packit |
f0b94e |
'GNU_CC': '',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE': '1',
|
|
Packit |
f0b94e |
'MOZ_DEBUG_SYMBOLS': '1',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_FLAGS': [],
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_LDFLAGS': [],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, compile_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIn('-DEBUG', ldflags.flags['OS'])
|
|
Packit |
f0b94e |
self.assertIn('-OPT:REF,ICF', ldflags.flags['OS'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_windows_dmd_link_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('link-flags', extra_substs={
|
|
Packit |
f0b94e |
'OS_ARCH': 'WINNT',
|
|
Packit |
f0b94e |
'GNU_CC': '',
|
|
Packit |
f0b94e |
'MOZ_DMD': '1',
|
|
Packit |
f0b94e |
'MOZ_DEBUG_SYMBOLS': '1',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE': '1',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_FLAGS': [],
|
|
Packit |
f0b94e |
'OS_LDFLAGS': ['-Wl,-U_foo'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, compile_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(ldflags.flags['OS'],
|
|
Packit |
f0b94e |
['-DEBUG', '-OPT:REF,ICF'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_compile_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('host-compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'HOST_CXXFLAGS': ['-Wall', '-Werror'],
|
|
Packit |
f0b94e |
'HOST_CFLAGS': ['-Werror', '-Wall'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, flags, lib, target_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['HOST_CXXFLAGS'], reader.config.substs['HOST_CXXFLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['HOST_CFLAGS'], reader.config.substs['HOST_CFLAGS'])
|
|
Packit |
f0b94e |
self.assertEqual(set(flags.flags['HOST_DEFINES']),
|
|
Packit |
f0b94e |
set(['-DFOO', '-DBAZ="abcd"', '-UQUX', '-DBAR=7', '-DVALUE=xyz']))
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['MOZBUILD_HOST_CFLAGS'], ['-funroll-loops', '-host-arg'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['MOZBUILD_HOST_CXXFLAGS'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_no_optimize_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('host-compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE': '',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_FLAGS': ['-O2'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, flags, lib, target_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['HOST_OPTIMIZE'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_optimize_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('host-compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE': '1',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_FLAGS': ['-O2'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, flags, lib, target_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['HOST_OPTIMIZE'], ['-O2'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_cross_optimize_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('host-compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE': '1',
|
|
Packit |
f0b94e |
'MOZ_OPTIMIZE_FLAGS': ['-O2'],
|
|
Packit |
f0b94e |
'HOST_OPTIMIZE_FLAGS': ['-O3'],
|
|
Packit |
f0b94e |
'CROSS_COMPILE': '1',
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, flags, lib, target_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['HOST_OPTIMIZE'], ['-O3'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_rtl_flag(self):
|
|
Packit |
f0b94e |
reader = self.reader('host-compile-flags', extra_substs={
|
|
Packit |
f0b94e |
'OS_ARCH': 'WINNT',
|
|
Packit |
f0b94e |
'MOZ_DEBUG': '1',
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, flags, lib, target_flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['RTL'], ['-MDd'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_compile_flags_validation(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-flags-field-validation')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(BuildReaderError, 'Invalid value.'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
reader = self.reader('compile-flags-type-validation')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(BuildReaderError,
|
|
Packit |
f0b94e |
'A list of strings must be provided'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_compile_flags_templates(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-flags-templates', extra_substs={
|
|
Packit |
f0b94e |
'NSPR_CFLAGS': ['-I/nspr/path'],
|
|
Packit |
f0b94e |
'NSS_CFLAGS': ['-I/nss/path'],
|
|
Packit |
f0b94e |
'MOZ_JPEG_CFLAGS': ['-I/jpeg/path'],
|
|
Packit |
f0b94e |
'MOZ_PNG_CFLAGS': ['-I/png/path'],
|
|
Packit |
f0b94e |
'MOZ_ZLIB_CFLAGS': ['-I/zlib/path'],
|
|
Packit |
f0b94e |
'MOZ_PIXMAN_CFLAGS': ['-I/pixman/path'],
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['STL'], [])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['VISIBILITY'], [])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['OS_INCLUDES'], [
|
|
Packit |
f0b94e |
'-I/nspr/path',
|
|
Packit |
f0b94e |
'-I/nss/path',
|
|
Packit |
f0b94e |
'-I/jpeg/path',
|
|
Packit |
f0b94e |
'-I/png/path',
|
|
Packit |
f0b94e |
'-I/zlib/path',
|
|
Packit |
f0b94e |
'-I/pixman/path',
|
|
Packit |
f0b94e |
])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_disable_stl_wrapping(self):
|
|
Packit |
f0b94e |
reader = self.reader('disable-stl-wrapping')
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['STL'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_visibility_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('visibility-flags')
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['VISIBILITY'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_defines_in_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-defines')
|
|
Packit |
f0b94e |
defines, sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['LIBRARY_DEFINES'],
|
|
Packit |
f0b94e |
['-DMOZ_LIBRARY_DEFINE=MOZ_TEST'])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['DEFINES'],
|
|
Packit |
f0b94e |
['-DMOZ_TEST_DEFINE'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_resolved_flags_error(self):
|
|
Packit |
f0b94e |
reader = self.reader('resolved-flags-error')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(BuildReaderError,
|
|
Packit |
f0b94e |
"`DEFINES` may not be set in COMPILE_FLAGS from moz.build"):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_includes_in_flags(self):
|
|
Packit |
f0b94e |
reader = self.reader('compile-includes')
|
|
Packit |
f0b94e |
defines, sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['BASE_INCLUDES'],
|
|
Packit |
f0b94e |
['-I%s' % reader.config.topsrcdir,
|
|
Packit |
f0b94e |
'-I%s' % reader.config.topobjdir])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['EXTRA_INCLUDES'],
|
|
Packit |
f0b94e |
['-I%s/dist/include' % reader.config.topobjdir])
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['LOCAL_INCLUDES'],
|
|
Packit |
f0b94e |
['-I%s/subdir' % reader.config.topsrcdir])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_allow_compiler_warnings(self):
|
|
Packit |
f0b94e |
reader = self.reader('allow-compiler-warnings', extra_substs={
|
|
Packit |
f0b94e |
'WARNINGS_AS_ERRORS': '-Werror',
|
|
Packit |
f0b94e |
})
|
|
Packit |
f0b94e |
sources, ldflags, lib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertEqual(flags.flags['WARNINGS_AS_ERRORS'], [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_use_yasm(self):
|
|
Packit |
f0b94e |
# When yasm is not available, this should raise.
|
|
Packit |
f0b94e |
reader = self.reader('use-yasm')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'yasm is not available'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# When yasm is available, this should work.
|
|
Packit |
f0b94e |
reader = self.reader('use-yasm',
|
|
Packit |
f0b94e |
extra_substs=dict(
|
|
Packit |
f0b94e |
YASM='yasm',
|
|
Packit |
f0b94e |
YASM_ASFLAGS='-foo',
|
|
Packit |
f0b94e |
))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
sources, passthru, ldflags, lib, flags, asflags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertIsInstance(passthru, VariablePassthru)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(asflags, ComputedFlags)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(asflags.flags['OS'], reader.config.substs['YASM_ASFLAGS'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
maxDiff = self.maxDiff
|
|
Packit |
f0b94e |
self.maxDiff = None
|
|
Packit |
f0b94e |
self.assertEqual(passthru.variables,
|
|
Packit |
f0b94e |
{'AS': 'yasm',
|
|
Packit |
f0b94e |
'AS_DASH_C_FLAG': ''})
|
|
Packit |
f0b94e |
self.maxDiff = maxDiff
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_files(self):
|
|
Packit |
f0b94e |
reader = self.reader('generated-files')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 3)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, GeneratedFile)
|
|
Packit |
f0b94e |
self.assertFalse(o.localized)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = ['bar.c', 'foo.c', ('xpidllex.py', 'xpidlyacc.py'), ]
|
|
Packit |
f0b94e |
for o, f in zip(objs, expected):
|
|
Packit |
f0b94e |
expected_filename = f if isinstance(f, tuple) else (f,)
|
|
Packit |
f0b94e |
self.assertEqual(o.outputs, expected_filename)
|
|
Packit |
f0b94e |
self.assertEqual(o.script, None)
|
|
Packit |
f0b94e |
self.assertEqual(o.method, None)
|
|
Packit |
f0b94e |
self.assertEqual(o.inputs, [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_generated_files(self):
|
|
Packit |
f0b94e |
reader = self.reader('localized-generated-files')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 2)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, GeneratedFile)
|
|
Packit |
f0b94e |
self.assertTrue(o.localized)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = ['abc.ini', ('bar', 'baz'), ]
|
|
Packit |
f0b94e |
for o, f in zip(objs, expected):
|
|
Packit |
f0b94e |
expected_filename = f if isinstance(f, tuple) else (f,)
|
|
Packit |
f0b94e |
self.assertEqual(o.outputs, expected_filename)
|
|
Packit |
f0b94e |
self.assertEqual(o.script, None)
|
|
Packit |
f0b94e |
self.assertEqual(o.method, None)
|
|
Packit |
f0b94e |
self.assertEqual(o.inputs, [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_files_from_generated(self):
|
|
Packit |
f0b94e |
"""Test that using LOCALIZED_GENERATED_FILES and then putting the output in
|
|
Packit |
f0b94e |
LOCALIZED_FILES as an objdir path works.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('localized-files-from-generated')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 2)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], GeneratedFile)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[1], LocalizedFiles)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_files_not_localized_generated(self):
|
|
Packit |
f0b94e |
"""Test that using GENERATED_FILES and then putting the output in
|
|
Packit |
f0b94e |
LOCALIZED_FILES as an objdir path produces an error.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('localized-files-not-localized-generated')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Objdir file listed in LOCALIZED_FILES not in LOCALIZED_GENERATED_FILES:'):
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_generated_files_final_target_files(self):
|
|
Packit |
f0b94e |
"""Test that using LOCALIZED_GENERATED_FILES and then putting the output in
|
|
Packit |
f0b94e |
FINAL_TARGET_FILES as an objdir path produces an error.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('localized-generated-files-final-target-files')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Outputs of LOCALIZED_GENERATED_FILES cannot be used in FINAL_TARGET_FILES:'):
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_files_method_names(self):
|
|
Packit |
f0b94e |
reader = self.reader('generated-files-method-names')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 2)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, GeneratedFile)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = ['bar.c', 'foo.c']
|
|
Packit |
f0b94e |
expected_method_names = ['make_bar', 'main']
|
|
Packit |
f0b94e |
for o, expected_filename, expected_method in zip(objs, expected, expected_method_names):
|
|
Packit |
f0b94e |
self.assertEqual(o.outputs, (expected_filename,))
|
|
Packit |
f0b94e |
self.assertEqual(o.method, expected_method)
|
|
Packit |
f0b94e |
self.assertEqual(o.inputs, [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_files_absolute_script(self):
|
|
Packit |
f0b94e |
reader = self.reader('generated-files-absolute-script')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
o = objs[0]
|
|
Packit |
f0b94e |
self.assertIsInstance(o, GeneratedFile)
|
|
Packit |
f0b94e |
self.assertEqual(o.outputs, ('bar.c',))
|
|
Packit |
f0b94e |
self.assertRegexpMatches(o.script, 'script.py$')
|
|
Packit |
f0b94e |
self.assertEqual(o.method, 'make_bar')
|
|
Packit |
f0b94e |
self.assertEqual(o.inputs, [])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_files_no_script(self):
|
|
Packit |
f0b94e |
reader = self.reader('generated-files-no-script')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Script for generating bar.c does not exist'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_files_no_inputs(self):
|
|
Packit |
f0b94e |
reader = self.reader('generated-files-no-inputs')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Input for generating foo.c does not exist'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_files_no_python_script(self):
|
|
Packit |
f0b94e |
reader = self.reader('generated-files-no-python-script')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Script for generating bar.c does not end in .py'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_exports(self):
|
|
Packit |
f0b94e |
reader = self.reader('exports')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], Exports)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
('', ['foo.h', 'bar.h', 'baz.h']),
|
|
Packit |
f0b94e |
('mozilla', ['mozilla1.h', 'mozilla2.h']),
|
|
Packit |
f0b94e |
('mozilla/dom', ['dom1.h', 'dom2.h', 'dom3.h']),
|
|
Packit |
f0b94e |
('mozilla/gfx', ['gfx.h']),
|
|
Packit |
f0b94e |
('nspr/private', ['pprio.h', 'pprthred.h']),
|
|
Packit |
f0b94e |
('vpx', ['mem.h', 'mem2.h']),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
for (expect_path, expect_headers), (actual_path, actual_headers) in \
|
|
Packit |
f0b94e |
zip(expected, [(path, list(seq)) for path, seq in objs[0].files.walk()]):
|
|
Packit |
f0b94e |
self.assertEqual(expect_path, actual_path)
|
|
Packit |
f0b94e |
self.assertEqual(expect_headers, actual_headers)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_exports_missing(self):
|
|
Packit |
f0b94e |
'''
|
|
Packit |
f0b94e |
Missing files in EXPORTS is an error.
|
|
Packit |
f0b94e |
'''
|
|
Packit |
f0b94e |
reader = self.reader('exports-missing')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'File listed in EXPORTS does not exist:'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_exports_missing_generated(self):
|
|
Packit |
f0b94e |
'''
|
|
Packit |
f0b94e |
An objdir file in EXPORTS that is not in GENERATED_FILES is an error.
|
|
Packit |
f0b94e |
'''
|
|
Packit |
f0b94e |
reader = self.reader('exports-missing-generated')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Objdir file listed in EXPORTS not in GENERATED_FILES:'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_exports_generated(self):
|
|
Packit |
f0b94e |
reader = self.reader('exports-generated')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 2)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], GeneratedFile)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[1], Exports)
|
|
Packit |
f0b94e |
exports = [(path, list(seq)) for path, seq in objs[1].files.walk()]
|
|
Packit |
f0b94e |
self.assertEqual(exports,
|
|
Packit |
f0b94e |
[('', ['foo.h']),
|
|
Packit |
f0b94e |
('mozilla', ['mozilla1.h', '!mozilla2.h'])])
|
|
Packit |
f0b94e |
path, files = exports[1]
|
|
Packit |
f0b94e |
self.assertIsInstance(files[1], ObjDirPath)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_harness_files(self):
|
|
Packit |
f0b94e |
reader = self.reader('test-harness-files')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], TestHarnessFiles)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'mochitest': ['runtests.py', 'utils.py'],
|
|
Packit |
f0b94e |
'testing/mochitest': ['mochitest.py', 'mochitest.ini'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for path, strings in objs[0].files.walk():
|
|
Packit |
f0b94e |
self.assertTrue(path in expected)
|
|
Packit |
f0b94e |
basenames = sorted(mozpath.basename(s) for s in strings)
|
|
Packit |
f0b94e |
self.assertEqual(sorted(expected[path]), basenames)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_harness_files_root(self):
|
|
Packit |
f0b94e |
reader = self.reader('test-harness-files-root')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Cannot install files to the root of TEST_HARNESS_FILES'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_program(self):
|
|
Packit |
f0b94e |
reader = self.reader('program')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 6)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], Sources)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[1], ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[2], ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[3], Program)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[4], SimpleProgram)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[5], SimpleProgram)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(objs[3].program, 'test_program.prog')
|
|
Packit |
f0b94e |
self.assertEqual(objs[4].program, 'test_program1.prog')
|
|
Packit |
f0b94e |
self.assertEqual(objs[5].program, 'test_program2.prog')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(objs[4].objs,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topobjdir,
|
|
Packit |
f0b94e |
'test_program1.%s' %
|
|
Packit |
f0b94e |
reader.config.substs['OBJ_SUFFIX'])])
|
|
Packit |
f0b94e |
self.assertEqual(objs[5].objs,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topobjdir,
|
|
Packit |
f0b94e |
'test_program2.%s' %
|
|
Packit |
f0b94e |
reader.config.substs['OBJ_SUFFIX'])])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_missing_manifest(self):
|
|
Packit |
f0b94e |
"""A missing manifest file should result in an error."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-missing-manifest')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(BuildReaderError, 'IOError: Missing files'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_empty_test_manifest_rejected(self):
|
|
Packit |
f0b94e |
"""A test manifest without any entries is rejected."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-empty')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'Empty test manifest'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_just_support_files(self):
|
|
Packit |
f0b94e |
"""A test manifest with no tests but support-files is not supported."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-just-support')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'Empty test manifest'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_dupe_support_files(self):
|
|
Packit |
f0b94e |
"""A test manifest with dupe support-files in a single test is not
|
|
Packit |
f0b94e |
supported.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-dupes')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'bar.js appears multiple times '
|
|
Packit |
f0b94e |
'in a test manifest under a support-files field, please omit the duplicate entry.'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_absolute_support_files(self):
|
|
Packit |
f0b94e |
"""Support files starting with '/' are placed relative to the install root"""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-absolute-support')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
o = objs[0]
|
|
Packit |
f0b94e |
self.assertEqual(len(o.installs), 3)
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "../.well-known/foo.txt")),
|
|
Packit |
f0b94e |
mozpath.join(o.install_prefix, "absolute-support.ini"),
|
|
Packit |
f0b94e |
mozpath.join(o.install_prefix, "test_file.js"),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
paths = sorted([v[0] for v in o.installs.values()])
|
|
Packit |
f0b94e |
self.assertEqual(paths, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
@unittest.skip('Bug 1304316 - Items in the second set but not the first')
|
|
Packit |
f0b94e |
def test_test_manifest_shared_support_files(self):
|
|
Packit |
f0b94e |
"""Support files starting with '!' are given separate treatment, so their
|
|
Packit |
f0b94e |
installation can be resolved when running tests.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-shared-support')
|
|
Packit |
f0b94e |
supported, child = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected_deferred_installs = {
|
|
Packit |
f0b94e |
'!/child/test_sub.js',
|
|
Packit |
f0b94e |
'!/child/another-file.sjs',
|
|
Packit |
f0b94e |
'!/child/data/**',
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(supported.installs), 3)
|
|
Packit |
f0b94e |
self.assertEqual(set(supported.deferred_installs),
|
|
Packit |
f0b94e |
expected_deferred_installs)
|
|
Packit |
f0b94e |
self.assertEqual(len(child.installs), 3)
|
|
Packit |
f0b94e |
self.assertEqual(len(child.pattern_installs), 1)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_deffered_install_missing(self):
|
|
Packit |
f0b94e |
"""A non-existent shared support file reference produces an error."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-shared-missing')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'entry in support-files not present in the srcdir'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_install_to_subdir(self):
|
|
Packit |
f0b94e |
""" """
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-install-subdir')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
o = objs[0]
|
|
Packit |
f0b94e |
self.assertEqual(len(o.installs), 3)
|
|
Packit |
f0b94e |
self.assertEqual(o.manifest_relpath, "subdir.ini")
|
|
Packit |
f0b94e |
self.assertEqual(o.manifest_obj_relpath, "subdir/subdir.ini")
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "subdir/subdir.ini")),
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "subdir/support.txt")),
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "subdir/test_foo.html")),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
paths = sorted([v[0] for v in o.installs.values()])
|
|
Packit |
f0b94e |
self.assertEqual(paths, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_install_includes(self):
|
|
Packit |
f0b94e |
"""Ensure that any [include:foo.ini] are copied to the objdir."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-install-includes')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
o = objs[0]
|
|
Packit |
f0b94e |
self.assertEqual(len(o.installs), 3)
|
|
Packit |
f0b94e |
self.assertEqual(o.manifest_relpath, "mochitest.ini")
|
|
Packit |
f0b94e |
self.assertEqual(o.manifest_obj_relpath, "subdir/mochitest.ini")
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "subdir/common.ini")),
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "subdir/mochitest.ini")),
|
|
Packit |
f0b94e |
mozpath.normpath(mozpath.join(o.install_prefix, "subdir/test_foo.html")),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
paths = sorted([v[0] for v in o.installs.values()])
|
|
Packit |
f0b94e |
self.assertEqual(paths, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_includes(self):
|
|
Packit |
f0b94e |
"""Ensure that manifest objects from the emitter list a correct manifest.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-emitted-includes')
|
|
Packit |
f0b94e |
[obj] = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Expected manifest leafs for our tests.
|
|
Packit |
f0b94e |
expected_manifests = {
|
|
Packit |
f0b94e |
'reftest1.html': 'reftest.list',
|
|
Packit |
f0b94e |
'reftest1-ref.html': 'reftest.list',
|
|
Packit |
f0b94e |
'reftest2.html': 'included-reftest.list',
|
|
Packit |
f0b94e |
'reftest2-ref.html': 'included-reftest.list',
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for t in obj.tests:
|
|
Packit |
f0b94e |
self.assertTrue(t['manifest'].endswith(expected_manifests[t['name']]))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_keys_extracted(self):
|
|
Packit |
f0b94e |
"""Ensure all metadata from test manifests is extracted."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-keys-extracted')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
objs = [o for o in self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
if isinstance(o, TestManifest)]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 9)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
metadata = {
|
|
Packit |
f0b94e |
'a11y.ini': {
|
|
Packit |
f0b94e |
'flavor': 'a11y',
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'a11y.ini': False,
|
|
Packit |
f0b94e |
'test_a11y.js': True,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'pattern-installs': 1,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'browser.ini': {
|
|
Packit |
f0b94e |
'flavor': 'browser-chrome',
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'browser.ini': False,
|
|
Packit |
f0b94e |
'test_browser.js': True,
|
|
Packit |
f0b94e |
'support1': False,
|
|
Packit |
f0b94e |
'support2': False,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'metro.ini': {
|
|
Packit |
f0b94e |
'flavor': 'metro-chrome',
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'metro.ini': False,
|
|
Packit |
f0b94e |
'test_metro.js': True,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'mochitest.ini': {
|
|
Packit |
f0b94e |
'flavor': 'mochitest',
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'mochitest.ini': False,
|
|
Packit |
f0b94e |
'test_mochitest.js': True,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'external': {
|
|
Packit |
f0b94e |
'external1',
|
|
Packit |
f0b94e |
'external2',
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'chrome.ini': {
|
|
Packit |
f0b94e |
'flavor': 'chrome',
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'chrome.ini': False,
|
|
Packit |
f0b94e |
'test_chrome.js': True,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'xpcshell.ini': {
|
|
Packit |
f0b94e |
'flavor': 'xpcshell',
|
|
Packit |
f0b94e |
'dupe': True,
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'xpcshell.ini': False,
|
|
Packit |
f0b94e |
'test_xpcshell.js': True,
|
|
Packit |
f0b94e |
'head1': False,
|
|
Packit |
f0b94e |
'head2': False,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'reftest.list': {
|
|
Packit |
f0b94e |
'flavor': 'reftest',
|
|
Packit |
f0b94e |
'installs': {},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'crashtest.list': {
|
|
Packit |
f0b94e |
'flavor': 'crashtest',
|
|
Packit |
f0b94e |
'installs': {},
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
'python.ini': {
|
|
Packit |
f0b94e |
'flavor': 'python',
|
|
Packit |
f0b94e |
'installs': {
|
|
Packit |
f0b94e |
'python.ini': False,
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
m = metadata[mozpath.basename(o.manifest_relpath)]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertTrue(o.path.startswith(o.directory))
|
|
Packit |
f0b94e |
self.assertEqual(o.flavor, m['flavor'])
|
|
Packit |
f0b94e |
self.assertEqual(o.dupe_manifest, m.get('dupe', False))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
external_normalized = set(mozpath.basename(p) for p in
|
|
Packit |
f0b94e |
o.external_installs)
|
|
Packit |
f0b94e |
self.assertEqual(external_normalized, m.get('external', set()))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(o.installs), len(m['installs']))
|
|
Packit |
f0b94e |
for path in o.installs.keys():
|
|
Packit |
f0b94e |
self.assertTrue(path.startswith(o.directory))
|
|
Packit |
f0b94e |
relpath = path[len(o.directory)+1:]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertIn(relpath, m['installs'])
|
|
Packit |
f0b94e |
self.assertEqual(o.installs[path][1], m['installs'][relpath])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if 'pattern-installs' in m:
|
|
Packit |
f0b94e |
self.assertEqual(len(o.pattern_installs), m['pattern-installs'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_unmatched_generated(self):
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-unmatched-generated')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'entry in generated-files not present elsewhere'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader),
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_parent_support_files_dir(self):
|
|
Packit |
f0b94e |
"""support-files referencing a file in a parent directory works."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-parent-support-files-dir')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
objs = [o for o in self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
if isinstance(o, TestManifest)]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
o = objs[0]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = mozpath.join(o.srcdir, 'support-file.txt')
|
|
Packit |
f0b94e |
self.assertIn(expected, o.installs)
|
|
Packit |
f0b94e |
self.assertEqual(o.installs[expected],
|
|
Packit |
f0b94e |
('testing/mochitest/tests/child/support-file.txt', False))
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_missing_test_error(self):
|
|
Packit |
f0b94e |
"""Missing test files should result in error."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-missing-test-file')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'lists test that does not exist: test_missing.html'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_test_manifest_missing_test_error_unfiltered(self):
|
|
Packit |
f0b94e |
"""Missing test files should result in error, even when the test list is not filtered."""
|
|
Packit |
f0b94e |
reader = self.reader('test-manifest-missing-test-file-unfiltered')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'lists test that does not exist: missing.js'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_ipdl_sources(self):
|
|
Packit |
f0b94e |
reader = self.reader('ipdl_sources',
|
|
Packit |
f0b94e |
extra_substs={'IPDL_ROOT': mozpath.abspath('/path/to/topobjdir')})
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
ipdl_collection = objs[0]
|
|
Packit |
f0b94e |
self.assertIsInstance(ipdl_collection, IPDLCollection)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
ipdls = set(mozpath.relpath(p, ipdl_collection.topsrcdir)
|
|
Packit |
f0b94e |
for p in ipdl_collection.all_regular_sources())
|
|
Packit |
f0b94e |
expected = set([
|
|
Packit |
f0b94e |
'bar/bar.ipdl',
|
|
Packit |
f0b94e |
'bar/bar2.ipdlh',
|
|
Packit |
f0b94e |
'foo/foo.ipdl',
|
|
Packit |
f0b94e |
'foo/foo2.ipdlh',
|
|
Packit |
f0b94e |
])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(ipdls, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
pp_ipdls = set(mozpath.relpath(p, ipdl_collection.topsrcdir)
|
|
Packit |
f0b94e |
for p in ipdl_collection.all_preprocessed_sources())
|
|
Packit |
f0b94e |
expected = set([
|
|
Packit |
f0b94e |
'bar/bar1.ipdl',
|
|
Packit |
f0b94e |
'foo/foo1.ipdl',
|
|
Packit |
f0b94e |
])
|
|
Packit |
f0b94e |
self.assertEqual(pp_ipdls, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
generated_sources = set(ipdl_collection.all_generated_sources())
|
|
Packit |
f0b94e |
expected = set([
|
|
Packit |
f0b94e |
'bar.cpp',
|
|
Packit |
f0b94e |
'barChild.cpp',
|
|
Packit |
f0b94e |
'barParent.cpp',
|
|
Packit |
f0b94e |
'bar1.cpp',
|
|
Packit |
f0b94e |
'bar1Child.cpp',
|
|
Packit |
f0b94e |
'bar1Parent.cpp',
|
|
Packit |
f0b94e |
'bar2.cpp',
|
|
Packit |
f0b94e |
'foo.cpp',
|
|
Packit |
f0b94e |
'fooChild.cpp',
|
|
Packit |
f0b94e |
'fooParent.cpp',
|
|
Packit |
f0b94e |
'foo1.cpp',
|
|
Packit |
f0b94e |
'foo1Child.cpp',
|
|
Packit |
f0b94e |
'foo1Parent.cpp',
|
|
Packit |
f0b94e |
'foo2.cpp'
|
|
Packit |
f0b94e |
])
|
|
Packit |
f0b94e |
self.assertEqual(generated_sources, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_local_includes(self):
|
|
Packit |
f0b94e |
"""Test that LOCAL_INCLUDES is emitted correctly."""
|
|
Packit |
f0b94e |
reader = self.reader('local_includes')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
local_includes = [o.path for o in objs if isinstance(o, LocalInclude)]
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
'/bar/baz',
|
|
Packit |
f0b94e |
'foo',
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(local_includes, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
local_includes = [o.path.full_path
|
|
Packit |
f0b94e |
for o in objs if isinstance(o, LocalInclude)]
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'bar/baz'),
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'foo'),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(local_includes, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_includes(self):
|
|
Packit |
f0b94e |
"""Test that GENERATED_INCLUDES is emitted correctly."""
|
|
Packit |
f0b94e |
reader = self.reader('generated_includes')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
generated_includes = [o.path for o in objs if isinstance(o, LocalInclude)]
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
'!/bar/baz',
|
|
Packit |
f0b94e |
'!foo',
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(generated_includes, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
generated_includes = [o.path.full_path
|
|
Packit |
f0b94e |
for o in objs if isinstance(o, LocalInclude)]
|
|
Packit |
f0b94e |
expected = [
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topobjdir, 'bar/baz'),
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topobjdir, 'foo'),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(generated_includes, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_defines(self):
|
|
Packit |
f0b94e |
reader = self.reader('defines')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
defines = {}
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
if isinstance(o, Defines):
|
|
Packit |
f0b94e |
defines = o.defines
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'BAR': 7,
|
|
Packit |
f0b94e |
'BAZ': '"abcd"',
|
|
Packit |
f0b94e |
'FOO': True,
|
|
Packit |
f0b94e |
'VALUE': 'xyz',
|
|
Packit |
f0b94e |
'QUX': False,
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(defines, expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_jar_manifests(self):
|
|
Packit |
f0b94e |
reader = self.reader('jar-manifests')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
for obj in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(obj, JARManifest)
|
|
Packit |
f0b94e |
self.assertIsInstance(obj.path, Path)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_jar_manifests_multiple_files(self):
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'limited to one value'):
|
|
Packit |
f0b94e |
reader = self.reader('jar-manifests-multiple-files')
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_xpidl_module_no_sources(self):
|
|
Packit |
f0b94e |
"""XPIDL_MODULE without XPIDL_SOURCES should be rejected."""
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'XPIDL_MODULE '
|
|
Packit |
f0b94e |
'cannot be defined'):
|
|
Packit |
f0b94e |
reader = self.reader('xpidl-module-no-sources')
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_missing_local_includes(self):
|
|
Packit |
f0b94e |
"""LOCAL_INCLUDES containing non-existent directories should be rejected."""
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'Path specified in '
|
|
Packit |
f0b94e |
'LOCAL_INCLUDES does not exist'):
|
|
Packit |
f0b94e |
reader = self.reader('missing-local-includes')
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_library_defines(self):
|
|
Packit |
f0b94e |
"""Test that LIBRARY_DEFINES is propagated properly."""
|
|
Packit |
f0b94e |
reader = self.reader('library-defines')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
libraries = [o for o in objs if isinstance(o,StaticLibrary)]
|
|
Packit |
f0b94e |
library_flags = [o for o in objs if isinstance(o, ComputedFlags)
|
|
Packit |
f0b94e |
and 'LIBRARY_DEFINES' in o.flags]
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'liba': '-DIN_LIBA',
|
|
Packit |
f0b94e |
'libb': '-DIN_LIBA -DIN_LIBB',
|
|
Packit |
f0b94e |
'libc': '-DIN_LIBA -DIN_LIBB',
|
|
Packit |
f0b94e |
'libd': ''
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
defines = {}
|
|
Packit |
f0b94e |
for lib in libraries:
|
|
Packit |
f0b94e |
defines[lib.basename] = ' '.join(lib.lib_defines.get_defines())
|
|
Packit |
f0b94e |
self.assertEqual(expected, defines)
|
|
Packit |
f0b94e |
defines_in_flags = {}
|
|
Packit |
f0b94e |
for flags in library_flags:
|
|
Packit |
f0b94e |
defines_in_flags[flags.relobjdir] = ' '.join(flags.flags['LIBRARY_DEFINES'] or [])
|
|
Packit |
f0b94e |
self.assertEqual(expected, defines_in_flags)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_sources(self):
|
|
Packit |
f0b94e |
"""Test that SOURCES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('sources')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
as_flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(as_flags, ComputedFlags)
|
|
Packit |
f0b94e |
computed_flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(computed_flags, ComputedFlags)
|
|
Packit |
f0b94e |
# The third to last object is a Linkable.
|
|
Packit |
f0b94e |
linkable = objs.pop()
|
|
Packit |
f0b94e |
self.assertTrue(linkable.cxx_link)
|
|
Packit |
f0b94e |
ld_flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(ld_flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 6)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, Sources)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
suffix_map = {obj.canonical_suffix: obj for obj in objs}
|
|
Packit |
f0b94e |
self.assertEqual(len(suffix_map), 6)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'.cpp': ['a.cpp', 'b.cc', 'c.cxx'],
|
|
Packit |
f0b94e |
'.c': ['d.c'],
|
|
Packit |
f0b94e |
'.m': ['e.m'],
|
|
Packit |
f0b94e |
'.mm': ['f.mm'],
|
|
Packit |
f0b94e |
'.S': ['g.S'],
|
|
Packit |
f0b94e |
'.s': ['h.s', 'i.asm'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
for suffix, files in expected.items():
|
|
Packit |
f0b94e |
sources = suffix_map[suffix]
|
|
Packit |
f0b94e |
self.assertEqual(
|
|
Packit |
f0b94e |
sources.files,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topsrcdir, f) for f in files])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertIn(mozpath.join(reader.config.topobjdir,
|
|
Packit |
f0b94e |
'%s.%s' % (mozpath.splitext(f)[0],
|
|
Packit |
f0b94e |
reader.config.substs['OBJ_SUFFIX'])),
|
|
Packit |
f0b94e |
linkable.objs)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_sources_just_c(self):
|
|
Packit |
f0b94e |
"""Test that a linkable with no C++ sources doesn't have cxx_link set."""
|
|
Packit |
f0b94e |
reader = self.reader('sources-just-c')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
as_flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(as_flags, ComputedFlags)
|
|
Packit |
f0b94e |
flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
# The third to last object is a Linkable.
|
|
Packit |
f0b94e |
linkable = objs.pop()
|
|
Packit |
f0b94e |
self.assertFalse(linkable.cxx_link)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_linkables_cxx_link(self):
|
|
Packit |
f0b94e |
"""Test that linkables transitively set cxx_link properly."""
|
|
Packit |
f0b94e |
reader = self.reader('test-linkables-cxx-link')
|
|
Packit |
f0b94e |
got_results = 0
|
|
Packit |
f0b94e |
for obj in self.read_topsrcdir(reader):
|
|
Packit |
f0b94e |
if isinstance(obj, SharedLibrary):
|
|
Packit |
f0b94e |
if obj.basename == 'cxx_shared':
|
|
Packit |
f0b94e |
self.assertTrue(obj.cxx_link)
|
|
Packit |
f0b94e |
got_results += 1
|
|
Packit |
f0b94e |
elif obj.basename == 'just_c_shared':
|
|
Packit |
f0b94e |
self.assertFalse(obj.cxx_link)
|
|
Packit |
f0b94e |
got_results += 1
|
|
Packit |
f0b94e |
self.assertEqual(got_results, 2)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_generated_sources(self):
|
|
Packit |
f0b94e |
"""Test that GENERATED_SOURCES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('generated-sources')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
as_flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(as_flags, ComputedFlags)
|
|
Packit |
f0b94e |
flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
# The third to last object is a Linkable.
|
|
Packit |
f0b94e |
linkable = objs.pop()
|
|
Packit |
f0b94e |
self.assertTrue(linkable.cxx_link)
|
|
Packit |
f0b94e |
flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 6)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
generated_sources = [o for o in objs if isinstance(o, GeneratedSources)]
|
|
Packit |
f0b94e |
self.assertEqual(len(generated_sources), 6)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
suffix_map = {obj.canonical_suffix: obj for obj in generated_sources}
|
|
Packit |
f0b94e |
self.assertEqual(len(suffix_map), 6)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'.cpp': ['a.cpp', 'b.cc', 'c.cxx'],
|
|
Packit |
f0b94e |
'.c': ['d.c'],
|
|
Packit |
f0b94e |
'.m': ['e.m'],
|
|
Packit |
f0b94e |
'.mm': ['f.mm'],
|
|
Packit |
f0b94e |
'.S': ['g.S'],
|
|
Packit |
f0b94e |
'.s': ['h.s', 'i.asm'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
for suffix, files in expected.items():
|
|
Packit |
f0b94e |
sources = suffix_map[suffix]
|
|
Packit |
f0b94e |
self.assertEqual(
|
|
Packit |
f0b94e |
sources.files,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topobjdir, f) for f in files])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertIn(mozpath.join(reader.config.topobjdir,
|
|
Packit |
f0b94e |
'%s.%s' % (mozpath.splitext(f)[0],
|
|
Packit |
f0b94e |
reader.config.substs['OBJ_SUFFIX'])),
|
|
Packit |
f0b94e |
linkable.objs)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_sources(self):
|
|
Packit |
f0b94e |
"""Test that HOST_SOURCES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('host-sources')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# This objdir will generate target flags.
|
|
Packit |
f0b94e |
flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
# The second to last object is a Linkable
|
|
Packit |
f0b94e |
linkable = objs.pop()
|
|
Packit |
f0b94e |
self.assertTrue(linkable.cxx_link)
|
|
Packit |
f0b94e |
# This objdir will also generate host flags.
|
|
Packit |
f0b94e |
host_flags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(host_flags, ComputedFlags)
|
|
Packit |
f0b94e |
# ...and ldflags.
|
|
Packit |
f0b94e |
ldflags = objs.pop()
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 3)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, HostSources)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
suffix_map = {obj.canonical_suffix: obj for obj in objs}
|
|
Packit |
f0b94e |
self.assertEqual(len(suffix_map), 3)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'.cpp': ['a.cpp', 'b.cc', 'c.cxx'],
|
|
Packit |
f0b94e |
'.c': ['d.c'],
|
|
Packit |
f0b94e |
'.mm': ['e.mm', 'f.mm'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
for suffix, files in expected.items():
|
|
Packit |
f0b94e |
sources = suffix_map[suffix]
|
|
Packit |
f0b94e |
self.assertEqual(
|
|
Packit |
f0b94e |
sources.files,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topsrcdir, f) for f in files])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertIn(mozpath.join(reader.config.topobjdir,
|
|
Packit |
f0b94e |
'host_%s.%s' % (mozpath.splitext(f)[0],
|
|
Packit |
f0b94e |
reader.config.substs['OBJ_SUFFIX'])),
|
|
Packit |
f0b94e |
linkable.objs)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_unified_sources(self):
|
|
Packit |
f0b94e |
"""Test that UNIFIED_SOURCES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('unified-sources')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# The last object is a ComputedFlags, the second to last a Linkable,
|
|
Packit |
f0b94e |
# followed by ldflags, ignore them.
|
|
Packit |
f0b94e |
linkable = objs[-2]
|
|
Packit |
f0b94e |
objs = objs[:-3]
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 3)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, UnifiedSources)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
suffix_map = {obj.canonical_suffix: obj for obj in objs}
|
|
Packit |
f0b94e |
self.assertEqual(len(suffix_map), 3)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'.cpp': ['bar.cxx', 'foo.cpp', 'quux.cc'],
|
|
Packit |
f0b94e |
'.mm': ['objc1.mm', 'objc2.mm'],
|
|
Packit |
f0b94e |
'.c': ['c1.c', 'c2.c'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
for suffix, files in expected.items():
|
|
Packit |
f0b94e |
sources = suffix_map[suffix]
|
|
Packit |
f0b94e |
self.assertEqual(
|
|
Packit |
f0b94e |
sources.files,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topsrcdir, f) for f in files])
|
|
Packit |
f0b94e |
self.assertTrue(sources.have_unified_mapping)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for f in dict(sources.unified_source_mapping).keys():
|
|
Packit |
f0b94e |
self.assertIn(mozpath.join(reader.config.topobjdir,
|
|
Packit |
f0b94e |
'%s.%s' % (mozpath.splitext(f)[0],
|
|
Packit |
f0b94e |
reader.config.substs['OBJ_SUFFIX'])),
|
|
Packit |
f0b94e |
linkable.objs)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_unified_sources_non_unified(self):
|
|
Packit |
f0b94e |
"""Test that UNIFIED_SOURCES with FILES_PER_UNIFIED_FILE=1 works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('unified-sources-non-unified')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# The last object is a Linkable, the second to last ComputedFlags,
|
|
Packit |
f0b94e |
# followed by ldflags, ignore them.
|
|
Packit |
f0b94e |
objs = objs[:-3]
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 3)
|
|
Packit |
f0b94e |
for o in objs:
|
|
Packit |
f0b94e |
self.assertIsInstance(o, UnifiedSources)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
suffix_map = {obj.canonical_suffix: obj for obj in objs}
|
|
Packit |
f0b94e |
self.assertEqual(len(suffix_map), 3)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {
|
|
Packit |
f0b94e |
'.cpp': ['bar.cxx', 'foo.cpp', 'quux.cc'],
|
|
Packit |
f0b94e |
'.mm': ['objc1.mm', 'objc2.mm'],
|
|
Packit |
f0b94e |
'.c': ['c1.c', 'c2.c'],
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
for suffix, files in expected.items():
|
|
Packit |
f0b94e |
sources = suffix_map[suffix]
|
|
Packit |
f0b94e |
self.assertEqual(
|
|
Packit |
f0b94e |
sources.files,
|
|
Packit |
f0b94e |
[mozpath.join(reader.config.topsrcdir, f) for f in files])
|
|
Packit |
f0b94e |
self.assertFalse(sources.have_unified_mapping)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_final_target_pp_files(self):
|
|
Packit |
f0b94e |
"""Test that FINAL_TARGET_PP_FILES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('dist-files')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], FinalTargetPreprocessedFiles)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
# Ideally we'd test hierarchies, but that would just be testing
|
|
Packit |
f0b94e |
# the HierarchicalStringList class, which we test separately.
|
|
Packit |
f0b94e |
for path, files in objs[0].files.walk():
|
|
Packit |
f0b94e |
self.assertEqual(path, '')
|
|
Packit |
f0b94e |
self.assertEqual(len(files), 2)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {'install.rdf', 'main.js'}
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertTrue(unicode(f) in expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_missing_final_target_pp_files(self):
|
|
Packit |
f0b94e |
"""Test that FINAL_TARGET_PP_FILES with missing files throws errors."""
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError, 'File listed in '
|
|
Packit |
f0b94e |
'FINAL_TARGET_PP_FILES does not exist'):
|
|
Packit |
f0b94e |
reader = self.reader('dist-files-missing')
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_final_target_pp_files_non_srcdir(self):
|
|
Packit |
f0b94e |
'''Test that non-srcdir paths in FINAL_TARGET_PP_FILES throws errors.'''
|
|
Packit |
f0b94e |
reader = self.reader('final-target-pp-files-non-srcdir')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Only source directory paths allowed in FINAL_TARGET_PP_FILES:'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_files(self):
|
|
Packit |
f0b94e |
"""Test that LOCALIZED_FILES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('localized-files')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], LocalizedFiles)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for path, files in objs[0].files.walk():
|
|
Packit |
f0b94e |
self.assertEqual(path, 'foo')
|
|
Packit |
f0b94e |
self.assertEqual(len(files), 3)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {'en-US/bar.ini', 'en-US/code/*.js', 'en-US/foo.js'}
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertTrue(unicode(f) in expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_files_no_en_us(self):
|
|
Packit |
f0b94e |
"""Test that LOCALIZED_FILES errors if a path does not start with
|
|
Packit |
f0b94e |
`en-US/` or contain `/locales/en-US/`."""
|
|
Packit |
f0b94e |
reader = self.reader('localized-files-no-en-us')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'LOCALIZED_FILES paths must start with `en-US/` or contain `/locales/en-US/`: foo.js'):
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_localized_pp_files(self):
|
|
Packit |
f0b94e |
"""Test that LOCALIZED_PP_FILES works properly."""
|
|
Packit |
f0b94e |
reader = self.reader('localized-pp-files')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], LocalizedPreprocessedFiles)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for path, files in objs[0].files.walk():
|
|
Packit |
f0b94e |
self.assertEqual(path, 'foo')
|
|
Packit |
f0b94e |
self.assertEqual(len(files), 2)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
expected = {'en-US/bar.ini', 'en-US/foo.js'}
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertTrue(unicode(f) in expected)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_no_cargo_toml(self):
|
|
Packit |
f0b94e |
'''Test that defining a RustLibrary without a Cargo.toml fails.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-no-cargo-toml')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'No Cargo.toml file found'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_name_mismatch(self):
|
|
Packit |
f0b94e |
'''Test that defining a RustLibrary that doesn't match Cargo.toml fails.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-name-mismatch')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'library.*does not match Cargo.toml-defined package'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_no_lib_section(self):
|
|
Packit |
f0b94e |
'''Test that a RustLibrary Cargo.toml with no [lib] section fails.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-no-lib-section')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Cargo.toml for.* has no \\[lib\\] section'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_invalid_crate_type(self):
|
|
Packit |
f0b94e |
'''Test that a RustLibrary Cargo.toml has a permitted crate-type.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-invalid-crate-type')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'crate-type.* is not permitted'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_dash_folding(self):
|
|
Packit |
f0b94e |
'''Test that on-disk names of RustLibrary objects convert dashes to underscores.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-dash-folding',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_TARGET='i686-pc-windows-msvc'))
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
ldflags, lib = objs
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(lib, RustLibrary)
|
|
Packit |
f0b94e |
self.assertRegexpMatches(lib.lib_name, "random_crate")
|
|
Packit |
f0b94e |
self.assertRegexpMatches(lib.import_name, "random_crate")
|
|
Packit |
f0b94e |
self.assertRegexpMatches(lib.basename, "random-crate")
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_multiple_rust_libraries(self):
|
|
Packit |
f0b94e |
'''Test that linking multiple Rust libraries throws an error'''
|
|
Packit |
f0b94e |
reader = self.reader('multiple-rust-libraries',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_TARGET='i686-pc-windows-msvc'))
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(LinkageMultipleRustLibrariesError,
|
|
Packit |
f0b94e |
'Cannot link multiple Rust libraries'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_features(self):
|
|
Packit |
f0b94e |
'''Test that RustLibrary features are correctly emitted.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-features',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_TARGET='i686-pc-windows-msvc'))
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
ldflags, lib = objs
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(lib, RustLibrary)
|
|
Packit |
f0b94e |
self.assertEqual(lib.features, ['musthave', 'cantlivewithout'])
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_library_duplicate_features(self):
|
|
Packit |
f0b94e |
'''Test that duplicate RustLibrary features are rejected.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-library-duplicate-features')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'features for .* should not contain duplicates'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_program_no_cargo_toml(self):
|
|
Packit |
f0b94e |
'''Test that specifying RUST_PROGRAMS without a Cargo.toml fails.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-program-no-cargo-toml')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'No Cargo.toml file found'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_rust_program_no_cargo_toml(self):
|
|
Packit |
f0b94e |
'''Test that specifying HOST_RUST_PROGRAMS without a Cargo.toml fails.'''
|
|
Packit |
f0b94e |
reader = self.reader('host-rust-program-no-cargo-toml')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'No Cargo.toml file found'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_program_nonexistent_name(self):
|
|
Packit |
f0b94e |
'''Test that specifying RUST_PROGRAMS that don't exist in Cargo.toml
|
|
Packit |
f0b94e |
correctly throws an error.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-program-nonexistent-name')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Cannot find Cargo.toml definition for'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_rust_program_nonexistent_name(self):
|
|
Packit |
f0b94e |
'''Test that specifying HOST_RUST_PROGRAMS that don't exist in
|
|
Packit |
f0b94e |
Cargo.toml correctly throws an error.'''
|
|
Packit |
f0b94e |
reader = self.reader('host-rust-program-nonexistent-name')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Cannot find Cargo.toml definition for'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_rust_programs(self):
|
|
Packit |
f0b94e |
'''Test RUST_PROGRAMS emission.'''
|
|
Packit |
f0b94e |
reader = self.reader('rust-programs',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_TARGET='i686-pc-windows-msvc',
|
|
Packit |
f0b94e |
BIN_SUFFIX='.exe'))
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
ldflags, prog = objs
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(prog, RustProgram)
|
|
Packit |
f0b94e |
self.assertEqual(prog.name, 'some')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_rust_programs(self):
|
|
Packit |
f0b94e |
'''Test HOST_RUST_PROGRAMS emission.'''
|
|
Packit |
f0b94e |
reader = self.reader('host-rust-programs',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_HOST_TARGET='i686-pc-windows-msvc',
|
|
Packit |
f0b94e |
HOST_BIN_SUFFIX='.exe'))
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], HostRustProgram)
|
|
Packit |
f0b94e |
self.assertEqual(objs[0].name, 'some')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_host_rust_libraries(self):
|
|
Packit |
f0b94e |
'''Test HOST_RUST_LIBRARIES emission.'''
|
|
Packit |
f0b94e |
reader = self.reader('host-rust-libraries',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_HOST_TARGET='i686-pc-windows-msvc',
|
|
Packit |
f0b94e |
HOST_BIN_SUFFIX='.exe'))
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertEqual(len(objs), 1)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], HostRustLibrary)
|
|
Packit |
f0b94e |
self.assertRegexpMatches(objs[0].lib_name, 'host_lib')
|
|
Packit |
f0b94e |
self.assertRegexpMatches(objs[0].import_name, 'host_lib')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_crate_dependency_path_resolution(self):
|
|
Packit |
f0b94e |
'''Test recursive dependencies resolve with the correct paths.'''
|
|
Packit |
f0b94e |
reader = self.reader('crate-dependency-path-resolution',
|
|
Packit |
f0b94e |
extra_substs=dict(RUST_TARGET='i686-pc-windows-msvc'))
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
ldflags, lib = objs
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(lib, RustLibrary)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_install_shared_lib(self):
|
|
Packit |
f0b94e |
"""Test that we can install a shared library with TEST_HARNESS_FILES"""
|
|
Packit |
f0b94e |
reader = self.reader('test-install-shared-lib')
|
|
Packit |
f0b94e |
objs = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[0], TestHarnessFiles)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[1], VariablePassthru)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[2], ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[3], SharedLibrary)
|
|
Packit |
f0b94e |
self.assertIsInstance(objs[4], ComputedFlags)
|
|
Packit |
f0b94e |
for path, files in objs[0].files.walk():
|
|
Packit |
f0b94e |
for f in files:
|
|
Packit |
f0b94e |
self.assertEqual(str(f), '!libfoo.so')
|
|
Packit |
f0b94e |
self.assertEqual(path, 'foo/bar')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_symbols_file(self):
|
|
Packit |
f0b94e |
"""Test that SYMBOLS_FILE works"""
|
|
Packit |
f0b94e |
reader = self.reader('test-symbols-file')
|
|
Packit |
f0b94e |
genfile, ldflags, shlib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(genfile, GeneratedFile)
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(shlib, SharedLibrary)
|
|
Packit |
f0b94e |
# This looks weird but MockConfig sets DLL_{PREFIX,SUFFIX} and
|
|
Packit |
f0b94e |
# the reader method in this class sets OS_TARGET=WINNT.
|
|
Packit |
f0b94e |
self.assertEqual(shlib.symbols_file, 'libfoo.so.def')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_symbols_file_objdir(self):
|
|
Packit |
f0b94e |
"""Test that a SYMBOLS_FILE in the objdir works"""
|
|
Packit |
f0b94e |
reader = self.reader('test-symbols-file-objdir')
|
|
Packit |
f0b94e |
genfile, ldflags, shlib, flags = self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
self.assertIsInstance(genfile, GeneratedFile)
|
|
Packit |
f0b94e |
self.assertEqual(genfile.script,
|
|
Packit |
f0b94e |
mozpath.join(reader.config.topsrcdir, 'foo.py'))
|
|
Packit |
f0b94e |
self.assertIsInstance(flags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(ldflags, ComputedFlags)
|
|
Packit |
f0b94e |
self.assertIsInstance(shlib, SharedLibrary)
|
|
Packit |
f0b94e |
self.assertEqual(shlib.symbols_file, 'foo.symbols')
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
def test_symbols_file_objdir_missing_generated(self):
|
|
Packit |
f0b94e |
"""Test that a SYMBOLS_FILE in the objdir that's missing
|
|
Packit |
f0b94e |
from GENERATED_FILES is an error.
|
|
Packit |
f0b94e |
"""
|
|
Packit |
f0b94e |
reader = self.reader('test-symbols-file-objdir-missing-generated')
|
|
Packit |
f0b94e |
with self.assertRaisesRegexp(SandboxValidationError,
|
|
Packit |
f0b94e |
'Objdir file specified in SYMBOLS_FILE not in GENERATED_FILES:'):
|
|
Packit |
f0b94e |
self.read_topsrcdir(reader)
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if __name__ == '__main__':
|
|
Packit |
f0b94e |
main()
|