# Copyright 2013 The Flutter 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("$flutter_root/common/config.gni")
import("//build/compiled_action.gni")
import("//third_party/dart/build/dart/dart_action.gni")

# Builds test fixtures for a unit test.
#
# Generates a directory structure containing an assets directory and the Dart
# code to execute compiled to kernel. Generates:
#   * an asserts directory at `$target_name/assets`.
#   * a C++ implementation for `flutter/testing/testing.h`, defining
#     `testing::GetFixturesPath()`, which returns the assets path.
#   * a kernel snapshot at `$target_name/assets/$kernel_out`.
#
# Rule attributes:
#   * fixtures: list of Dart files, including a main entrypoint.
#   * kernel_out: the output path, relative to the assets directory, of the
#     generated kernel snapshot. By default, `kernel_blob.bin`.
template("test_fixtures") {
  testonly = true

  assert(defined(invoker.fixtures), "Test fixtures must be specified.")
  if (flutter_runtime_mode == "profile" || flutter_runtime_mode == "release") {
    kernel_out = "kernel_snapshot.dill"
  } else {
    kernel_out = "kernel_blob.bin"
  }
  if (defined(invoker.kernel_out)) {
    kernel_out = invoker.kernel_out
  }

  fixtures_location = "$target_gen_dir/$target_name/assets"
  fixtures_location_file = "$target_gen_dir/$target_name/test_fixtures_location.cc"

  fixtures_name_target_name = target_name + "_gen_fixtures_name"
  action(fixtures_name_target_name) {
    script = "$flutter_root/testing/build/gen_fixtures_location_symbol.py"

    outputs = [
      fixtures_location_file,
    ]

    args = [
      "--fixtures_location_file",
      rebase_path(fixtures_location_file),
      "--fixtures_location",
      rebase_path(fixtures_location),
    ]
  }

  fixtures_source_set_target_name = target_name + "_gen_fixtures_source_set"
  source_set(fixtures_source_set_target_name) {
    testonly = true
    sources = [
      fixtures_location_file,
    ]

    deps = [
      ":$fixtures_name_target_name",
    ]
  }

  fixtures_kernel_target_name = target_name + "_kernel"
  dart_action(fixtures_kernel_target_name) {
    testonly = true
    script = "$root_out_dir/frontend_server.dart.snapshot"

    fixture_paths = []
    foreach(fixture, invoker.fixtures) {
      fixture_paths += [ rebase_path(fixture) ]
    }
    inputs = fixture_paths
    outputs = ["$fixtures_location/$kernel_out"]

    deps = [
      "//third_party/dart/utils/kernel-service:frontend_server"
    ]

    if (flutter_runtime_mode == "profile" || flutter_runtime_mode == "release") {
      args = [
        "--sdk-root", rebase_path("$root_out_dir/flutter_patched_sdk"),
        "--strong",
        "--target=flutter",
        "--aot",
        "--tfa",
        "-Ddart.vm.product=true",
        "--output-dill", rebase_path("$fixtures_location/$kernel_out"),
      ] + fixture_paths

      deps += [ "//flutter/lib/snapshot:strong_platform" ]
    } else {
      args = [
        "--sdk-root", rebase_path("$root_out_dir/flutter_patched_sdk"),
        "--target", "flutter",
        "--output-dill", rebase_path("$fixtures_location/$kernel_out"),
      ] + fixture_paths
    }
  }

  fixtures_aot_target_name = target_name + "_aot"
  compiled_action(fixtures_aot_target_name) {
    testonly = true
    tool = "//third_party/dart/runtime/bin:gen_snapshot"

    inputs = [
      "$fixtures_location/$kernel_out"
    ]

    outputs = [
      "$fixtures_location/vm_snapshot_data",
      "$fixtures_location/vm_snapshot_instr",
      "$fixtures_location/isolate_snapshot_data",
      "$fixtures_location/isolate_snapshot_instr",
    ]

    args = [
      "--causal_async_stacks",
      "--deterministic",
      "--snapshot_kind=app-aot-blobs",
      "--vm_snapshot_data=" + rebase_path("$fixtures_location/vm_snapshot_data"),
      "--vm_snapshot_instructions=" + rebase_path("$fixtures_location/vm_snapshot_instr"),
      "--isolate_snapshot_data=" + rebase_path("$fixtures_location/isolate_snapshot_data"),
      "--isolate_snapshot_instructions=" + rebase_path("$fixtures_location/isolate_snapshot_instr"),
      rebase_path("$fixtures_location/$kernel_out")
    ]

    deps = [
      ":$fixtures_kernel_target_name",
    ]
  }

  group(target_name) {
    testonly = true
    deps = [
      ":$fixtures_source_set_target_name",
    ]
    if (flutter_runtime_mode == "profile" || flutter_runtime_mode == "release") {
      deps += [ ":$fixtures_aot_target_name" ]
    } else {
      deps += [ ":$fixtures_kernel_target_name" ]
    }
  }
}
