# 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/components.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/dist/component_manifest_resources.gni")
import("//build/test.gni")

group("bootfs") {
  deps = [
    ":meta",
    ":virtual-console",
  ]
}

component_manifest_resources("meta") {
  sources = [ "meta/virtual-console.cml" ]
}

# This can't be a source_set() because the test compiles with a #define.
common_sources = [
  "args.cc",
  "keyboard-vt100.cc",
  "keyboard.cc",
  "textcon.cc",
  "vc-device.cc",
  "vc-gfx.cc",
  "vc-input.cc",
]

group("common") {
  visibility = [ ":*" ]

  public_deps = [
    "//sdk/banjo/fuchsia.hardware.display.controller",
    "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp",
    "//sdk/fidl/fuchsia.hardware.display:fuchsia.hardware.display_llcpp",
    "//sdk/fidl/fuchsia.hardware.input:fuchsia.hardware.input_c",
    "//sdk/fidl/fuchsia.hardware.power.statecontrol:fuchsia.hardware.power.statecontrol_llcpp",
    "//sdk/fidl/fuchsia.hardware.pty:fuchsia.hardware.pty_llcpp",
    "//sdk/fidl/fuchsia.input.report:fuchsia.input.report_llcpp",
    "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp",
    "//sdk/fidl/fuchsia.sysmem:fuchsia.sysmem_llcpp",
    "//sdk/fidl/fuchsia.virtualconsole:fuchsia.virtualconsole_llcpp",
    "//sdk/lib/fdio",
    "//sdk/lib/stdcompat",
    "//sdk/lib/svc",
    "//src/lib/fsl",
    "//src/lib/listnode",
    "//src/lib/storage/vfs/cpp",
    "//src/storage/deprecated-fs-fidl-handler",
    "//src/ui/input/lib/hid-input-report",
    "//src/ui/lib/key_util",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fidl",
    "//zircon/public/lib/gfx",
    "//zircon/public/lib/gfx-font-data",
    "//zircon/public/lib/zircon-internal",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/fdio-caller",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/hid",
    "//zircon/system/ulib/hid-parser",
    "//zircon/system/ulib/image-format",
    "//zircon/system/ulib/image-format:image-format-llcpp",
    "//zircon/system/ulib/service:service-llcpp",
    "//zircon/system/ulib/statusor",
    "//zircon/system/ulib/svc",
  ]
}

executable("virtual-console") {
  sources = common_sources + [
              "main.cc",
              "vc-display.cc",
              "vc-log.cc",
              "session-manager.cc",
            ]
  deps = [
    ":common",
    "//sdk/lib/syslog/cpp",
    "//src/sys/lib/stdout-to-debuglog/cpp",
    "//zircon/public/lib/zxc",
    "//zircon/system/ulib/service:service-llcpp",
  ]
}

test("vc-display-test") {
  defines = [ "BUILD_FOR_DISPLAY_TEST" ]
  sources = [
    "vc-display-test.cc",
    "vc-display.cc",
  ]
  deps = [
    ":common",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
  ]
}

fuchsia_unittest_component("virtual-console-display-test") {
  deps = [ ":vc-display-test" ]
  manifest = "meta/virtual-console-display-test.cmx"
}

test("vc-text-test") {
  defines = [ "BUILD_FOR_TEST" ]

  sources = common_sources + [
              "keyboard-test.cc",
              "textcon-test.cc",
            ]

  deps = [
    ":common",
    "//zircon/public/lib/zxtest",
  ]
}

fuchsia_unittest_component("virtual-console-text-test") {
  deps = [ ":vc-text-test" ]
}

test("vc-session-manager-test") {
  sources = [
    "keyboard-vt100.cc",
    "session-manager-test.cc",
    "session-manager.cc",
    "textcon.cc",
    "vc-device.cc",
    "vc-input.cc",
    "vc-log.cc",
  ]

  deps = [
    ":common",
    "//zircon/public/lib/zxc",
    "//zircon/public/lib/zxtest",
  ]
}

fuchsia_unittest_component("virtual-console-session-manager-test") {
  deps = [ ":vc-session-manager-test" ]
  manifest = "meta/virtual-console-session-manager-test.cmx"
}

test("vc-integration-test") {
  sources = [ "vc-integration-test.cc" ]

  deps = [
    "//sdk/fidl/fuchsia.virtualconsole:fuchsia.virtualconsole_c",
    "//sdk/lib/fdio",
    "//zircon/public/lib/zx",
    "//zircon/public/lib/zxtest",
  ]
}

fuchsia_unittest_component("virtual-console-integration-test") {
  deps = [ ":vc-integration-test" ]
}

test("vc-args-test") {
  sources = [
    "args-test.cc",
    "args.cc",
  ]

  deps = [
    ":common",
    "//sdk/fidl/fuchsia.hardware.pty:fuchsia.hardware.pty_llcpp",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-default",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    "//zircon/system/ulib/mock-boot-arguments",
  ]
}

fuchsia_unittest_component("virtual-console-args-test") {
  deps = [ ":vc-args-test" ]
}

fuchsia_test_package("virtcon-tests") {
  test_components = [
    ":virtual-console-args-test",
    ":virtual-console-session-manager-test",
    ":virtual-console-display-test",
    ":virtual-console-integration-test",
    ":virtual-console-text-test",
  ]
}

group("tests") {
  testonly = true
  deps = [ ":virtcon-tests" ]
}
