# 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/components.gni")
import("//build/dart/dart_test_component.gni")
import("//build/flutter/flutter_app.gni")
import("//build/testing/flutter_driver.gni")

flutter_app("inspect_mod") {
  if (flutter_driver_enabled) {
    main_dart = "lib/main.dart"
  } else {
    main_dart = "lib/test_main.dart"
  }
  package_name = "inspect_mod"

  fuchsia_package_name = "inspect_mod"

  meta = [
    {
      path = rebase_path("meta/inspect_mod.cmx")
      dest = "inspect_mod.cmx"
    },
  ]

  sources = [
    "main.dart",
    "src/inspect_example_app.dart",
    "vmo_reader.dart",
  ]

  deps = [
    "//sdk/dart/fuchsia_inspect",
    "//sdk/dart/fuchsia_logger",
    "//sdk/dart/fuchsia_modular",
    "//third_party/dart-pkg/git/flutter/packages/flutter",
    "//third_party/dart-pkg/git/flutter/packages/flutter_driver",
    "//third_party/dart-pkg/pub/async",
  ]
}

dart_test_component("test-component") {
  component_name = "inspect-mod-test"
  manifest = "meta/inspect_mod_test.cmx"
  sources = [ "inspect_mod_test.dart" ]

  deps = [
    "//sdk/dart/fuchsia_inspect",
    "//sdk/dart/fuchsia_services",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/fidl/fuchsia.sys",
    "//third_party/dart-pkg/git/flutter/packages/flutter_driver",
    "//third_party/dart-pkg/git/flutter/packages/fuchsia_remote_debug_protocol",
    "//third_party/dart-pkg/pub/glob",
    "//third_party/dart-pkg/pub/test",
  ]
}

fuchsia_test_package("inspect-mod-test") {
  test_components = [ ":test-component" ]

  test_specs = {
    environments = []

    # Flutter driver is only available in debug builds, so don't try to run in
    # release CI/CQ.
    if (is_debug) {
      environments += [ nuc_env ]
    }
  }
}
