# 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 = [ "//third_party/skia" ]
  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 += [ "//third_party/dart/runtime:libdart_precompiled_runtime" ]
  } else {
    public_deps += [
      "//flutter/lib/snapshot",
      "//third_party/dart/runtime:libdart_jit",
    ]
  }
}

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

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",
    "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",
    "//third_party/rapidjson",
  ]

  public_configs = [ "//flutter:config" ]

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

  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 += [
      "//third_party/dart/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",
      "type_conversions_unittests.cc",
    ]

    public_configs = [ "//flutter:export_dynamic_symbols" ]

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

  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",
    ]
  }
}
