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

# 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_root/lib/snapshot",
      "//third_party/dart/runtime:libdart_jit",
    ]
  }
}

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",
    "runtime_test.cc",
    "runtime_test.h",
  ]

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

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