# 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_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/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/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/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/testing",
      "//flutter/testing:fixture_test",
    ]
  }
}
