# 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/test/test_package.gni")

executable("modular_test_harness_bin") {
  testonly = true

  sources = [
    "modular_test_harness.cc",
  ]

  deps = [
    "//garnet/public/lib/fxl",
    "//peridot/public/lib/modular_test_harness/cpp:test_harness_impl",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/lib/sys/cpp",
    "//zircon/public/lib/async-loop-cpp",
  ]
}

executable("test_base_shell_bin") {
  testonly = true

  sources = [
    "test_base_shell.cc",
  ]

  deps = [
    "//garnet/public/lib/callback",
    "//garnet/public/lib/fxl",
    "//peridot/lib/fidl:single_service_app",
    "//peridot/public/lib/app_driver/cpp",
    "//peridot/public/lib/integration_testing/cpp",
    "//sdk/fidl/fuchsia.auth",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.ui.views",
    "//zircon/public/lib/async-loop-cpp",
  ]
}

executable("test_session_shell_bin") {
  testonly = true

  sources = [
    "test_session_shell.cc",
  ]

  deps = [
    "//garnet/public/lib/fxl",
    "//peridot/lib/fidl:single_service_app",
    "//peridot/lib/fidl:view_host",
    "//peridot/public/lib/app_driver/cpp",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.ui.scenic",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/fidl/cpp",
    "//zircon/public/lib/async-loop-cpp",
  ]
}

executable("test_story_shell_bin") {
  testonly = true

  sources = [
    "test_story_shell.cc",
  ]

  deps = [
    "//garnet/public/lib/fsl",
    "//garnet/public/lib/fxl",
    "//peridot/lib/fidl:single_service_app",
    "//peridot/lib/fidl:view_host",
    "//peridot/public/lib/app_driver/cpp",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.ui.views",
    "//zircon/public/lib/async-loop-cpp",
  ]
}

executable("modular_test_harness_test") {
  testonly = true
  output_name = "modular_test_harness_test"
  sources = [
    "modular_test_harness_test.cc",
  ]
  deps = [
    "//peridot/public/lib/modular_test_harness/cpp:test_harness_fixture",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/lib/fxl/test:gtest_main",
  ]
}

test_package("modular_test_harness") {
  binaries = [
    {
      name = "test_story_shell_bin"
    },
    {
      name = "test_base_shell_bin"
    },
    {
      name = "test_session_shell_bin"
    },
    {
      name = "modular_test_harness_bin"
    },
  ]

  tests = [
    {
      name = "modular_test_harness_test"
      environments = basic_envs
    },
  ]

  meta = [
    {
      path = "meta/modular_test_harness.cmx"
      dest = "modular_test_harness.cmx"
    },
    {
      path = "meta/test_base_shell.cmx"
      dest = "test_base_shell.cmx"
    },
    {
      path = "meta/test_session_shell.cmx"
      dest = "test_session_shell.cmx"
    },
    {
      path = "meta/test_story_shell.cmx"
      dest = "test_story_shell.cmx"
    },
  ]

  deps = [
    ":modular_test_harness_bin",
    ":modular_test_harness_test",
    ":test_base_shell_bin",
    ":test_session_shell_bin",
    ":test_story_shell_bin",
  ]
}
