# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

static_library("client") {
  friend = [
    ":tests",
    ":test_support",
  ]

  public = [
    "arch_info.h",
    "backtrace_cache.h",
    "breakpoint.h",
    "breakpoint_location.h",
    "breakpoint_observer.h",
    "breakpoint_settings.h",
    "client_object.h",
    "disassembler.h",
    "finish_physical_frame_thread_controller.h",
    "finish_thread_controller.h",
    "frame.h",
    "frame_fingerprint.h",
    "job.h",
    "job_context.h",
    "memory_dump.h",
    "process.h",
    "process_observer.h",
    "process_symbol_data_provider.h",
    "register.h",
    "remote_api.h",
    "session.h",
    "session_observer.h",
    "setting_schema.h",
    "setting_schema_definition.h",
    "setting_store.h",
    "setting_store_observer.h",
    "setting_value.h",
    "stack.h",
    "step_mode.h",
    "step_over_thread_controller.h",
    "step_thread_controller.h",
    "system.h",
    "system_observer.h",
    "target.h",
    "target_observer.h",
    "thread.h",
    "thread_controller.h",
    "thread_observer.h",
    "until_thread_controller.h",
  ]

  sources = [
    "arch_info.cc",
    "backtrace_cache.cc",
    "breakpoint.cc",
    "breakpoint_action.cc",
    "breakpoint_impl.cc",
    "breakpoint_impl.h",
    "breakpoint_location.cc",
    "breakpoint_location_impl.cc",
    "breakpoint_location_impl.h",
    "client_object.cc",
    "cloud_storage_symbol_server.cc",
    "curl.cc",
    "disassembler.cc",
    "finish_physical_frame_thread_controller.cc",
    "finish_thread_controller.cc",
    "frame.cc",
    "frame_fingerprint.cc",
    "frame_impl.cc",
    "frame_impl.h",
    "frame_symbol_data_provider.cc",
    "frame_symbol_data_provider.h",
    "job.cc",
    "job_context.cc",
    "job_context_impl.cc",
    "job_context_impl.h",
    "job_impl.cc",
    "job_impl.h",
    "memory_dump.cc",
    "minidump_remote_api.cc",
    "minidump_remote_api.h",
    "process.cc",
    "process_impl.cc",
    "process_impl.h",
    "process_symbol_data_provider.cc",
    "register.cc",
    "register.h",
    "remote_api.cc",
    "remote_api_impl.cc",
    "remote_api_impl.h",
    "session.cc",
    "session.h",
    "session_observer.cc",
    "setting_schema.cc",
    "setting_schema_definition.cc",
    "setting_store.cc",
    "setting_value.cc",
    "socket_connect.cc",
    "socket_connect.h",
    "stack.cc",
    "step_over_thread_controller.cc",
    "step_thread_controller.cc",
    "symbol_server.cc",
    "system.cc",
    "system_impl.cc",
    "system_impl.h",
    "target.cc",
    "target_impl.cc",
    "target_impl.h",
    "target_observer.cc",
    "thread.cc",
    "thread_controller.cc",
    "thread_impl.cc",
    "thread_impl.h",
    "until_thread_controller.cc",
  ]

  public_deps = [
    "//garnet/third_party/libunwindstack",
    "//garnet/third_party/llvm:LLVMAArch64Desc",
    "//garnet/third_party/llvm:LLVMAArch64Disassembler",
    "//garnet/third_party/llvm:LLVMX86Desc",
    "//garnet/third_party/llvm:LLVMX86Disassembler",
    "//src/developer/debug/ipc:client",
    "//src/developer/debug/shared",
    "//src/developer/debug/zxdb/common",
    "//src/developer/debug/zxdb/expr",
    "//src/developer/debug/zxdb/symbols",
    "//src/lib/containers/cpp",
    "//src/lib/fxl",
    "//third_party/curl:libcurl",
  ]

  deps = [
    "//garnet/third_party/llvm:LLVMMC",
    "//garnet/third_party/llvm:LLVMObject",
    "//src/lib/elflib",
    "//third_party/crashpad/client",
    "//third_party/crashpad/compat",
    "//third_party/crashpad/snapshot",
    "//third_party/crashpad/third_party/mini_chromium:base",
    "//third_party/crashpad/util",
    "//third_party/rapidjson",
  ]
}

source_set("test_support") {
  testonly = true
  sources = [
    "mock_frame.cc",
    "mock_frame.h",
    "mock_process.cc",
    "mock_process.h",
    "mock_remote_api.cc",
    "mock_remote_api.h",
    "mock_target.cc",
    "mock_target.h",
    "remote_api_test.cc",
    "remote_api_test.h",
    "thread_impl_test_support.cc",
    "thread_impl_test_support.h",
  ]

  public_deps = [
    ":client",
    "//src/developer/debug/zxdb/common:test_support",
    "//src/developer/debug/zxdb/symbols:test_support",
    "//third_party/googletest:gtest",
  ]
}

copy("copy_test_data") {
  sources = [
    "test_example_minidump.dmp",
    "test_example_minidump_new_cvrecord.dmp",
    "test_example_minidump_with_aspace.dmp",
  ]

  outputs = [
    "$root_out_dir/test_data/zxdb/{{source_file_part}}",
  ]
}

copy("copy_fake_home") {
  sources = [
    "test_dummy_file",
  ]

  if (is_mac) {
    outputs = [
      "$root_out_dir/test_data/zxdb/fake_home/Library/Caches/com.googlesource.fuchsia.zxdb/googleapi_auth",
    ]
  } else {
    outputs = [
      "$root_out_dir/test_data/zxdb/fake_home/.cache/zxdb/googleapi_auth",
    ]
  }
}

source_set("tests") {
  testonly = true
  sources = [
    "backtrace_cache_unittest.cc",
    "breakpoint_impl_unittest.cc",
    "disassembler_unittest.cc",
    "finish_physical_frame_thread_controller_unittest.cc",
    "finish_thread_controller_unittest.cc",
    "frame_fingerprint_unittest.cc",
    "frame_impl_unittest.cc",
    "inline_thread_controller_test.cc",
    "inline_thread_controller_test.h",
    "memory_dump_unittest.cc",
    "minidump_unittest.cc",
    "process_impl_unittest.cc",
    "register_unittest.cc",
    "session_unittest.cc",
    "setting_schema_unittest.cc",
    "setting_store_unittest.cc",
    "setting_value_unittest.cc",
    "stack_unittest.cc",
    "step_over_thread_controller_unittest.cc",
    "step_thread_controller_unittest.cc",
    "string_util_unittest.cc",
    "symbol_server_unittest.cc",
    "target_impl_unittest.cc",
    "thread_controller_test.cc",
    "thread_controller_test.h",
    "thread_controller_unittest.cc",
    "thread_impl_unittest.cc",
  ]

  data_deps = [
    ":copy_fake_home",
    ":copy_test_data",
  ]

  metadata = {
    test_runtime_deps = get_target_outputs(":copy_test_data") +
                        get_target_outputs(":copy_fake_home")
  }

  deps = [
    ":client",
    ":test_support",
    "//src/developer/debug/zxdb/common:test_support",
    "//src/developer/debug/zxdb/symbols:test_support",
    "//src/developer/debug/zxdb/symbols:tests",
    "//third_party/googletest:gtest",
  ]
}
