# 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/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",
    "//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") {
  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",
  ]

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

  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",
    ]
  }
}
