# 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("//build/buildflag_header.gni")
import("//build/config/chrome_build.gni")
import("//testing/test.gni")

buildflag_header("buildflags") {
  header = "buildflags.h"
  if (is_chrome_branded && is_win) {
    flags = [ "USE_GOOGLE_UPDATE_INTEGRATION=1" ]
  } else {
    flags = [ "USE_GOOGLE_UPDATE_INTEGRATION=0" ]
  }
}

if (is_win) {
  # This file contains utility functions that only depend on kernel32.
  # Please don't add dependencies on other system libraries.
  static_library("install_static_util") {
    deps = [
      ":buildflags",
      "//build:branding_buildflags",
      "//components/nacl/common:buildflags",
      "//components/version_info:channel",
      "//components/version_info:generate_version_info",
    ]

    public_deps = [ "//chrome/chrome_elf:nt_registry" ]

    sources = [
      "../app/chrome_dll_resource.h",
      "../chrome/common/chrome_icon_resources_win.h",
      "install_constants.h",
      "install_details.cc",
      "install_details.h",
      "install_modes.cc",
      "install_modes.h",
      "install_util.cc",
      "install_util.h",
      "policy_path_parser.cc",
      "policy_path_parser.h",
      "product_install_details.cc",
      "product_install_details.h",
      "user_data_dir.cc",
      "user_data_dir.h",
    ]

    if (is_chrome_branded) {
      sources += [
        "google_chrome_install_modes.cc",
        "google_chrome_install_modes.h",
      ]
    } else {
      sources += [
        "chromium_install_modes.cc",
        "chromium_install_modes.h",
      ]
    }

    libs = [ "kernel32.lib" ]

    configs += [
      # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
      "//build/config/compiler:no_size_t_to_int_warning",
    ]
  }

  # A source set for use by the module in a process that creates the
  # process-wide InstallDetails instance (i.e., chrome_elf.dll).
  source_set("primary_module") {
    sources = [ "get_install_details_payload.cc" ]
  }

  # A source set for use by modules in a process that fetch the process-wide
  # InstallDetails instance from the primary module by way of
  # GetInstallDetailsPayload (i.e., chrome.exe and chrome.dll).
  source_set("secondary_module") {
    sources = [
      "initialize_from_primary_module.cc",
      "initialize_from_primary_module.h",
    ]
    deps = [ ":install_static_util" ]
  }

  test("install_static_unittests") {
    output_name = "install_static_unittests"
    sources = [
      "install_details_unittest.cc",
      "install_modes_unittest.cc",
      "install_util_unittest.cc",
      "product_install_details_unittest.cc",
      "user_data_dir_win_unittest.cc",
    ]
    include_dirs = [ "$target_gen_dir" ]
    deps = [
      ":buildflags",
      "//base",
      "//base/test:run_all_unittests",
      "//base/test:test_support",
      "//build:branding_buildflags",
      "//chrome/install_static:install_static_util",
      "//chrome/install_static/test:test_support",
      "//testing/gmock",
      "//testing/gtest",
    ]
  }
}
