# Copyright 2019 The Fuchsia 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("//build/dart/dart_component.gni")
import("//build/dart/dart_library.gni")
import("//build/dart/dart_test_component.gni")
import("//build/dart/test.gni")

dart_library("fuchsia_inspect") {
  package_name = "fuchsia_inspect"
  null_safe = true

  sdk_category = "partner"

  source_dir = "lib"

  sources = [
    "inspect.dart",
    "reader.dart",
    "src/inspect/inspect.dart",
    "src/inspect/internal/_inspect_impl.dart",
    "src/inspect/node.dart",
    "src/inspect/property.dart",
    "src/reader/diagnostic_config.dart",
    "src/reader/diagnostic_data.dart",
    "src/reader/reader.dart",
    "src/testing/matcher.dart",
    "src/testing/util.dart",
    "src/vmo/bitfield64.dart",
    "src/vmo/block.dart",
    "src/vmo/heap.dart",
    "src/vmo/little_big_slab.dart",
    "src/vmo/util.dart",
    "src/vmo/vmo_fields.dart",
    "src/vmo/vmo_holder.dart",
    "src/vmo/vmo_writer.dart",
    "testing.dart",
  ]

  deps = [
    "//sdk/dart/fuchsia_services",
    "//sdk/dart/fuchsia_vfs",
    "//sdk/dart/zircon",
    "//sdk/fidl/fuchsia.diagnostics",
    "//sdk/fidl/fuchsia.mem",
    "//sdk/fidl/fuchsia.sys",
    "//third_party/dart-pkg/pub/collection",
    "//third_party/dart-pkg/pub/matcher",
    "//third_party/dart-pkg/pub/meta",
  ]
}

# Run these tests using:
#   fx run-host-tests fuchsia_inspect_package_unittests

dart_test("fuchsia_inspect_package_unittests") {
  sources = [
    "inspect/inspect_test.dart",
    "inspect/internal/inspect_impl_test.dart",
    "inspect/node_test.dart",
    "inspect/property_test.dart",
    "util.dart",
    "vmo/bitfield64_test.dart",
    "vmo/block_test.dart",
    "vmo/heap_test.dart",
    "vmo/little_big_slab_test.dart",
    "vmo/vmo_fields_test.dart",
    "vmo/vmo_writer_test.dart",
  ]

  deps = [
    ":fuchsia_inspect",
    "//sdk/dart/fuchsia_services",
    "//third_party/dart-pkg/pub/collection",
    "//third_party/dart-pkg/pub/mockito",
    "//third_party/dart-pkg/pub/test",
  ]
}

dart_test_component("dart-archive-reader-test-component") {
  component_name = "dart-archive-reader-test"
  manifest = "meta/dart-archive-reader-test.cmx"
  sources = [ "reader/reader_test.dart" ]
  deps = [
    ":fuchsia_inspect",
    "//sdk/dart/fuchsia_services",
    "//sdk/fidl/fuchsia.diagnostics",
    "//sdk/fidl/fuchsia.sys",
    "//third_party/dart-pkg/pub/pedantic",
    "//third_party/dart-pkg/pub/test",
  ]
}

# Run these tests using:
#  fx test dart-archive-reader-test

fuchsia_test_package("dart-archive-reader-test") {
  package_name = "dart-archive-reader-test"
  test_components = [ ":dart-archive-reader-test-component" ]
  deps =
      [ "//src/lib/diagnostics/inspect/runtime/rust:inspect_test_component_v1" ]
}

group("tests") {
  testonly = true
  deps = [ ":fuchsia_inspect_package_unittests($host_toolchain)" ]

  # TODO(fxbug.dev/83139): Test is consistently failing on coverage bot.
  # Please fix the test and remove the condition below.
  if (!is_coverage) {
    deps += [ ":dart-archive-reader-test" ]
  }
}
