# -*- 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 = 'ThreadSanitizer-Unit'

# Setup test source and exec root. For unit tests, we define
# it as build directory with TSan 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",
                                     "tsan", "tests")
config.test_source_root = config.test_exec_root

# Get path to external LLVM symbolizer to run ThreadSanitizer unit tests.
llvm_tools_dir = getattr(config, 'llvm_tools_dir', None)
if llvm_tools_dir:
  llvm_symbolizer_path = os.path.join(llvm_tools_dir, "llvm-symbolizer")
  config.environment['TSAN_OPTIONS'] = ("external_symbolizer_path=" +
                                        llvm_symbolizer_path)

