# 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/config.gni")
import("//build/package.gni")
import("//build/rust/rustc_binary.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")

group("tests") {
  testonly = true
  deps = [
    ":optee_smoke_test",
    ":optee_test",
    ":tee-manager-tests",
  ]
}

package("tee_manager") {
  meta = [
    {
      path = rebase_path("meta/tee_manager.cmx")
      dest = "tee_manager.cmx"
    },
  ]

  deps = [ ":bin" ]

  binaries = [
    {
      name = "tee_manager"
      dest = "tee_manager"
    },
  ]
}

rustc_binary("bin") {
  name = "tee_manager"
  edition = "2018"
  with_unit_tests = true

  deps = [
    "//garnet/lib/rust/io_util",
    "//sdk/fidl/fuchsia.hardware.tee:fuchsia.hardware.tee-rustc",
    "//sdk/fidl/fuchsia.tee:fuchsia.tee-rustc",
    "//sdk/fidl/fuchsia.tee.manager:fuchsia.tee.manager-rustc",
    "//src/lib/fdio/rust:fdio",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/lib/fuchsia-component",
    "//src/lib/storage/fuchsia-vfs-watcher",
    "//src/lib/syslog/rust:syslog",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:futures",
    "//third_party/rust_crates:serde",
    "//third_party/rust_crates:serde_derive",
    "//third_party/rust_crates:serde_json",
    "//third_party/rust_crates:thiserror",
    "//third_party/rust_crates:uuid",
  ]

  test_deps = [
    "//sdk/fidl/fuchsia.io:fuchsia.io-rustc",
    "//src/lib/zircon/rust:fuchsia-zircon-status",
  ]

  sources = [
    "src/config.rs",
    "src/device_server.rs",
    "src/main.rs",
    "src/provider_server.rs",
  ]
}

test_package("tee-manager-tests") {
  deps = [ ":bin_test" ]

  tests = [
    {
      name = "tee_manager_bin_test"
    },
  ]
}

source_set("test_common") {
  testonly = true
  visibility = [ ":*" ]
  sources = [ "test/common.cc" ]
  public_deps = [
    "//sdk/fidl/fuchsia.tee",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/lib/fxl",
    "//src/lib/fxl/test:gtest_main",
    "//src/security/tee/tee-client-api",
  ]
}

test_package("optee_test") {
  deps = [ ":optee_test_bin" ]

  binaries = [
    {
      name = "optee_test"
    },
  ]

  tests = [
    {
      name = "optee_test"
      environments = [ astro_env ]
    },
  ]
}

executable("optee_test_bin") {
  testonly = true
  output_name = "optee_test"

  sources = [ "test/optee_test.cc" ]

  deps = [ ":test_common" ]
}

test_package("optee_smoke_test") {
  deps = [ ":optee_smoke_test_bin" ]

  binaries = [
    {
      name = "optee_smoke_test"
    },
  ]

  tests = [
    {
      name = "optee_smoke_test"
      environments = [ astro_env ]
    },
  ]
}

executable("optee_smoke_test_bin") {
  testonly = true
  output_name = "optee_smoke_test"

  sources = [ "test/optee_smoke_test.cc" ]

  deps = [
    ":test_common",
    "//zircon/public/lib/fit",
  ]

  # TODO(fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}
