# 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/dart/dart_library.gni")
import("//build/dart/dart_package_config.gni")
import("//build/dart/kernel/dart_kernel.gni")
import("//build/dart/toolchain.gni")
import("//build/testing/test_spec.gni")

# Defines a flutter 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:
#
#   flutter_test("baz_test") {
#     deps = [
#       "//foo/baz",
#       "//third_party/dart-pkg/pub/test",
#     ]
#   }
if (current_toolchain == dart_toolchain) {
  template("flutter_test") {
    assert(defined(invoker.sources),
           "flutter_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"
    _copy_target_name = "${target_name}_copy"
    _snapshot_target_name = "${target_name}_snapshot"

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

    _dart_deps = []
    if (defined(invoker.deps)) {
      _dart_deps += invoker.deps
    }

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

      package_name = _main_target_name

      # We want to mimic the package_root being in place of the source_dir. Dart
      # does not allow multiple packages to share the same package_root so we
      # do this so our /test directories can live along side out /lib directories
      # which is how most dart packages are structured in out tree.
      package_root = rebase_path(_source_dir, ".")
      source_dir = "."

      sources = invoker.sources

      deps = _dart_deps

      # We include the pubspec and analysis options files which are at the
      # original package root since we are effectively changing the package_root
      # for this library.
      pubspec = "pubspec.yaml"

      if (!defined(disable_analysis) ||
          (defined(disable_analysis) && !disable_analysis)) {
        # analysis is not disabled so include the options file
        options_file = "analysis_options.yaml"
      }
    }

    _packages_file = "$target_gen_dir/${target_name}_package_config.json"
    _dart_deps += [
      ":$_library_target_name",
      "//third_party/dart-pkg/git/flutter/packages/flutter_test",
      "//third_party/dart-pkg/git/flutter/packages/flutter_tools",
    ]
    _package_config_target_name = "${target_name}_package_config"

    dart_package_config(_package_config_target_name) {
      deps = _dart_deps
      outputs = [ _packages_file ]
    }

    # The binary does not depend on the runtime-mode, using debug is fine.
    _flutter_tester_label = "//src/flutter:flutter_tester"
    _flutter_tester_gen_dir =
        get_label_info(_flutter_tester_label, "target_gen_dir")
    _flutter_tester_bin =
        rebase_path("${_flutter_tester_gen_dir}/flutter_tester")

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

    _test_runtime_deps = [ _tests_filename ]

    foreach(_source_file, invoker.sources) {
      _source_path = "$_source_dir/$_source_file"
      _trimmed_source = string_replace(_source_file, "_test.dart", "")
      if (_source_file != _trimmed_source) {
        _trimmed_source = string_replace(_trimmed_source, ".", "_")
        _trimmed_source = string_replace(_trimmed_source, "/", "_")
        _test_target_name = "${_main_target_name}_${_trimmed_source}"
        _kernel_target_name = "${_test_target_name}_dill"
        _bootstrap_target_name = "${_test_target_name}_bootstrap"
        _pubspec_target_name = "${_test_target_name}_pubspec"

        _bootstrap_filename = "$target_gen_dir/${_bootstrap_target_name}.dart"
        _dill_filename = "$target_gen_dir/${_kernel_target_name}_kernel.dil"

        action(_bootstrap_target_name) {
          hermetic_deps = false
          script = "$root_out_dir/dart-tools/build_test_bootstrap"
          outputs = [ _bootstrap_filename ]

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

          deps = [ "//build/flutter/internal/build_test_bootstrap" ]
        }

        # Dart requires each package to have a unique package_root. This
        # will copy the pubspec into a unique directory for each source
        # allowing us to set that directory as the package_root.
        copy(_pubspec_target_name) {
          sources = [ "pubspec.yaml" ]
          outputs = [ "${target_gen_dir}/${_test_target_name}/pubspec.yaml" ]
        }

        dart_kernel(_kernel_target_name) {
          platform_name = "flutter_runner"
          packages_path = _packages_file
          main_dart_file = _bootstrap_filename

          product = false
          is_aot = false

          # By default the dart_kernel will not link the current platform.dill but
          # when running host tests this will fail because the sdk patched for
          # fuchsia will be used.
          link_platform = true

          deps = [
            ":$_bootstrap_target_name",
            ":$_library_target_name",
            ":$_package_config_target_name",
            ":$_pubspec_target_name",
            "//third_party/dart-pkg/git/flutter/packages/flutter_test",
            "//third_party/dart-pkg/pub/clock",
            "//third_party/dart-pkg/pub/fake_async",
            "//third_party/dart-pkg/pub/stack_trace",
            "//third_party/dart-pkg/pub/stream_channel",
            "//third_party/dart-pkg/pub/test",
            "//third_party/dart-pkg/pub/test_api",
          ]
        }

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

        _tests_json += [
          {
            source = rebase_path(_bootstrap_filename, root_build_dir)
            dill = rebase_path(_dill_filename, root_build_dir)
          },
        ]
        _test_runtime_deps += [
          _bootstrap_filename,
          _dill_filename,
        ]
      }
    }

    write_file(_tests_filename, _tests_json, "json")

    # Copies resources to the build directory so that it may be archived
    # with the test and the rest of the test's dependencies, so that the
    # archiving happens with respect to the build directory.
    _data_dir = "$target_gen_dir/${_main_target_name}_data"
    _icudtl_file = "$_data_dir/icudtl.dat"
    _dart_binary = "$_data_dir/dart"
    copy(_copy_target_name) {
      sources = [
        "//prebuilt/third_party/dart/$host_os-$host_cpu/bin/dart",
        "//prebuilt/third_party/flutter/$host_cpu/deps/icudtl.dat",
      ]
      outputs = [ "$_data_dir/{{source_file_part}}" ]
    }

    # Creates a snapshot file of the fuchsia tester, which allows the test to
    # be invoked hermetically.
    _snapshot = "$target_gen_dir/${_main_target_name}.snapshot"
    _flutter_tools_label = "//third_party/dart-pkg/git/flutter/packages/flutter_tools:flutter_tools"
    _main_file = "//third_party/dart-pkg/git/flutter/packages/flutter_tools/bin/fuchsia_tester.dart"

    action(_snapshot_target_name) {
      hermetic_deps = false
      depfile = "${_snapshot}.d"

      outputs = [ _snapshot ]

      script = _dart_binary

      # The snapshot path needs to be rebased on top of the root build dir so
      # that the resulting depfile gets properly formatted.
      _rebased_snapshot = rebase_path(_snapshot, root_build_dir)
      _rebased_depfile = rebase_path(depfile)
      _rebased_packages_path = rebase_path(_packages_file)

      args = [
        "--verbosity=warning",
        "--snapshot=$_rebased_snapshot",
        "--snapshot-depfile=$_rebased_depfile",
        "--packages=$_rebased_packages_path",
        rebase_path(_main_file),
      ]

      deps = dart_sdk_deps + [
               "$_flutter_tools_label",
               ":$_copy_target_name",
               ":$_package_config_target_name",
             ]
    }

    _invocation_file = "$target_gen_dir/$target_name"

    # _invocation_params encapsulates the parameters to pass to the
    # invocation-generating action below. The utility lies in being able to
    # construct the actions args and metadata at the same time.
    _invocation_params = [
      {
        flag = "--wd"

        # TODO(crbug.com/gn/56): Rebasing root_build_dir alone yields a path
        # component that leaves root_build_dir, preventing portability.
        path = "$root_build_dir/dummy/.."
        base = get_path_info(_invocation_file, "dir")
      },
      {
        flag = "--out"
        path = _invocation_file
        base = ""  # Will result in an absolute path.
      },
      {
        flag = "--dart"
        path = _dart_binary
        base = root_build_dir
      },
      {
        flag = "--snapshot"
        path = _snapshot
        base = root_build_dir
      },
      {
        flag = "--tests"
        path = _tests_filename
        base = root_build_dir
      },
      {
        flag = "--dot-packages"
        path = _packages_file
        base = root_build_dir
      },
      {
        flag = "--flutter-shell"
        path = _flutter_tester_bin
        base = root_build_dir
      },
      {
        flag = "--icudtl"
        path = _icudtl_file
        base = root_build_dir
      },
      {
        flag = "--sdk-root"
        path = "$root_out_dir/flutter_runner_patched_sdk"
        base = root_build_dir
      },
    ]

    action(_main_target_name) {
      script = "//build/flutter/internal/gen_flutter_test_invocation.py"
      testonly = true
      outputs = [ _invocation_file ]

      inputs = [
        _packages_file,
        _bootstrap_filename,
        _flutter_tester_bin,
        _tests_filename,
      ]

      args = []
      foreach(param, _invocation_params) {
        args += [
          param.flag,
          rebase_path(param.path, param.base),
        ]
        if (param.flag != "--wd") {
          _test_runtime_deps += [ param.path ]
        }
      }

      deps = [
               ":$_library_target_name",
               ":$_bootstrap_target_name",
               ":${_kernel_target_name}_kernel",
               ":$_snapshot_target_name",
               ":$_copy_target_name",
               ":$_package_config_target_name",
               _flutter_tester_label,
             ] + _precompiled_kernel_target_names

      metadata = {
        test_runtime_deps = _test_runtime_deps
      }
    }
  }
} else {
  # Not the Dart toolchain.
  template("flutter_test") {
    _main_target_name = target_name
    _spec_target_name = "${target_name}_spec"
    _invocation_file = "$target_gen_dir/$target_name"

    if (is_linux || is_mac) {
      test_spec(_spec_target_name) {
        target = ":$_main_target_name"
        path = _invocation_file

        deps = [ ":$_main_target_name($dart_toolchain)" ]
      }
    } else {
      not_needed([ "_spec_target_name" ])
    }

    action(_main_target_name) {
      script = "//build/flutter/internal/gen_flutter_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/$_main_target_name"

      args = [
        "--wd",

        # TODO(crbug.com/gn/56): Rebasing root_build_dir alone yields a path
        # component that leaves root_build_dir, preventing portability.
        rebase_path("$root_build_dir/dummy/..",
                    get_path_info(_invocation_file, "dir")),
        "--out",
        rebase_path(_invocation_file),
        "--test",
        rebase_path(_delegate_file, root_build_dir),
      ]

      deps = [ ":$_main_target_name($dart_toolchain)" ]

      if (is_linux || is_mac) {
        data_deps = [ ":$_spec_target_name" ]
      }
    }
  }
}
