# Copyright 2016 The Chromium 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" ]
  }
}
