# Copyright 2014 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("//build/config/features.gni")

declare_args() {
  # You can set the variable 'use_official_google_api_keys' to true
  # to use the Google-internal file containing official API keys
  # for Google Chrome even in a developer build.  Setting this
  # variable explicitly to true will cause your build to fail if the
  # internal file is missing.
  #
  # The variable is documented here, but not handled in this file;
  # see //google_apis/determine_use_official_keys.gypi for the
  # implementation.
  #
  # Set the variable to false to not use the internal file, even when
  # it exists in your checkout.
  #
  # Leave it unset or set to "" to have the variable
  # implicitly set to true if you have
  # src/google_apis/internal/google_chrome_api_keys.h in your
  # checkout, and implicitly set to false if not.
  #
  # Note that official builds always behave as if the variable
  # was explicitly set to true, i.e. they always use official keys,
  # and will fail to build if the internal file is missing.
  use_official_google_api_keys = ""

  # Set these to bake the specified API keys and OAuth client
  # IDs/secrets into your build.
  #
  # If you create a build without values baked in, you can instead
  # set environment variables to provide the keys at runtime (see
  # src/google_apis/google_api_keys.h for details).  Features that
  # require server-side APIs may fail to work if no keys are
  # provided.
  #
  # Note that if you are building an official build or if
  # use_official_google_api_keys has been set to trie (explicitly or
  # implicitly), these values will be ignored and the official
  # keys will be used instead.
  google_api_key = ""

  # See google_api_key.
  google_default_client_id = ""

  # See google_api_key.
  google_default_client_secret = ""
}

if (use_official_google_api_keys == "") {
  # Default behavior, check if the key file exists.
  check_internal_result = exec_script(
    "build/check_internal.py",
    [ rebase_path("internal/google_chrome_api_keys.h", root_build_dir) ],
    "value")
  use_official_google_api_keys = (check_internal_result == 1)
}

config("key_defines") {
  defines = []
  if (use_official_google_api_keys) {
    defines += [ "USE_OFFICIAL_GOOGLE_API_KEYS=1" ]
  }
  if (google_api_key != "") {
    defines += [ "GOOGLE_API_KEY=$google_api_key" ]
  }
  if (google_default_client_id != "") {
    defines += [ "GOOGLE_DEFAULT_CLIENT_ID=$google_default_client_id" ]
  }
  if (google_default_client_secret != "") {
    defines += [ "GOOGLE_DEFAULT_CLIENT_SECRET=$google_default_client_secret" ]
  }
}

source_set("google_apis") {
  sources = [
    "gaia/account_tracker.cc",
    "gaia/account_tracker.h",
    "gaia/gaia_auth_consumer.cc",
    "gaia/gaia_auth_consumer.h",
    "gaia/gaia_auth_fetcher.cc",
    "gaia/gaia_auth_fetcher.h",
    "gaia/gaia_auth_util.cc",
    "gaia/gaia_auth_util.h",
    "gaia/gaia_constants.cc",
    "gaia/gaia_constants.h",
    "gaia/gaia_oauth_client.cc",
    "gaia/gaia_oauth_client.h",
    "gaia/gaia_switches.cc",
    "gaia/gaia_switches.h",
    "gaia/gaia_urls.cc",
    "gaia/gaia_urls.h",
    "gaia/google_service_auth_error.cc",
    "gaia/google_service_auth_error.h",
    "gaia/identity_provider.cc",
    "gaia/identity_provider.h",
    "gaia/merge_session_helper.cc",
    "gaia/merge_session_helper.h",
    "gaia/oauth_request_signer.cc",
    "gaia/oauth_request_signer.h",
    "gaia/oauth2_access_token_consumer.h",
    "gaia/oauth2_access_token_fetcher.cc",
    "gaia/oauth2_access_token_fetcher.h",
    "gaia/oauth2_access_token_fetcher_impl.cc",
    "gaia/oauth2_access_token_fetcher_impl.h",
    "gaia/oauth2_api_call_flow.cc",
    "gaia/oauth2_api_call_flow.h",
    "gaia/oauth2_mint_token_flow.cc",
    "gaia/oauth2_mint_token_flow.h",
    "gaia/oauth2_token_service.cc",
    "gaia/oauth2_token_service.h",
    "gaia/oauth2_token_service_request.cc",
    "gaia/oauth2_token_service_request.h",
    "gaia/ubertoken_fetcher.cc",
    "gaia/ubertoken_fetcher.h",
    "google_api_keys.cc",
    "google_api_keys.h",
  ]

  if (is_win) {
    cflags = [ "/wd4267" ]  # size_t -> int
  }

  configs += [ ":key_defines" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//crypto",
    "//net",
    "//third_party/libxml",
  ]

  if (enable_extensions) {
    sources += [
      "drive/auth_service.cc",
      "drive/auth_service.h",
      "drive/auth_service_interface.h",
      "drive/auth_service_observer.h",
      "drive/base_requests.cc",
      "drive/base_requests.h",
      "drive/drive_api_parser.cc",
      "drive/drive_api_parser.h",
      "drive/drive_api_requests.cc",
      "drive/drive_api_requests.h",
      "drive/drive_api_url_generator.cc",
      "drive/drive_api_url_generator.h",
      "drive/drive_common_callbacks.h",
      "drive/gdata_errorcode.cc",
      "drive/gdata_errorcode.h",
      "drive/gdata_wapi_requests.cc",
      "drive/gdata_wapi_requests.h",
      "drive/gdata_wapi_parser.cc",
      "drive/gdata_wapi_parser.h",
      "drive/gdata_wapi_url_generator.cc",
      "drive/gdata_wapi_url_generator.h",
      "drive/request_sender.cc",
      "drive/request_sender.h",
      "drive/request_util.cc",
      "drive/request_util.h",
      "drive/task_util.cc",
      "drive/task_util.h",
      "drive/time_util.cc",
      "drive/time_util.h",
    ]
  }
}

source_set("test_support") {
  testonly = true
  sources = [
    "gaia/fake_gaia.cc",
    "gaia/fake_gaia.h",
    "gaia/fake_identity_provider.cc",
    "gaia/fake_identity_provider.h",
    "gaia/fake_oauth2_token_service.cc",
    "gaia/fake_oauth2_token_service.h",
    "gaia/mock_url_fetcher_factory.h",
    "gaia/oauth2_token_service_test_util.cc",
    "gaia/oauth2_token_service_test_util.h",
  ]

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

  if (enable_extensions) {
    sources += [
      "drive/dummy_auth_service.cc",
      "drive/dummy_auth_service.h",
      "drive/test_util.cc",
      "drive/test_util.h",
    ]
  }
}

test("google_apis_unittest") {
  sources = [
    "google_api_keys_unittest.cc",
    "gaia/gaia_auth_fetcher_unittest.cc",
    "gaia/gaia_auth_util_unittest.cc",
    "gaia/gaia_oauth_client_unittest.cc",
    "gaia/google_service_auth_error_unittest.cc",
    "gaia/merge_session_helper_unittest.cc",
    "gaia/oauth_request_signer_unittest.cc",
    "gaia/oauth2_access_token_fetcher_impl_unittest.cc",
    "gaia/oauth2_api_call_flow_unittest.cc",
    "gaia/oauth2_mint_token_flow_unittest.cc",
    "gaia/oauth2_token_service_unittest.cc",
    "gaia/ubertoken_fetcher_unittest.cc",
  ]

  configs += [ ":key_defines" ]

  deps = [
    ":google_apis",
    ":test_support",
    "//base",
    "//base/test:run_all_unittests",
    "//testing/gmock",
    "//testing/gtest",
  ]

  if (enable_extensions) {
    sources += [
      "drive/base_requests_server_unittest.cc",
      "drive/base_requests_unittest.cc",
      "drive/drive_api_parser_unittest.cc",
      "drive/drive_api_requests_unittest.cc",
      "drive/drive_api_url_generator_unittest.cc",
      "drive/gdata_wapi_parser_unittest.cc",
      "drive/gdata_wapi_requests_unittest.cc",
      "drive/gdata_wapi_url_generator_unittest.cc",
      "drive/request_sender_unittest.cc",
      "drive/request_util_unittest.cc",
      "drive/time_util_unittest.cc",
    ]
  }
}
