# 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/crypto.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 = [
    "cup/client_update_protocol.cc",
    "cup/client_update_protocol.h",
    "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/drive_entry_kinds.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",
    "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.h",
    "gaia/oauth2_access_token_fetcher.cc",
    "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/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",
    "//crypto",
    "//crypto:platform",
    "//net",
    "//third_party/libxml",
  ]

  if (use_openssl) {
    sources += [ "cup/client_update_protocol_openssl.cc" ]
  } else {
    sources += [ "cup/client_update_protocol_nss.cc" ]
  }
}

source_set("test_support") {
  sources = [
    "drive/dummy_auth_service.cc",
    "drive/dummy_auth_service.h",
    "drive/test_util.cc",
    "drive/test_util.h",
    "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",
  ]

  deps = [
    "//base",
    "//base/test:test_support",
    "//net",
    "//net:test_support",
  ]
  forward_dependent_configs_from = deps
}

test("google_apis_unittest") {
  sources = [
    "google_api_keys_unittest.cc",
    "cup/client_update_protocol_unittest.cc",
    "drive/base_requests_unittest.cc",
    "drive/base_requests_server_unittest.cc",
    "drive/drive_api_requests_unittest.cc",
    "drive/drive_api_parser_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",
    "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 (is_android) {
    sources -= [
      "drive/base_requests_server_unittest.cc",
      "drive/drive_api_parser_unittest.cc",
      "drive/drive_api_requests_unittest.cc",
      "drive/gdata_wapi_parser_unittest.cc",
      "drive/gdata_wapi_requests_unittest.cc",
    ]
  }
}
