# 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/common/config.gni")
import("//flutter/testing/testing.gni")

source_set("test_font") {
  sources = [
    "test_font_data.cc",
    "test_font_data.h",
  ]
  deps = [
    "//flutter/skia",
    "//flutter/third_party/txt",
  ]
  public_configs = [ "//flutter:config" ]
  defines = []
  if (flutter_runtime_mode == "debug" || current_toolchain == host_toolchain) {
    # Though the test font data is small, we dont want to add to the binary size
    # on the device (in profile and release modes). We only add the same on the
    # host test shells and the debug device shell.
    defines += [ "EMBED_TEST_FONT_DATA=1" ]
  }
}

# Picks the libdart implementation based on the Flutter runtime mode.
group("libdart") {
  public_deps = []

  if (flutter_runtime_mode == "profile" || flutter_runtime_mode == "release") {
    public_deps += [ "$dart_src/runtime:libdart_precompiled_runtime" ]
  } else {
    public_deps += [
      "$dart_src/runtime:libdart_jit",
      "//flutter/lib/snapshot",
    ]
  }
}

source_set("dart_plugin_registrant") {
  sources = [
    "dart_plugin_registrant.cc",
    "dart_plugin_registrant.h",
  ]
  deps = [
    "$dart_src/runtime:dart_api",
    "//flutter/fml",
    "//flutter/third_party/tonic",
  ]
}

source_set("runtime") {
  sources = [
    "dart_isolate.cc",
    "dart_isolate.h",
    "dart_isolate_group_data.cc",
    "dart_isolate_group_data.h",
    "dart_service_isolate.cc",
    "dart_service_isolate.h",
    "dart_snapshot.cc",
    "dart_snapshot.h",
    "dart_timestamp_provider.cc",
    "dart_timestamp_provider.h",
    "dart_vm.cc",
    "dart_vm.h",
    "dart_vm_data.cc",
    "dart_vm_data.h",
    "dart_vm_initializer.cc",
    "dart_vm_initializer.h",
    "dart_vm_lifecycle.cc",
    "dart_vm_lifecycle.h",
    "embedder_resources.cc",
    "embedder_resources.h",
    "isolate_configuration.cc",
    "isolate_configuration.h",
    "platform_data.cc",
    "platform_data.h",
    "platform_isolate_manager.cc",
    "platform_isolate_manager.h",
    "ptrace_check.h",
    "runtime_controller.cc",
    "runtime_controller.h",
    "runtime_delegate.cc",
    "runtime_delegate.h",
    "service_protocol.cc",
    "service_protocol.h",
    "skia_concurrent_executor.cc",
    "skia_concurrent_executor.h",
  ]

  if (is_ios && flutter_runtime_mode == "debug") {
    # These contain references to private APIs and this TU must only be compiled in debug runtime modes.
    sources += [ "ptrace_check.cc" ]
  }

  public_deps = [
    "//flutter/lib/gpu",
    "//flutter/lib/ui",
    "//flutter/third_party/rapidjson",
  ]

  public_configs = [ "//flutter:config" ]

  deps = [
    ":dart_plugin_registrant",
    ":test_font",
    "$dart_src/runtime:dart_api",
    "$dart_src/runtime/bin:dart_io_api",
    "//flutter/assets",
    "//flutter/common",
    "//flutter/flow",
    "//flutter/fml",
    "//flutter/lib/io",
    "//flutter/shell/common:display",
    "//flutter/skia",
    "//flutter/third_party/tonic",
    "//flutter/third_party/txt",
  ]

  if (flutter_runtime_mode != "release" && !is_fuchsia) {
    # Only link in Observatory in non-release modes on non-Fuchsia. Fuchsia
    # instead puts Observatory into the runner's package.
    deps += [ "$dart_src/runtime/observatory:embedded_observatory_archive" ]
  }
}

if (enable_unittests) {
  test_fixtures("runtime_fixtures") {
    dart_main = "fixtures/runtime_test.dart"
  }

  executable("runtime_unittests") {
    testonly = true

    sources = [
      "dart_isolate_unittests.cc",
      "dart_lifecycle_unittests.cc",
      "dart_service_isolate_unittests.cc",
      "dart_vm_unittests.cc",
      "platform_isolate_manager_unittests.cc",
      "type_conversions_unittests.cc",
    ]

    public_configs = [ "//flutter:export_dynamic_symbols" ]

    public_deps = [
      ":libdart",
      ":runtime",
      ":runtime_fixtures",
      "$dart_src/runtime/bin:elf_loader",
      "//flutter/common",
      "//flutter/fml",
      "//flutter/lib/snapshot",
      "//flutter/skia",
      "//flutter/testing",
      "//flutter/testing:dart",
      "//flutter/testing:fixture_test",
      "//flutter/third_party/tonic",
    ]
  }

  test_fixtures("no_plugin_registrant") {
    dart_main = "fixtures/no_dart_plugin_registrant_test.dart"
    use_target_as_artifact_prefix = true
  }

  executable("no_dart_plugin_registrant_unittests") {
    testonly = true

    sources = [ "no_dart_plugin_registrant_unittests.cc" ]

    public_configs = [ "//flutter:export_dynamic_symbols" ]

    public_deps = [
      ":no_plugin_registrant",
      "//flutter/fml",
      "//flutter/lib/snapshot",
      "//flutter/testing",
      "//flutter/testing:fixture_test",
    ]
  }

  test_fixtures("plugin_registrant") {
    dart_main = "fixtures/dart_tool/flutter_build/dart_plugin_registrant.dart"
    use_target_as_artifact_prefix = true
  }

  executable("dart_plugin_registrant_unittests") {
    testonly = true

    sources = [ "dart_plugin_registrant_unittests.cc" ]

    public_configs = [ "//flutter:export_dynamic_symbols" ]

    public_deps = [
      ":plugin_registrant",
      "//flutter/fml",
      "//flutter/lib/snapshot",
      "//flutter/runtime:dart_plugin_registrant",
      "//flutter/testing",
      "//flutter/testing:fixture_test",
    ]
  }
}
