# 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")

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/public/lib/gtest",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/lib/fxl/test:gtest_main",
    "//src/sys/appmgr:lib",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/fs",
  ]
}

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

  sources = [ "get_message_client.cc" ]

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

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

  binaries = [
    {
      name = "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"
    },
  ]
}
