# 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/runtime/bin/vmservice/vmservice_sources.gni")
import("$flutter_root/common/config.gni")
import("$flutter_root/testing/testing.gni")

source_set("test_font") {
  sources = [
    "test_font_data.cc",
    "test_font_data.h",
  ]
  deps = [
    "//third_party/skia",
  ]
  public_configs = [ "$flutter_root: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" ]
  }
}

source_set("runtime") {
  sources = [
    "dart_isolate.cc",
    "dart_isolate.h",
    "dart_service_isolate.cc",
    "dart_service_isolate.h",
    "dart_snapshot.cc",
    "dart_snapshot.h",
    "dart_snapshot_buffer.cc",
    "dart_snapshot_buffer.h",
    "dart_vm.cc",
    "dart_vm.h",
    "embedder_resources.cc",
    "embedder_resources.h",
    "runtime_controller.cc",
    "runtime_controller.h",
    "runtime_delegate.cc",
    "runtime_delegate.h",
    "service_protocol.cc",
    "service_protocol.h",
    "start_up.cc",
    "start_up.h",
  ]

  deps = [
    ":test_font",
    "$flutter_root/assets",
    "$flutter_root/common",
    "$flutter_root/flow",
    "$flutter_root/fml",
    "$flutter_root/lib/io",
    "$flutter_root/lib/ui",
    "$flutter_root/third_party/txt",
    "//third_party/dart/runtime:dart_api",
    "//third_party/dart/runtime/bin:dart_io_api",
    "//third_party/skia",
    "//third_party/tonic",
  ]

  public_deps = [
    "//third_party/rapidjson",
  ]

  public_configs = [ "$flutter_root:config" ]

  if (flutter_runtime_mode != "release" &&
      flutter_runtime_mode != "dynamic_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" ]
  }
}

test_fixtures("runtime_fixtures") {
  fixtures = [ "fixtures/simple_main.dart" ]
}

executable("runtime_unittests") {
  testonly = true

  sources = [
    "dart_isolate_unittests.cc",
    "dart_service_isolate_unittests.cc",
    "dart_vm_unittests.cc",
  ]

  deps = [
    ":runtime",
    ":runtime_fixtures",
    "$flutter_root/fml",
    "$flutter_root/lib/snapshot",
    "$flutter_root/testing",
    "//third_party/dart/runtime:libdart_jit",
    "//third_party/skia",
    "//third_party/tonic",
  ]

  if (is_linux) {
    ldflags = [ "-rdynamic" ]
  }
}
