Blame python/mozbuild/mozbuild/test/frontend/test_emitter.py

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