ROOT_PATH    := pa_tz_drv
SRC_PATH     := $(ROOT_PATH)/src
INCLUDE_PATH := $(ROOT_PATH)/include
TEST_PATH    := $(ROOT_PATH)/tests

### Build host GPAPI crypto library ############################################
LOCAL_NAME := gpapi_crypto_host

include multibuild/source/gp-api/crypto.mk
 
LOCAL_SRC_C := multibuild/source/gp-api/crypto/init_crypto_host.c \
               multibuild/source/gp-api/crypto/kdf/tees_kdf_emulator.c \
               $(addprefix multibuild/source/gp-api/,$(CRYPTO_SRC))

LOCAL_CFLAGS := $(PA_GLOBAL_CFLAGS) $(CRYPTO_CFLAGS) -DHOST_OPENSSL

LOCAL_INCLUDE_DIRS := multibuild/source/gp-api/persistent_object \
                  multibuild/include/gp-api \
                  multibuild/include/gp-mb \
                  multibuild/include/gp-ext \
                  $(addprefix multibuild/source/gp-api/,$(CRYPTO_INCLUDE_DIRS))

include $(BUILD_HOST_LIBRARY)

### Build host GPAPI library ###################################################
LOCAL_NAME := gpapi_host
 
LOCAL_SRC_C := multibuild/source/gp-api/tee/emulator/tees_log.c \
               multibuild/source/gp-api/tee/emulator/tee_sys.c \
               multibuild/source/gp-api/tee/emulator/persistent_object.c \
               multibuild/source/gp-api/tee/emulator/tees_secure_object.c \
               multibuild/source/gp-api/log_utils/log_utils.c \
               multibuild/source/gp-api/persistent_object/persistent_object_api.c \
               multibuild/source/gp-api/persistent_object/serialise_attr.c \
               multibuild/source/gp-api/protocol/socket_utils.c

LOCAL_CFLAGS := $(PA_GLOBAL_CFLAGS)

LOCAL_INCLUDE_DIRS := multibuild/include/gp-api \
                      multibuild/include/gp-mb \
                      multibuild/source/gp-api/log_utils \
                      multibuild/source/gp-api/persistent_object \
                      multibuild/source/gp-api/protocol \
                      multibuild/include/gp-ext \
                      multibuild/source/gp-api/prop/src \
                      multibuild/source/gp-api/prop/tee \
                      multibuild/source/gp-api/prop/inc \
                      multibuild/source/gp-api/prop/tee/non-blowfish-include

LOCAL_EXPORT_INCLUDE_DIRS := multibuild/include/gp-api \
                             multibuild/include/gp-mb \
                             multibuild/include/gp-ext \
                             multibuild/source/gp-api/protocol

include $(BUILD_HOST_LIBRARY)

### Function for build unit tests ##############################################
define ev_build_unit_tests
    local_name     := $(strip $(1))
    local_src_cpp  := $(strip $(2))
    local_src_c    := $(strip $(3))
    local_include  := $(strip $(4))

    LOCAL_NAME := $$(local_name)
    LOCAL_UUID := $$(CONFIG_STUB_UUID)

    LOCAL_SRC_CPP := $$(local_src_cpp)
    LOCAL_SRC_C   := $$(local_src_c) \
                     $(TEST_PATH)/mocks/mock_multibuild.c

    LOCAL_INCLUDE_DIRS := $$(INCLUDE_PATH) \
                          $$(SRC_PATH) \
                          pa_tz_lib/include \
                          pa_nwd_lib/include \
                          $$(local_include)

    LOCAL_CFLAGS   := -std=c99 -DDRIVER_ID=$$(CONFIG_TBASE_DRIVER_ID) \
        $$(PA_GLOBAL_CFLAGS) -DVERSION_NAME=\"$$(local_name)_unittest\"
    LOCAL_CPPFLAGS := -std=c++11 $$(PA_GLOBAL_CFLAGS)

    LOCAL_STATIC_LIBRARIES := gtest_main asn1proto_unittests scl \
                              gpapi_crypto_host gpapi_host
    LOCAL_LINK_GP_TEE := n
    LOCAL_TRUSTLET_EMULATOR := n

    LOCAL_LDFLAGS += -lstdc++ -lpthread -lcrypto --coverage
    LOCAL_CFLAGS +=-D_POSIX_C_SOURCE=199309
    include $$(BUILD_HOST)

.PHONY: run_$$(local_name)
run_$$(local_name): $$(local_name)
	@GTEST_OUTPUT="xml:./out/host/$$</$$<.xml" ./out/host/$$</$$<

.PHONY: run_utests
run_utests: run_$$(local_name)

local_name     :=
local_src_cpp  :=
local_src_c    :=
local_include  :=
endef

build_unit_tests = $(eval $(call ev_build_unit_tests, $(1), $(LOCAL_SRC_CPP), \
                   $(LOCAL_SRC_C), $(LOCAL_INCLUDE)))

### Build PA driver UnitTests for api.c ########################################
LOCAL_SRC_C   := $(SRC_PATH)/api.c \
                 $(TEST_PATH)/mocks/mock.c
LOCAL_SRC_CPP := $(TEST_PATH)/api_test.cc
LOCAL_INCLUDE := $(TEST_PATH)/mocks

$(call build_unit_tests, unit_test_pa_tz_drv_api)

## Build PA driver UnitTests ###################################################
LOCAL_SRC_C   := $(SRC_PATH)/kernel_access.c \
                 $(SRC_PATH)/authentication.c \
                 $(TEST_PATH)/mocks/mock.c
LOCAL_SRC_CPP := $(TEST_PATH)/kernel_access_test.cc \
                 $(TEST_PATH)/authentication_test.cc \
                 scl/source/string.cpp
LOCAL_INCLUDE := $(TEST_PATH)/mocks scl/include

$(call build_unit_tests, unit_test_pa_tz_drv)

## Build PA driver UnitTests for memory.c ################################
LOCAL_SRC_C   := $(SRC_PATH)/memory.c
LOCAL_SRC_CPP := $(TEST_PATH)/memory_test.cc
LOCAL_INCLUDE :=

$(call build_unit_tests, unit_test_pa_tz_drv_memory)

### Build PA driver UnitTests for task.c #######################################
LOCAL_SRC_C   := $(SRC_PATH)/task.c \
                 $(TEST_PATH)/mocks/mock.c
LOCAL_SRC_CPP := $(TEST_PATH)/task_test.cc
LOCAL_INCLUDE := $(TEST_PATH)/mocks

$(call build_unit_tests, unit_test_pa_tz_drv_task)

### Build PA driver UnitTests for task_access.c ################################
LOCAL_SRC_C   := $(SRC_PATH)/task_access.c
LOCAL_SRC_CPP := $(TEST_PATH)/task_access_test.cc
LOCAL_INCLUDE :=

$(call build_unit_tests, unit_test_pa_tz_drv_task_access)

### Build PA driver UnitTests for task_descriptor.c ################################
LOCAL_SRC_C   := $(SRC_PATH)/task_descriptor.c
LOCAL_SRC_CPP := $(TEST_PATH)/task_descriptor_test.cc
LOCAL_INCLUDE :=

$(call build_unit_tests, unit_test_pa_tz_drv_task_descriptor)

### Build PA driver UnitTests for task_descriptor_map.c ################################
LOCAL_SRC_C   := $(SRC_PATH)/task_descriptor_map.c
LOCAL_SRC_CPP := $(TEST_PATH)/task_descriptor_map_test.cc
LOCAL_INCLUDE :=

$(call build_unit_tests, unit_test_pa_tz_drv_task_descriptor_map)

### Build PA driver UnitTests for access_control.c #############################
LOCAL_SRC_C   := $(SRC_PATH)/access_control.c
LOCAL_SRC_CPP := $(TEST_PATH)/access_control_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_access_control)

### Build PA driver UnitTests for driver_handler.c #############################
LOCAL_SRC_C   := $(SRC_PATH)/driver_handler.c
LOCAL_SRC_CPP := $(TEST_PATH)/driver_handler_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_driver_handler)

### Build PA driver UnitTests for entry.c ######################################
LOCAL_SRC_C   := $(SRC_PATH)/entry.c
LOCAL_SRC_CPP := $(TEST_PATH)/entry_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_entry)

### Build PA driver UnitTests for gaf.c ########################################
LOCAL_SRC_C   := $(SRC_PATH)/gaf.c
LOCAL_SRC_CPP := $(TEST_PATH)/gaf_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_gaf)

### Build PA driver UnitTests for tlb_64.c ########################################
LOCAL_SRC_C   := $(SRC_PATH)/tlb_64.c
LOCAL_SRC_CPP := $(TEST_PATH)/tlb_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_tlb)

### Build PA driver UnitTests for validation_key.c #############################
LOCAL_SRC_C   := $(SRC_PATH)/validation_key.c
LOCAL_SRC_CPP := $(TEST_PATH)/validation_key_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_validation_key)

### Build PA driver UnitTests for task_parser.c ################################
LOCAL_SRC_C   := $(SRC_PATH)/task_parser.c
LOCAL_SRC_CPP := $(TEST_PATH)/task_parser_test.cc
LOCAL_INCLUDE :=

$(call build_unit_tests, unit_test_pa_tz_drv_task_parser)

### Build PA driver UnitTests for config.c #####################################
LOCAL_SRC_C   := $(SRC_PATH)/config.c
LOCAL_SRC_CPP := $(TEST_PATH)/config_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_config)

### Build PA driver UnitTests for pa_certificate.c #############################
LOCAL_SRC_C   := $(SRC_PATH)/pa_certificate.c
LOCAL_SRC_CPP := $(TEST_PATH)/pa_certificate_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_pa_certificate)

### Build PA driver UnitTests for provisioning.c ###############################
LOCAL_SRC_C   := $(SRC_PATH)/provisioning.c
LOCAL_SRC_CPP := $(TEST_PATH)/provisioning_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_provisioning)

### Build PA driver UnitTests for crypto.c #####################################
LOCAL_SRC_C   := $(SRC_PATH)/crypto.c
LOCAL_SRC_CPP := $(TEST_PATH)/crypto_test.cc
LOCAL_INCLUDE := 

$(call build_unit_tests, unit_test_pa_tz_drv_crypto)
