# -*- Python -*- vim: set ft=python ts=4 sw=4 expandtab tw=79:

# Configuration file for the 'lit' test runner.


import os
import site

site.addsitedir(os.path.dirname(__file__))


# Tell pylint that we know config and lit_config exist somewhere.
if 'PYLINT_IMPORT' in os.environ:
    config = object()
    lit_config = object()

# name: The name of this test suite.
config.name = 'libc++abi'

# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.cpp']

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)

# Infer the libcxx_test_source_root for configuration import.
# If libcxx_source_root isn't specified in the config, assume that the libcxx
# and libcxxabi source directories are sibling directories.
libcxx_src_root = getattr(config, 'libcxx_src_root', None)
if not libcxx_src_root:
    libcxx_src_root = os.path.join(config.test_source_root, '../../libcxx')
libcxx_test_src_root = os.path.join(libcxx_src_root, 'test')
if os.path.isfile(os.path.join(libcxx_test_src_root, 'libcxx', '__init__.py')):
    site.addsitedir(libcxx_test_src_root)
else:
    lit_config.fatal('Could not find libcxx test directory for test imports'
                     ' in: %s' % libcxx_test_src_root)

# Infer the test_exec_root from the libcxx_object root.
obj_root = getattr(config, 'libcxxabi_obj_root', None)

# Check that the test exec root is known.
if obj_root is None:
    import libcxx.test.config
    libcxx.test.config.loadSiteConfig(
        lit_config, config, 'libcxxabi_site_config', 'LIBCXXABI_SITE_CONFIG')
    obj_root = getattr(config, 'libcxxabi_obj_root', None)
    if obj_root is None:
        import tempfile
        obj_root = tempfile.mkdtemp(prefix='libcxxabi-testsuite-')
        lit_config.warning('Creating temporary directory for object root: %s' %
                           obj_root)

config.test_exec_root = os.path.join(obj_root, 'test')

cfg_variant = getattr(config, 'configuration_variant', 'libcxxabi')
if cfg_variant:
    print 'Using configuration variant: %s' % cfg_variant

# Load the Configuration class from the module name <cfg_variant>.test.config.
config_module_name = '.'.join([cfg_variant, 'test', 'config'])
config_module = __import__(config_module_name, fromlist=['Configuration'])

configuration = config_module.Configuration(lit_config, config)
configuration.configure()
configuration.print_config_info()
config.test_format = configuration.get_test_format()
