# Copyright 2016 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_library.gni")
import("//build/dart/toolchain.gni")
import("//build/testing/test_spec.gni")
import("//topaz/runtime/dart/dart_kernel.gni")

# Defines a Dart test suite
#
# Parameters
#
#   sources (required)
#     The list of test files, which must be within source_dir.
#
#   source_dir (optional)
#     Directory containing the test sources. Defaults to "test".
#     Note: this cannot be set to ".".
#
#   deps (optional)
#     List of labels for Dart libraries this suite depends on.
#
#   disable_analysis (optional)
#     Prevents analysis from being run on this target.
#
# Example of usage:
#
#   dart_test("baz_test") {
#     deps = [
#       "//foo/baz",
#       "//third_party/dart-pkg/pub/test",
#     ]
#   }
if (current_toolchain == dart_toolchain) {
  template("dart_test") {
    assert(defined(invoker.sources),
           "dart_test() requires 'sources' be defined")
    if (defined(invoker.source_dir)) {
      assert(invoker.source_dir != ".",
             "Cannot set source_dir to '.' because it breaks code coverage.")
    }

    _main_target_name = target_name
    _library_target_name = "${target_name}_library"

    _sources_dir = "test"
    if (defined(invoker.source_dir)) {
      _sources_dir = invoker.source_dir
    }

    dart_library(_library_target_name) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "disable_analysis",
                             ])

      infer_package_name = true

      source_dir = _sources_dir
      sources = invoker.sources
    }

    _dot_packages_file = "$target_gen_dir/$_library_target_name.packages"

    _fuchsia_tester_label = "//third_party/dart-pkg/git/flutter/packages/flutter_tools:fuchsia_tester($host_toolchain)"
    _fuchsia_tester_out_dir =
        get_label_info(_fuchsia_tester_label, "root_out_dir")
    _fuchsia_tester_bin = "$_fuchsia_tester_out_dir/dart-tools/fuchsia_tester"

    _flutter_shell_label =
        "//third_party/flutter/shell/testing/($host_toolchain)"
    _flutter_shell_out_dir =
        get_label_info(_flutter_shell_label, "root_out_dir")
    _flutter_shell_bin = "$_flutter_shell_out_dir/flutter_tester"

    _precompiled_kernel_target_names = []
    _tests_json = []
    _tests_filename = "$target_gen_dir/tests.json"

    foreach(_source_file, invoker.sources) {
      _source_path = "$_sources_dir/$_source_file"

      _test_target = exec_script("//topaz/runtime/dart/gen_test_target_name.py",
                                 [
                                   "--file",
                                   _source_file,
                                 ],
                                 "trim string")

      if (_test_target != "") {
        _test_target_name = "${_main_target_name}_${_test_target}"
        _kernel_target_name = "${_test_target_name}_dill"
        _bootstrap_target_name = "${_test_target_name}_bootstrap"

        _bootstrap_file_name =
            "${target_gen_dir}/${_bootstrap_target_name}.dart"

        action(_bootstrap_target_name) {
          script = "$root_out_dir/dart-tools/build_test_bootstrap"
          outputs = [
            _bootstrap_file_name,
          ]

          rebased_source = rebase_path(_source_path, target_gen_dir)
          args = [
            "--output",
            rebase_path(_bootstrap_file_name),
            "--test-name",
            "$rebased_source",
          ]

          deps = [
            "//topaz/runtime/dart:build_test_bootstrap",
          ]
        }

        dart_kernel(_kernel_target_name) {
          platform_name = "flutter_runner"
          disable_analysis = true
          main_dart = _bootstrap_file_name
          args = []

          # TODO(tvolkert): Change to flutter platform once libraries.json works
          #                 in Fuchsia
          # platform_deps = [
          #   "//third_party/flutter/lib/snapshot:strong_platform",
          # ]
          # platform_path = "$root_out_dir/flutter_patched_sdk"
          platform_deps =
              [ "//topaz/runtime/flutter_runner/kernel:kernel_platform_files" ]
          platform_path = "$root_out_dir/flutter_runner_patched_sdk"

          sources = [
            _bootstrap_file_name,
          ]
          non_dart_deps = [ ":$_bootstrap_target_name" ]
          deps = [
            ":$_library_target_name",
            "//third_party/dart-pkg/git/flutter/packages/flutter_test",
            "//third_party/dart-pkg/pub/stream_channel",
            "//third_party/dart-pkg/pub/test",
          ]
        }

        _precompiled_kernel_target_names += [ ":${_kernel_target_name}_kernel" ]

        _tests_json += [
          {
            source = rebase_path(_bootstrap_file_name)
            dill =
                rebase_path("$target_gen_dir/${_kernel_target_name}_kernel.dil")
          },
        ]
      }

      write_file(_tests_filename, _tests_json, "json")
    }

    action(_main_target_name) {
      _invocation_file = "$target_gen_dir/$target_name"
      script = "//topaz/runtime/dart/gen_test_invocation.py"
      testonly = true
      outputs = [
        _invocation_file,
      ]

      inputs = [
        _dot_packages_file,
        _bootstrap_file_name,
        _fuchsia_tester_bin,
        _flutter_shell_bin,
        _tests_filename,
      ]

      args = [
        "--out",
        rebase_path(_invocation_file),
        "--tests",
        rebase_path(_tests_filename),
        "--source-dir",
        rebase_path(_sources_dir),
        "--dot-packages",
        rebase_path(_dot_packages_file),
        "--test-runner",
        rebase_path(_fuchsia_tester_bin),
        "--flutter-shell",
        rebase_path(_flutter_shell_bin),
        "--icudtl",
        rebase_path("//third_party/icu/common/icudtl.dat"),
        "--sdk-root",
        rebase_path("$root_out_dir/flutter_runner_patched_sdk"),
      ]

      deps = [
               ":$_library_target_name",
               ":$_bootstrap_target_name",
               ":${_kernel_target_name}_kernel",
               _flutter_shell_label,
               _fuchsia_tester_label,
             ] + _precompiled_kernel_target_names

      metadata = {
        test_runtime_deps = [ rebase_path(_invocation_file, root_build_dir) ]
      }
    }
  }
} else {
  # Not the Dart toolchain.
  template("dart_test") {
    _main_target_name = target_name
    _test_spec_target_name = "${target_name}_spec"
    _invocation_file = "$target_gen_dir/$target_name"

    if (is_linux || is_mac) {
      # TODO(IN-819): Delete renaming when dart tests are no longer run out of one
      # directory
      _invocation_file = "$root_out_dir/$target_name"

      test_spec(_test_spec_target_name) {
        name = _main_target_name
        location = _invocation_file
        deps = [
          ":$_main_target_name($dart_toolchain)",
        ]
        testonly = true
      }
    }

    action(_main_target_name) {
      script = "//topaz/runtime/dart/gen_test_bundle_invocation.py"
      testonly = true
      not_needed(invoker, "*")

      outputs = [
        _invocation_file,
      ]

      _dart_target_gen_dir =
          get_label_info(":bogus($dart_toolchain)", "target_gen_dir")
      _delegate_file = "$_dart_target_gen_dir/$target_name"

      args = [
        "--out",
        rebase_path(_invocation_file),
        "--test",
        rebase_path(_delegate_file),
      ]

      deps = [
        ":$_main_target_name($dart_toolchain)",
      ]
      if (is_linux || is_mac) {
        deps += [ ":$_test_spec_target_name" ]
      } else {
        not_needed([ "_test_spec_target_name" ])
      }
    }
  }
}
