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

# Generate a manifest providing all of the .fidl.json files exported by the
# core SDK (and any other FIDL files we might want).
action("generate_fidl_json") {
  script = "generate_fidl_json.sh"
  generated_output = "$target_gen_dir/sdk_fidl_json.manifest"
  outputs = [ "$generated_output" ]
  testonly = true
  deps = [
    "//sdk:core",
    "//sdk:core_fidl_json",
    "//sdk/fidl/fuchsia.boot",
    "//sdk/fidl/fuchsia.device.manager",
    "//sdk/fidl/fuchsia.kernel",
    "//sdk/fidl/fuchsia.power",
    "//third_party/quickjs:qjs($host_toolchain)",
  ]
  args = [
    "--qjs=" + rebase_path("$root_build_dir/host_$host_cpu/qjs"),
    "--fidl-json-file=" +
        rebase_path("$root_gen_dir/sdk/core.fidl_json.txt", root_build_dir),
    "--out-file=" + rebase_path("$generated_output", root_build_dir),
    rebase_path(
        "$root_build_dir/fidling/gen/sdk/fidl/fuchsia.device.manager/fuchsia.device.manager.fidl.json",
        root_build_dir),
    rebase_path(
        "$root_build_dir/fidling/gen/sdk/fidl/fuchsia.power/fuchsia.power.fidl.json",
        root_build_dir),
    rebase_path(
        "$root_build_dir/fidling/gen/sdk/fidl/fuchsia.kernel/fuchsia.kernel.fidl.json",
        root_build_dir),
    rebase_path(
        "$root_build_dir/fidling/gen/sdk/fidl/fuchsia.boot/fuchsia.boot.fidl.json",
        root_build_dir),
  ]
}

test_package("josh-tests") {
  deps = [
    ":generate_fidl_json",
    "//src/developer/shell/josh:bin",
    "//src/developer/shell/josh:josh_tests_bin",
    "//src/developer/shell/josh/lib:js_libs",
    "//src/developer/shell/josh/lib:spawn_child_test_util",
  ]

  binaries = [
    {
      name = "spawn_child_test_util"
    },
    {
      name = "josh"
    },
  ]

  tests = [
    {
      name = "josh_tests_bin"
      environments = basic_envs
    },
  ]
  extra = get_target_outputs(":generate_fidl_json") +
          [ "$target_gen_dir/josh/lib/libs.manifest" ]
}

group("tests") {
  testonly = true

  deps = [
    ":josh-tests",
    "console:shell-console-unittests",
    "interpreter:shell_server",
    "interpreter:tests",
    "mirror:shell-mirror-tests",
    "parser:shell-parser-unittests",
  ]
}

# "josh" is Javascript Object SHell.
package("josh") {
  # TODO(jeremymanson): This is only testonly because sdk:core is.  We should undo that.
  testonly = true
  deps = [
    "//src/developer/shell:generate_fidl_json",
    "//src/developer/shell/josh:bin",
    "//src/developer/shell/josh/lib:js_libs",
  ]
  binaries = [
    {
      name = "josh"
      shell = true
    },
  ]
  extra = get_target_outputs(":generate_fidl_json") +
          [ "$target_gen_dir/josh/lib/libs.manifest" ]
}

# "cliff" is the CLI For Fuchsia.  Need a better name.
package("cliff") {
  # TODO(jeremymanson): This is only testonly because sdk:core is.  We should undo that.
  testonly = true
  deps = [
    "//src/developer/shell:generate_fidl_json",
    "//src/developer/shell/console:bin",
  ]
  binaries = [
    {
      name = "cliff"
      shell = true
    },
  ]
  extra = get_target_outputs(":generate_fidl_json")
}
