# Copyright 2020 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/components.gni")
import("//build/dist/component_manifest_resources.gni")
import("//build/test.gni")
import("//build/testing/bootfs_test.gni")

group("tests") {
  testonly = true
  deps = [ ":console-launcher-unittests" ]
}

source_set("lib") {
  sources = [
    "console_launcher.cc",
    "console_launcher.h",
  ]

  deps = [
    "//sdk/fidl/fuchsia.kernel:fuchsia.kernel_cpp",
    "//sdk/lib/component/incoming/cpp",
    "//sdk/lib/fdio",
    "//sdk/lib/syslog/cpp",
    "//src/storage/lib/vfs/cpp",
    "//zircon/system/ulib/zircon-internal",
  ]

  public_deps = [
    # console_launcher.h has #include <fidl/fuchsia.boot/cpp/wire.h>
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_cpp",

    # console_launcher.h has #include <fidl/fuchsia.hardware.pty/cpp/wire.h>
    "//sdk/fidl/fuchsia.hardware.pty:fuchsia.hardware.pty_cpp",

    # console_launcher.h has #include <fidl/fuchsia.io/cpp/wire.h>
    "//sdk/fidl/fuchsia.io:fuchsia.io_cpp",

    # console_launcher.h has #include <fidl/fuchsia.ldsvc/cpp/wire.h>
    "//sdk/fidl/fuchsia.ldsvc:fuchsia.ldsvc_cpp",

    # console_launcher.h has #include <fbl/unique_fd.h>
    "//zircon/system/ulib/fbl",
  ]
}

executable("bin") {
  output_name = "console-launcher"

  sources = [ "main.cc" ]

  deps = [
    ":lib",
    "//sdk/fidl/fuchsia.device:fuchsia.device_cpp",
    "//sdk/fidl/fuchsia.virtualconsole:fuchsia.virtualconsole_cpp",
    "//sdk/lib/component/incoming/cpp",
    "//sdk/lib/device-watcher/cpp",
    "//sdk/lib/fdio",
    "//sdk/lib/syslog/cpp",
    "//src/lib/fxl",
    "//src/lib/loader_service",
    "//src/storage/lib/vfs/cpp",
    "//src/sys/lib/stdout-to-debuglog/cpp",
    "//zircon/system/ulib/async:async-cpp",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/zx",
  ]

  # TODO(https://fxbug.dev/42085293): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-vla-cxx-extension" ]
}

fuchsia_component("component") {
  component_name = "console-launcher"
  manifest = "meta/console-launcher.cml"
  deps = [ ":bin" ]
}

fuchsia_package("package") {
  package_name = "console-launcher"
  deps = [ ":component" ]
}

executable("unittests") {
  output_name = "console-launcher_test"
  testonly = true

  sources = [ "console_launcher_unittest.cc" ]

  deps = [
    ":lib",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/mock-boot-arguments",
    "//zircon/system/ulib/zxtest",
  ]
}

# Run with `fx test console-launcher-unittests`.
fuchsia_unittest_package("console-launcher-unittests") {
  deps = [ ":unittests" ]
}

test("shell-permissions-test") {
  sources = [ "shell-permissions-test.cc" ]

  deps = [
    "//zircon/system/ulib/zx",
    "//zircon/system/ulib/zxtest",
  ]
}

bootfs_test("shell-permissions-bootfs-test") {
  name = "shell-permissions-test"
  deps = [ ":shell-permissions-test" ]
}
