# 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("//printing/buildflags/buildflags.gni")
import("//services/catalog/public/tools/catalog.gni")
import("//services/service_manager/public/service_manifest.gni")

source_set("test_support") {
  testonly = true

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

  deps = [
    "//components/content_settings/core/common",
    "//components/gcm_driver:gcm_driver",
    "//components/signin/core/browser",
    "//mojo/core/embedder",
    "//net",
    "//testing/gtest",
    "//ui/base",
    "//ui/resources:ui_test_pak",
  ]

  public_deps = [
    "//base/test:test_support",
  ]

  if (is_ios) {
    sources += [
      "ios_components_test_initializer.cc",
      "ios_components_test_initializer.h",
    ]

    deps += [ "//services/network:test_support" ]
  } else {
    deps += [
      "//components/invalidation/impl",
      "//components/policy/core/browser",
      "//ui/gl:test_support",
    ]

    public_deps += [ "//content/test:test_support" ]
  }
}

# Defines a main() function that uses components_test_suite.h
source_set("run_all_unittests") {
  testonly = true

  sources = [
    "run_all_unittests.cc",
  ]

  deps = [
    ":test_support",
  ]

  if (enable_basic_printing) {
    defines = [ "HAS_SERVICE_IN_UNIT_TEST" ]
    deps += [
      ":components_unittests_catalog_source",
      "//services/catalog:lib",
    ]
  }
}

if (enable_basic_printing) {
  # There is only one service in catalog, which depends on printing feature.
  # When more services are added, the condition can be moved inside of catalog.
  catalog("components_unittests_catalog") {
    embedded_services = [ "//components/services/pdf_compositor:pdf_compositor_service_unittest_manifest" ]
  }

  catalog_cpp_source("components_unittests_catalog_source") {
    testonly = true
    catalog = ":components_unittests_catalog"
    generated_function_name = "components::CreateUnittestsCatalog"
  }
}
