# Copyright 2018 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/chrome_build.gni")
import("//build/config/ui.gni")
import("//build/toolchain/win/midl.gni")
import("//chrome/process_version_rc_template.gni")
import("//testing/test.gni")

midl("elevation_service_idl") {
  sources = [ "elevation_service_idl.idl" ]

  writes_tlb = true
}

# Must be in a config because of how GN orders flags (otherwise /W4 will appear
# after this, and turn it back on).
config("no-missing-braces") {
  # Macros invoked by WRL CoCreatableClass omit optional braces.
  cflags = [ "-Wno-missing-braces" ]
}

# This service needs to work with Windows 7, so explicitly setting the defines
# to reflect this. Otherwise, WRL uses APIs that are only available in later
# Windows versions.
config("winver") {
  defines = [
    "NTDDI_VERSION=NTDDI_WIN7",
    "_WIN32_WINNT=_WIN32_WINNT_WIN7",
    "WINVER=_WIN32_WINNT_WIN7",
  ]
}

executable("elevation_service") {
  sources = [
    "elevation_service.cc",
    "elevation_service.rc",
  ]

  configs -= [
    "//build/config/compiler:cet_shadow_stack",
    "//build/config/win:console",
  ]
  configs += [ "//build/config/win:windowed" ]
  configs += [ ":no-missing-braces" ]
  configs -= [ "//build/config/win:winver" ]
  configs += [ ":winver" ]

  deps = [
    ":lib",
    ":version_resources",
    "//base",
    "//build/win:default_exe_manifest",
    "//chrome/install_static:install_static_util",
    "//chrome/install_static:primary_module",
    "//components/crx_file",
    "//third_party/zlib/google:zip",
  ]
}

source_set("lib") {
  visibility = [ ":*" ]

  sources = [
    "elevated_recovery_impl.cc",
    "elevated_recovery_impl.h",
    "elevator.cc",
    "elevator.h",
    "service_main.cc",
    "service_main.h",
  ]

  configs += [ ":no-missing-braces" ]
  configs -= [ "//build/config/win:winver" ]
  configs += [ ":winver" ]

  deps = [
    ":elevation_service_idl",
    "//base",
    "//chrome/install_static:install_static_util",
    "//components/crx_file:crx_file",
    "//third_party/zlib/google:zip",
  ]
}

process_version_rc_template("version_resources") {
  sources = [ "elevation_service_exe.ver" ]
  output = "$target_gen_dir/elevation_service_exe.rc"
}

copy("elevation_service_unittests_files") {
  sources = [
    "//components/test/data/crx_file/valid_no_publisher.crx3",
    "//components/test/data/crx_file/valid_publisher.crx3",
    "//components/test/data/update_client/ChromeRecovery.crx3",
  ]
  outputs = [ "$root_out_dir/elevated_recovery_unittest/{{source_file_part}}" ]
}

test("elevation_service_unittests") {
  use_xvfb = use_xvfb_in_this_config

  sources = [
    "elevated_recovery_unittest.cc",
    "run_all_unittests.cc",
    "service_main_unittest.cc",
  ]

  configs -= [ "//build/config/win:winver" ]
  configs += [ ":winver" ]

  deps = [
    ":lib",
    "//base",
    "//base/test:test_support",
    "//chrome/elevation_service:elevation_service_idl",
    "//chrome/install_static:install_static_util",
    "//chrome/install_static/test:test_support",
    "//components/crx_file",
    "//testing/gtest",
    "//third_party/zlib/google:zip",
  ]

  data_deps = [
    ":elevation_service",
    ":elevation_service_unittests_files",
  ]
}
