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

      infer_package_name = true

      # 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_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 = "//topaz/runtime/flutter_runner: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) {
          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 = [ "//topaz/runtime/dart: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"
          disable_analysis = true
          main_dart = _bootstrap_filename
          package_root = rebase_path("${target_gen_dir}/${_test_target_name}")
          args = [
            "--enable-experiment=non-nullable",
            "--no-sound-null-safety",
          ]

          product = false
          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

          # 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_filename ]
          non_dart_deps = [
            ":$_bootstrap_target_name",
            ":$_pubspec_target_name",
          ]
          deps = [
            ":$_library_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) {
      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 = "//topaz/runtime/dart/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 = "//topaz/runtime/dart/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" ]
      }
    }
  }
}
