# -*- Python -*-

import os

def get_required_attr(config, attr_name):
  attr_value = getattr(config, attr_name, None)
  if not attr_value:
    lit.fatal("No attribute %r in test configuration! You may need to run "
              "tests from your build directory or add this attribute "
              "to lit.site.cfg " % attr_name)
  return attr_value

# Setup attributes common for all compiler-rt projects.
compiler_rt_src_root = get_required_attr(config, 'compiler_rt_src_root')
compiler_rt_lit_unit_cfg = os.path.join(compiler_rt_src_root, "lib",
                                        "lit.common.unit.cfg")
lit.load_config(config, compiler_rt_lit_unit_cfg)

# Setup config name.
config.name = 'SanitizerCommon-Unit'

# Setup test source and exec root. For unit tests, we define
# it as build directory with sanitizer_common unit tests.
llvm_obj_root = get_required_attr(config, "llvm_obj_root")
config.test_exec_root = os.path.join(llvm_obj_root, "projects",
                                     "compiler-rt", "lib",
                                     "sanitizer_common", "tests")
config.test_source_root = config.test_exec_root
