# Copyright 2017 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.

group("testing") {
  testonly = true
  deps = [
    ":get_ledger",
    ":ledger_instance_factory",
    ":lib",
    ":unittests",
    "ledger_test_instance_provider",
    "netconnector",
  ]
}

visibility = [ "//src/ledger/*" ]

source_set("lib") {
  testonly = true

  sources = [
    "data_generator.cc",
    "data_generator.h",
    "fake_disk_cleanup_manager.h",
    "get_page_ensure_initialized.cc",
    "get_page_ensure_initialized.h",
    "ledger_matcher.cc",
    "ledger_matcher.h",
    "ledger_memory_usage.cc",
    "ledger_memory_usage.h",
    "page_data_generator.cc",
    "page_data_generator.h",
    "quit_on_error.cc",
    "quit_on_error.h",
    "run_with_tracing.cc",
    "run_with_tracing.h",
    "sync_params.cc",
    "sync_params.h",
    "test_with_environment.cc",
    "test_with_environment.h",
  ]

  public_deps = [
    "//garnet/public/lib/fsl",
    "//garnet/public/lib/gtest",
    "//garnet/public/lib/rapidjson_utils",
    "//garnet/public/lib/timekeeper:testing",
    "//peridot/lib/convert",
    "//peridot/lib/rng:testing",
    "//sdk/fidl/fuchsia.ledger",
    "//sdk/fidl/fuchsia.ledger.cloud",
    "//sdk/fidl/fuchsia.modular.auth",
    "//sdk/lib/fidl/cpp",
    "//sdk/lib/sys/cpp/testing:unit",
    "//src/ledger/bin/app:lib",
    "//src/ledger/bin/environment",
    "//src/ledger/bin/fidl/include",
    "//src/ledger/bin/storage/public:public",
    "//src/ledger/lib/firebase_auth/testing:service_account",
    "//src/lib/fxl",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
    "//third_party/rapidjson",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/task-utils",
    "//zircon/public/lib/trace-provider",
    "//zircon/public/lib/zx",
  ]

  deps = [
    "//garnet/public/lib/callback",
    "//garnet/public/lib/fsl",
    "//sdk/fidl/fuchsia.net.oldhttp",
    "//src/ledger/bin/fidl",
    "//src/ledger/lib/coroutine",
    "//src/ledger/lib/firebase_auth/testing",
    "//src/ledger/lib/firebase_auth/testing:service_account",
    "//src/lib/fxl",
    "//third_party/boringssl",
  ]

  configs += [ "//src/ledger:ledger_config" ]
}

source_set("ledger_instance_factory") {
  testonly = true

  sources = [
    "blocking_callback_waiter.cc",
    "blocking_callback_waiter.h",
    "ledger_app_instance_factory.cc",
    "ledger_app_instance_factory.h",
    "loop_controller.h",
    "loop_controller_real_loop.cc",
    "loop_controller_real_loop.h",
    "loop_controller_test_loop.cc",
    "loop_controller_test_loop.h",
  ]

  public_deps = [
    ":lib",
    "//peridot/lib/scoped_tmpfs",
    "//sdk/fidl/fuchsia.ledger",
    "//src/ledger/bin/fidl",
    "//src/ledger/bin/fidl/include",
    "//src/ledger/bin/fidl_helpers",
    "//src/lib/fxl",
  ]

  deps = [
    "//garnet/public/lib/callback",
    "//garnet/public/lib/fsl",
    "//peridot/lib/convert",
    "//third_party/googletest:gtest",
  ]

  configs += [ "//src/ledger:ledger_config" ]
}

# TODO(https://fuchsia.atlassian.net/projects/LE/issues/LE-607): Consider moving to benchmarks/.
source_set("get_ledger") {
  testonly = true

  sources = [
    "get_ledger.cc",
    "get_ledger.h",
  ]

  public_deps = [
    "//garnet/public/lib/fsl",
    "//peridot/lib/convert",
    "//sdk/fidl/fuchsia.ledger",
    "//sdk/fidl/fuchsia.ledger.cloud",
    "//sdk/lib/fidl/cpp",
    "//sdk/lib/sys/cpp",
    "//src/ledger/bin/fidl/include",
    "//src/ledger/bin/filesystem",
    "//src/lib/fxl",
    "//zircon/public/lib/fit",
  ]

  deps = [
    "//garnet/public/lib/callback",
    "//src/ledger/bin/fidl",
  ]

  configs += [ "//src/ledger:ledger_config" ]
}

source_set("unittests") {
  testonly = true

  sources = [
    "blocking_callback_waiter_unittest.cc",
    "ledger_matcher_unittest.cc",
  ]

  deps = [
    ":ledger_instance_factory",
    ":lib",
    "//garnet/public/lib/callback",
    "//src/lib/fxl",
    "//zircon/public/lib/async-loop-cpp",
  ]

  configs += [ "//src/ledger:ledger_config" ]
}
