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

source_set("signin") {
  configs += [ "//build/config/compiler:enable_arc" ]
  sources = [
    "about_signin_internals_factory.cc",
    "about_signin_internals_factory.h",
    "account_consistency_service_factory.h",
    "account_consistency_service_factory.mm",
    "account_reconcilor_factory.cc",
    "account_reconcilor_factory.h",
    "authentication_service.h",
    "authentication_service.mm",
    "authentication_service_delegate.h",
    "authentication_service_factory.h",
    "authentication_service_factory.mm",
    "chrome_identity_service_observer_bridge.h",
    "chrome_identity_service_observer_bridge.mm",
    "constants.h",
    "constants.mm",
    "gaia_auth_fetcher_ios.h",
    "gaia_auth_fetcher_ios.mm",
    "gaia_auth_fetcher_ios_bridge.h",
    "gaia_auth_fetcher_ios_bridge.mm",
    "gaia_auth_fetcher_ios_ns_url_session_bridge.h",
    "gaia_auth_fetcher_ios_ns_url_session_bridge.mm",
    "gaia_auth_fetcher_ios_wk_webview_bridge.h",
    "gaia_auth_fetcher_ios_wk_webview_bridge.mm",
    "identity_manager_factory.cc",
    "identity_manager_factory.h",
    "identity_manager_factory_observer.h",
    "identity_service_creator.cc",
    "identity_service_creator.h",
    "ios_chrome_signin_client.h",
    "ios_chrome_signin_client.mm",
    "ios_chrome_signin_status_metrics_provider_delegate.cc",
    "ios_chrome_signin_status_metrics_provider_delegate.h",
    "profile_oauth2_token_service_ios_provider_impl.h",
    "profile_oauth2_token_service_ios_provider_impl.mm",
    "signin_browser_state_info_updater.h",
    "signin_browser_state_info_updater.mm",
    "signin_browser_state_info_updater_factory.h",
    "signin_browser_state_info_updater_factory.mm",
    "signin_client_factory.cc",
    "signin_client_factory.h",
    "signin_error_controller_factory.cc",
    "signin_error_controller_factory.h",
    "signin_util.h",
    "signin_util.mm",
  ]
  deps = [
    ":feature_flags",
    "//base",
    "//components/browser_sync",
    "//components/content_settings/core/browser",
    "//components/image_fetcher/core",
    "//components/image_fetcher/ios",
    "//components/keyed_service/core",
    "//components/keyed_service/ios",
    "//components/metrics",
    "//components/pref_registry",
    "//components/prefs",
    "//components/signin/core/browser",
    "//components/signin/ios/browser",
    "//components/signin/ios/browser:active_state_manager",
    "//components/sync",
    "//components/unified_consent",
    "//google_apis",
    "//ios/chrome/browser",
    "//ios/chrome/browser/bookmarks:bookmarks_utils",
    "//ios/chrome/browser/browser_state",
    "//ios/chrome/browser/content_settings",
    "//ios/chrome/browser/crash_report",
    "//ios/chrome/browser/reading_list:reading_list_remover",
    "//ios/chrome/browser/ui/commands",
    "//ios/chrome/common",
    "//ios/net",
    "//ios/public/provider/chrome/browser",
    "//ios/public/provider/chrome/browser/signin",
    "//ios/web/common",
    "//net",
    "//services/identity:lib",
    "//services/identity/public/cpp",
    "//services/identity/public/mojom",
    "//services/service_manager/public/mojom",
    "//url",
  ]
}

source_set("feature_flags") {
  configs += [ "//build/config/compiler:enable_arc" ]
  sources = [
    "feature_flags.h",
    "feature_flags.mm",
  ]
  deps = [
    "//base",
  ]
}

source_set("test_support") {
  configs += [ "//build/config/compiler:enable_arc" ]
  testonly = true
  sources = [
    "authentication_service_delegate_fake.h",
    "authentication_service_delegate_fake.mm",
    "authentication_service_fake.h",
    "authentication_service_fake.mm",
    "identity_test_environment_chrome_browser_state_adaptor.cc",
    "identity_test_environment_chrome_browser_state_adaptor.h",
  ]
  deps = [
    ":signin",
    "//base",
    "//components/image_fetcher/core:test_support",
    "//components/keyed_service/core",
    "//components/signin/core/browser",
    "//components/signin/core/browser:internals_test_support",
    "//components/signin/ios/browser",
    "//ios/chrome/browser/browser_state",
    "//ios/chrome/browser/browser_state:test_support",
    "//ios/chrome/browser/sync",
    "//ios/public/provider/chrome/browser",
    "//ios/public/provider/chrome/browser/signin",
    "//services/identity/public/cpp:test_support",
  ]
}

source_set("unit_tests") {
  configs += [ "//build/config/compiler:enable_arc" ]
  testonly = true
  sources = [
    "authentication_service_unittest.mm",
    "chrome_identity_service_observer_bridge_unittest.mm",
    "gaia_auth_fetcher_ios_ns_url_session_bridge_unittests.mm",
    "gaia_auth_fetcher_ios_unittest.mm",
    "signin_browser_state_info_updater_unittest.mm",
  ]
  deps = [
    ":feature_flags",
    ":signin",
    ":test_support",
    "//base",
    "//components/pref_registry",
    "//components/prefs",
    "//components/signin/core/browser",
    "//components/signin/core/browser:internals_test_support",
    "//components/signin/ios/browser",
    "//components/signin/ios/browser:test_support",
    "//components/sync:test_support",
    "//components/sync_preferences",
    "//components/sync_preferences:test_support",
    "//google_apis",
    "//ios/chrome/browser",
    "//ios/chrome/browser/browser_state:browser_state_impl",
    "//ios/chrome/browser/browser_state:test_support",
    "//ios/chrome/browser/content_settings",
    "//ios/chrome/browser/prefs:browser_prefs",
    "//ios/chrome/browser/sync",
    "//ios/chrome/browser/sync:test_support",
    "//ios/chrome/browser/web:test_support",
    "//ios/chrome/test:test_support",
    "//ios/net",
    "//ios/public/provider/chrome/browser",
    "//ios/public/provider/chrome/browser/signin",
    "//ios/public/provider/chrome/browser/signin:test_support",
    "//ios/web/common",
    "//ios/web/public/test",
    "//ios/web/public/test/fakes",
    "//net:test_support",
    "//services/identity/public/cpp:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/ocmock",
  ]
}
