#
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Note that the platform modules are defined in the Android.bp. This file is
# used for the NDK, but is also how we define the tests for the platform.

LOCAL_PATH := $(call my-dir)

# Defines a test module.
#
# The upstream gtest configuration builds each of these as separate executables.
# It's a pain for how we run tests in the platform, but we can handle that with
# a test running script.
#
# $(1): Test name. test/$(1).cc will automatically be added to sources.
# $(2): Additional source files.
# $(3): "libgtest_main" or empty.
# $(4): Variant. Can be "_host", "_ndk", or empty.
# $(5): NDK STL if $(4) is "_ndk", else empty.
#
# Use -Wno-unnamed-type-template-args because gtest_unittest.cc wants anonymous enum type.
define gtest-unit-test
    $(eval include $(CLEAR_VARS)) \
    $(eval LOCAL_MODULE := \
        $(1)$(if $(findstring _ndk,$(4)),$(4))$(if $(5),_$(5))) \
    $(eval LOCAL_CPP_EXTENSION := .cc) \
    $(eval LOCAL_SRC_FILES := test/$(strip $(1)).cc $(2)) \
    $(eval LOCAL_C_INCLUDES := $(LOCAL_PATH)/include) \
    $(eval LOCAL_CPP_FEATURES := rtti) \
    $(eval LOCAL_CFLAGS := -Wno-unnamed-type-template-args) \
    $(eval LOCAL_STATIC_LIBRARIES := \
        $(if $(3),$(3)$(4)$(if $(5),_$(5))) libgtest$(4)$(if $(5),_$(5))) \
    $(if $(findstring _ndk,$(4)),$(eval LOCAL_LDLIBS := -ldl)) \
    $(if $(findstring _ndk,$(4)),$(eval LOCAL_SDK_VERSION := 9)) \
    $(if $(findstring _ndk,$(4)),$(eval LOCAL_NDK_STL_VARIANT := $(5)_static)) \
    $(if $(findstring _host,$(4)),,\
        $(eval LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_NATIVE_TESTS))) \
    $(eval $(if $(findstring _host,$(4)), \
        include $(BUILD_HOST_EXECUTABLE), \
        include $(BUILD_EXECUTABLE)))
endef

# Create modules for each test in the suite.
#
# $(1): Variant. Can be "_host", "_ndk", or empty.
# $(2): NDK STL if $(1) is "_ndk", else empty.
#
# The NDK variant of gtest-death-test_test is disabled because we don't have
# pthread_atfork on android-9.
define gtest-test-suite
    $(if $(findstring _ndk,$(1)),, \
        $(eval $(call gtest-unit-test, \
            gtest-death-test_test,,libgtest_main,$(1),$(2)))) \
    $(eval $(call gtest-unit-test,gtest_environment_test,,,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-filepath_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-linked_ptr_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-listener_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_main_unittest,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-message_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_no_test_unittest,,,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-options_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-param-test_test, \
        test/gtest-param-test2_test.cc,,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-port_test,,libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_pred_impl_unittest,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_premature_exit_test,,,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_prod_test,test/production.cc, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_repeat_test,,,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_sole_header_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_stress_test,,,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-test-part_test,, \
        libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test, \
        gtest-typed-test_test,test/gtest-typed-test2_test.cc, \
            libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest_unittest,,libgtest_main,$(1),$(2))) \
    $(eval $(call gtest-unit-test,gtest-unittest-api_test,,,$(1),$(2)))
endef

# Test is disabled because Android doesn't build gtest with exceptions.
# $(eval $(call gtest-unit-test,gtest_throw_on_failure_ex_test,,,$(1),$(2)))

# Test is disabled until https://github.com/google/googletest/pull/728 lands.
# $(eval $(call gtest-unit-test,gtest-printers_test,,libgtest_main,$(1),$(2)))

# If we're being invoked from ndk-build, we'll have NDK_ROOT defined.
ifdef NDK_ROOT

include $(CLEAR_VARS)
LOCAL_MODULE := libgtest
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := src/gtest-all.cc
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
LOCAL_RTTI_FLAG := -frtti
LOCAL_CPP_FEATURES := rtti
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libgtest_main
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := src/gtest_main.cc
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
LOCAL_RTTI_FLAG := -frtti
LOCAL_CPP_FEATURES := rtti
include $(BUILD_STATIC_LIBRARY)

else

# Tests for the platform built NDK gtest.
$(call gtest-test-suite,_ndk,stlport)
$(call gtest-test-suite,_ndk,gnustl)
$(call gtest-test-suite,_ndk,c++)

# Tests for the host gtest.
ifeq (,$(TARGET_BUILD_APPS))
$(call gtest-test-suite,_host,)
endif

endif

# Tests for the platform device gtest and for use in the NDK itself.
$(call gtest-test-suite,)
