# 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_test2") {
    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_kernel2(_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 = [
        "--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_test2") {
    _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" ]
      }
    }
  }
}
