# 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("//flutter/common/config.gni")
import("//third_party/dart/build/dart/dart_action.gni")
import("//third_party/dart/sdk_args.gni")

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.")

  common_deps = [
    "//flutter/flutter_frontend_server:frontend_server",
    "//flutter/lib/snapshot:strong_platform",
  ]
  if (defined(invoker.deps)) {
    common_deps += invoker.deps
  }

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

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

  flutter_patched_sdk = rebase_path("$root_out_dir/flutter_patched_sdk")

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

  if (flutter_prebuilt_dart_sdk) {
    action(target_name) {
      testonly = true
      deps = common_deps + [ "//flutter:dart_sdk" ]
      pool = "//flutter/build/dart:dart_pool"
      script = "//build/gn_run_binary.py"
      inputs = [ invoker.dart_file ]
      outputs = [ invoker.dart_kernel ]
      depfile = snapshot_depfile

      ext = ""
      if (is_win) {
        ext = ".exe"
      }
      dart = rebase_path("$host_prebuilt_dart_sdk/bin/dart$ext", root_out_dir)
      frontend_server =
          rebase_path("$root_gen_dir/frontend_server.dart.snapshot")

      args = [ dart ] + common_vm_args + [ frontend_server ] + common_args
    }
  } else {
    dart_action(target_name) {
      testonly = true
      deps = common_deps
      pool = "//flutter/build/dart:dart_pool"
      script = "$root_gen_dir/frontend_server.dart.snapshot"
      packages = rebase_path(invoker.packages)
      inputs = [ invoker.dart_file ]
      outputs = [ invoker.dart_kernel ]
      depfile = snapshot_depfile
      vm_args = common_vm_args
      args = common_args
    }
  }
}
