# 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/dart/dart.gni")
import("//build/python/python_binary.gni")
import("//build/sdk/sdk_atom.gni")

kernel_snapshot = "//prebuilt/third_party/dart/$host_os-$host_cpu/bin/snapshots/gen_kernel.dart.snapshot"

# TODO(alainv): Move that to dart_tool.gni to make it more generic.
sdk_atom("kernel_compiler_sdk") {
  id = "sdk://tools/dart_kernel_compiler"
  category = "partner"

  meta = {
    schema = "host_tool"
    dest = "tools/dart_kernel_compiler-meta.json"
    value = {
      type = "host_tool"
      name = "dart_kernel_compiler"
      root = "tools"
      files = [
        "tools/dart",
        "tools/dart_prebuilts/dart_runner/platform_strong.dill",
        "tools/dart_prebuilts/flutter_runner/platform_strong.dill",
        "tools/dart_prebuilts/kernel_compiler.snapshot",
        "tools/dart_prebuilts/frontend_server_tool.snapshot",
      ]
    }
  }

  kernel_compiler_path = kernel_snapshot

  files = [
    {
      source = "$kernel_compiler_path"
      dest = "tools/dart_prebuilts/kernel_compiler.snapshot"
    },
    {
      source = prebuilt_dart
      dest = "tools/dart"
    },
    {
      source = "$root_out_dir/dart_runner_patched_sdk/platform_strong.dill"
      dest = "tools/dart_prebuilts/dart_runner/platform_strong.dill"
    },
    {
      source = "$root_out_dir/flutter_runner_patched_sdk/platform_strong.dill"
      dest = "tools/dart_prebuilts/flutter_runner/platform_strong.dill"
    },
    {
      source = rebase_path(
              "//prebuilt/third_party/flutter/${host_cpu}/debug/jit/dart_binaries/flutter_frontend_server.snapshot")
      dest = "tools/dart_prebuilts/frontend_server_tool.snapshot"
    },
  ]

  non_sdk_deps = [
    "//build/dart:platform_files",
    "//build/flutter:platform_files",
  ]
}

sdk_atom("gen_snapshot_sdk") {
  id = "sdk://tools/gen_snapshot"
  category = "partner"

  files_content = [
    "tools/gen_snapshot.${current_cpu}",
    "tools/gen_snapshot_product.${current_cpu}",
  ]

  meta = {
    schema = "host_tool"
    dest = "tools/gen_snapshot-meta.json"
    value = {
      type = "host_tool"
      name = "gen_snapshot"
      root = "tools"
      target_files = {
      }
      if (target_cpu == "arm64") {
        target_files.arm64 = files_content
      } else if (target_cpu == "x64") {
        target_files.x64 = files_content
      } else {
        assert(false, "Unknown CPU type: $target_cpu")
      }
    }
  }

  files = [
    {
      source = prebuilt_gen_snapshot
      dest = "tools/gen_snapshot.${current_cpu}"
    },
    {
      source = prebuilt_gen_snapshot_product
      dest = "tools/gen_snapshot_product.${current_cpu}"
    },
  ]
}

group("tests") {
  testonly = true

  # TODO(fxb/41505): Temporarily disable flutter_tester tests on mac hosts.
  _flutter_tester_tests = []
  if (host_os != "mac") {
    _flutter_tester_tests += [
      "//sdk/dart/fuchsia_internationalization_flutter:tests($host_toolchain)",
      "//sdk/dart/fuchsia_scenic_flutter:fuchsia_scenic_flutter_unittests($host_toolchain)",
    ]
  }

  public_deps = [
                  # TODO: This target should just aggregate the top-level directories and
                  # most of these dependencies should be in those subdirectories.
                  "//bundles/packages:base_packages",
                  "//bundles/packages/tests:scenic",
                  "//src/modular/bundles:framework",
                  "//src/modular/bundles:tools",
                  "//src/modular/bundles:integration_testing",
                  "//src/fonts",
                  "//src/ui/tools:scenic",

                  "//sdk/dart/fuchsia_component_test:tests",
                  "//sdk/dart/fuchsia_inspect:tests",
                  "//sdk/dart/fuchsia_modular:fuchsia_modular_package_unittests",
                  "//sdk/dart/fuchsia_services:fuchsia_services_package_unittests",

                  # TODO(fxb/38305): Re-enable test when unblocked and inspect paths are corrected
                  # "//sdk/dart/fuchsia_inspect/test/inspect_flutter_integration_tester:inspect-dart-integration-test-driver",
                  "//sdk/dart/fuchsia_inspect/test/inspect_flutter_integration_tester",
                  "//sdk/dart/fuchsia_inspect/test/integration:dart_inspect_vmo_test",
                  "//sdk/dart/fuchsia_inspect/test/integration:dart_inspect_vmo_test_writer",
                  "//sdk/dart/fuchsia_inspect/test/validator_puppet:tests",
                  "//sdk/dart/fuchsia_logger:fuchsia_logger_package_unittests($host_toolchain)",
                  "//sdk/dart/fuchsia_logger/test/integration:fuchsia-logger-integration-tests",
                  "//sdk/dart/fuchsia_modular:fuchsia-modular-integration-tests",
                  "//sdk/dart/fuchsia_modular_testing:fuchsia-modular-testing-integration-tests",
                  "//sdk/dart/fuchsia_services:fuchsia-services-integration-tests",
                  "//sdk/dart/fuchsia_services/test_support:fuchsia-services-foo-test-server",
                  "//sdk/dart/fuchsia_vfs:tests",
                  "//sdk/dart/zircon:tests",
                ] + _flutter_tester_tests
}

_gen_reference_docs_script_target = "gen_reference_docs_script"
python_binary(_gen_reference_docs_script_target) {
  main_source = "//build/dart/gen_reference_docs.py"
  output_name = "gen_reference_docs.pyz"
  deps = [ "//third_party/pyyaml:yaml" ]
}

action("dart_sdk_docs") {
  script_output = get_target_outputs(":${_gen_reference_docs_script_target}")
  script = script_output[0]

  docs_out_dir = "$target_out_dir/docs"

  # We don't know all the generated files ahead of time, but some files are
  # consistent between runs, so list only those.
  outputs = [
    "$docs_out_dir/__404error.md",
    "$docs_out_dir/categories.json",
    "$docs_out_dir/index.json",
    "$docs_out_dir/index.md",
  ]

  args = [
    "--gen-dir",
    rebase_path("$target_gen_dir/docs"),
    "--out-dir",
    rebase_path("$docs_out_dir"),
    "--prebuilts-dir",
    rebase_path("$dart_sdk/bin"),

    # packages
    rebase_path("//sdk/dart/fidl"),
    rebase_path("//sdk/dart/fuchsia"),
    rebase_path("//sdk/dart/fuchsia_component_test"),
    rebase_path("//sdk/dart/fuchsia_inspect"),
    rebase_path("//sdk/dart/fuchsia_internationalization_flutter"),
    rebase_path("//sdk/dart/fuchsia_logger"),
    rebase_path("//sdk/dart/fuchsia_modular"),
    rebase_path("//sdk/dart/fuchsia_modular_testing"),
    rebase_path("//sdk/dart/fuchsia_scenic"),
    rebase_path("//sdk/dart/fuchsia_scenic_flutter"),
    rebase_path("//sdk/dart/fuchsia_services"),
    rebase_path("//sdk/dart/fuchsia_vfs"),
    rebase_path("//sdk/dart/zircon"),
  ]

  deps = [ ":${_gen_reference_docs_script_target}" ]
}
