# 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("//third_party/dart/build/dart/dart_action.gni")

# Generates a Dart kernel snapshot using flutter_frontend_server.
#
# Arguments
#     dart_main (required): The Main Dart file.
#
#     dart_kernel (required): The path to the output kernel snapshot in the out
#                             directory.
#
#     packages (required): The path to the .packages file.
template("compile_flutter_dart_test") {
  assert(defined(invoker.dart_file), "The Dart test file must be specified.")
  assert(defined(invoker.dart_kernel),
         "The Dart Kernel file location must be specified.")
  assert(defined(invoker.packages),
         "The path to the .packages file must be specified.")

  dart_action(target_name) {
    testonly = true
    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    deps += [
      "//flutter/flutter_frontend_server:frontend_server",
      "//flutter/lib/snapshot:strong_platform",
    ]
    pool = "//flutter/build/dart:dart_pool"
    script = "$root_gen_dir/frontend_server.dart.snapshot"
    packages = rebase_path(invoker.packages)  # rebase_path(".packages")

    inputs = [ invoker.dart_file ]
    outputs = [ invoker.dart_kernel ]

    snapshot_depfile =
        "$root_gen_dir/flutter/testing/snapshot_$target_name.depfile.d"
    depfile = snapshot_depfile

    flutter_patched_sdk = rebase_path("$root_out_dir/flutter_patched_sdk")

    vm_args = [ "--disable-dart-dev" ]

    args = [
      "--sound-null-safety",
      "--sdk-root",
      flutter_patched_sdk,
      "--target=flutter",
      "--packages",
      packages,
      "--depfile",
      rebase_path(snapshot_depfile),
      "--output-dill",
      rebase_path(invoker.dart_kernel, root_out_dir),
      rebase_path(invoker.dart_file),
    ]
  }
}
