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