# Copyright 2019 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/cpp/sdk_source_set.gni")
import("//build/fidl/fidl.gni")
import("//build/package.gni")
import("//build/test/test_package.gni")

group("unittests") {
  testonly = true

  deps = [ ":test_harness_impl_unittest" ]
}

source_set("test_harness_fixture") {
  testonly = true

  public_configs = [ "//sdk/config" ]

  sources = [
    "fake_graphical_presenter.cc",
    "fake_graphical_presenter.h",
    "fake_module.cc",
    "fake_module.h",
    "fake_session_launcher_component.cc",
    "fake_session_launcher_component.h",
    "fake_session_shell.cc",
    "fake_session_shell.h",
    "fake_settings_intl.cc",
    "fake_settings_intl.h",
    "fake_story_shell.cc",
    "fake_story_shell.h",
    "test_harness_fixture.cc",
    "test_harness_fixture.h",
  ]

  public_deps = [ "//sdk/lib/modular/testing/cpp" ]

  deps = [
    "//garnet/public/lib/svc/cpp",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/fidl/fuchsia.session",
    "//sdk/fidl/fuchsia.settings",
    "//sdk/lib/modular/cpp",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/modular/lib/testing:session_shell_impl",
    "//third_party/googletest:gtest",
  ]
}

executable("test_harness_fixture_test_bin") {
  testonly = true

  sources = [ "test_harness_fixture_test.cc" ]

  deps = [
    ":test_harness_fixture",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:integration",
    "//sdk/lib/sys/cpp/testing:unit",
    "//src/lib/fsl",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gmock",
  ]
}

test_package("test_harness_fixture_test") {
  tests = [
    {
      name = "test_harness_fixture_test_bin"
      environments = basic_envs
    },
  ]

  deps = [ ":test_harness_fixture_test_bin" ]
}

source_set("test_harness_impl") {
  testonly = true

  sources = [
    "test_harness_impl.cc",
    "test_harness_impl.h",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.cobalt",
    "//sdk/fidl/fuchsia.devicesettings",
    "//sdk/fidl/fuchsia.identity.account",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/fidl/fuchsia.settings",
    "//sdk/fidl/fuchsia.stash",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/modular/cpp",
    "//sdk/lib/sys/cpp/testing:enclosing_environment",
    "//src/lib/fsl",
    "//src/modular/lib/lifecycle/cpp",
    "//src/modular/lib/modular_config",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]

  deps = [
    "//src/modular/lib/fidl:json_xdr",
    "//src/modular/lib/modular_config:json_xdr",
    "//src/modular/lib/pseudo_dir:pseudo_dir_utils",
  ]
}

source_set("test_harness_impl_unittest") {
  testonly = true

  sources = [ "test_harness_impl_unittest.cc" ]

  deps = [
    ":test_harness_impl",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/lib/sys/cpp/testing:integration",
    "//sdk/lib/sys/cpp/testing:unit",
    "//src/lib/fxl/test:gtest_main",
    "//src/modular/lib/modular_config",
    "//src/modular/lib/pseudo_dir:pseudo_dir_server",
    "//zircon/public/lib/fidl",
  ]
}
