# 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_overrides/gtest.gni")
if (is_ios) {
  import("//build/buildflag_header.gni")
  import("//build/config/coverage/coverage.gni")
  import("//build/config/ios/ios_sdk.gni")
}

config("gtest_direct_config") {
  visibility = [ ":*" ]
  defines = [ "UNIT_TEST" ]
}

# The file/directory layout of Google Test is not yet considered stable. Until
# it stabilizes, Chromium code MUST use this target instead of reaching directly
# into //third_party/googletest.
static_library("gtest") {
  testonly = true

  sources = [
    "include/gtest/gtest-death-test.h",
    "include/gtest/gtest-message.h",
    "include/gtest/gtest-param-test.h",
    "include/gtest/gtest-spi.h",
    "include/gtest/gtest.h",
    "include/gtest/gtest_prod.h",

    # This is a workaround for the issues below.
    #
    # 1) This target needs to be a static_library (not a source set) on Mac to
    #    avoid the build errors in
    #    https://codereview.chromium.org/2779193002#msg82.
    # 2) A static_library must have at least one source file, to avoid build
    #    errors on Mac and Windows. https://crbug.com/710334
    # 3) A static_library with complete_static_lib = true, which would not
    #    require adding the empty file, will result in duplicate symbols on
    #    Android. https://codereview.chromium.org/2852613002/#ps20001
    "empty.cc",
  ]
  public_deps = [
    "//third_party/googletest:gtest",
  ]

  public_configs = [ ":gtest_direct_config" ]

  if (gtest_include_multiprocess) {
    sources += [
      "../multiprocess_func_list.cc",
      "../multiprocess_func_list.h",
    ]
  }

  if (gtest_include_platform_test) {
    sources += [ "../platform_test.h" ]
  }

  if ((is_mac || is_ios) && gtest_include_objc_support) {
    if (is_ios) {
      set_sources_assignment_filter([])
    }
    sources += [
      "../gtest_mac.h",
      "../gtest_mac.mm",
    ]
    if (gtest_include_platform_test) {
      sources += [ "../platform_test_mac.mm" ]
    }
    set_sources_assignment_filter(sources_assignment_filter)
  }

  if (is_ios && gtest_include_ios_coverage) {
    sources += [
      "../coverage_util_ios.h",
      "../coverage_util_ios.mm",
    ]
    deps = [
      ":ios_enable_coverage",
    ]
  }
}

# The file/directory layout of Google Test is not yet considered stable. Until
# it stabilizes, Chromium code MUST use this target instead of reaching directly
# into //third_party/googletest.
source_set("gtest_main") {
  testonly = true
  deps = [
    "//third_party/googletest:gtest_main",
  ]
}

if (is_ios) {
  buildflag_header("ios_enable_coverage") {
    header = "ios_enable_coverage.h"
    flags = [ "IOS_ENABLE_COVERAGE=$use_clang_coverage" ]
  }
}
