# Copyright 2020 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.

import("//build/components.gni")

group("tests") {
  testonly = true
  deps = [ ":loader-service-test" ]
}

source_set("loader_service") {
  sources = [ "loader_service.cc" ]

  public_deps = [
    "//sdk/fidl/fuchsia.ldsvc:fuchsia.ldsvc_cpp",
    "//zircon/system/ulib/async",
    "//zircon/system/ulib/zx",
  ]

  deps = [
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
    "//sdk/lib/fdio",
    "//sdk/lib/fidl",
    "//sdk/lib/syslog/cpp",
    "//src/lib/files",
  ]
}

# Subclasses of LoaderServiceBase can reuse the test fixture used here.
source_set("loader_service_test_fixture") {
  testonly = true
  sources = [ "loader_service_test_fixture.cc" ]

  public_deps = [
    ":loader_service",
    "//sdk/lib/component/incoming/cpp",
    "//src/lib/fxl/test:gtest_main",
    "//src/lib/testing/loop_fixture",
    "//src/storage/memfs:lib",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fbl",
  ]
  deps = [
    "//sdk/fidl/fuchsia.kernel:fuchsia.kernel_cpp",
    "//src/lib/testing/predicates",
  ]
}

executable("loader_service_test") {
  testonly = true
  sources = [ "loader_service_test.cc" ]

  deps = [
    ":loader_service_test_fixture",
    "//zircon/system/ulib/ldmsg",
  ]
}

fuchsia_unittest_package("loader-service-test") {
  manifest = "meta/loader-service-test.cml"
  deps = [ ":loader_service_test" ]
  test_type = "system"
}
