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

import("//build/package.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")

group("integration_tests") {
  testonly = true
  deps = [
    ":chrealm_integrationtests",
    ":chrealm_test_get_message",
    ":get_message_client_bin",
    ":tests",
    "fidl",
  ]
}

executable("tests") {
  testonly = true

  output_name = "chrealm_integration_test"

  sources = [
    "chrealm_integration_test.cc",
  ]

  deps = [
    "fidl/fuchsia.testing.chrealm",
    "//garnet/bin/appmgr:lib",
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/lib/fxl/test:gtest_main",
    "//zircon/public/lib/fs",
    "//zircon/public/lib/zx",
  ]
}

executable("get_message_client_bin") {
  output_name = "get_message_client"

  sources = [
    "get_message_client.cc",
  ]

  deps = [
    "fidl/fuchsia.testing.chrealm",
    "//garnet/public/lib/fsl",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp/",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/zx",
  ]
}

package("chrealm_test_get_message") {
  deps = [
    ":get_message_client_bin",
  ]

  binary = "get_message_client"

  meta = [
    {
      path = rebase_path("chrealm_test_get_message.cmx")
      dest = "chrealm_test_get_message.cmx"
    },
  ]
}

test_package("chrealm_integrationtests") {
  deps = [
    ":tests",
  ]
  tests = [
    {
      name = "chrealm_integration_test"
      environments = basic_envs
    },
  ]
}
