# Copyright 2007 The Android Open Source Project

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

# List of test cases.  Note that closures are not supported on ARM, so
# none of "closure*" or "cls*" will work there.
FFI_TEST_BASE := $(LOCAL_PATH)
FFI_TEST_FILES := \
		closure_fn0.c \
		closure_fn1.c \
		closure_fn2.c \
		closure_fn3.c \
		closure_fn4.c \
		closure_fn5.c \
		closure_fn6.c \
		cls_12byte.c \
		cls_16byte.c \
		cls_18byte.c \
		cls_19byte.c \
		cls_1_1byte.c \
		cls_20byte.c \
		cls_20byte1.c \
		cls_24byte.c \
		cls_2byte.c \
		cls_3_1byte.c \
		cls_3byte1.c \
		cls_3byte2.c \
		cls_4_1byte.c \
		cls_4byte.c \
		cls_5_1_byte.c \
		cls_5byte.c \
		cls_64byte.c \
		cls_6_1_byte.c \
		cls_6byte.c \
		cls_7_1_byte.c \
		cls_7byte.c \
		cls_8byte.c \
		cls_9byte1.c \
		cls_9byte2.c \
		cls_align_double.c \
		cls_align_float.c \
		cls_align_longdouble.c \
		cls_align_pointer.c \
		cls_align_sint16.c \
		cls_align_sint32.c \
		cls_align_sint64.c \
		cls_align_uint16.c \
		cls_align_uint32.c \
		cls_align_uint64.c \
		cls_double.c \
		cls_float.c \
		cls_multi_schar.c \
		cls_multi_sshort.c \
		cls_multi_sshortchar.c \
		cls_multi_uchar.c \
		cls_multi_ushort.c \
		cls_multi_ushortchar.c \
		cls_schar.c \
		cls_sint.c \
		cls_sshort.c \
		cls_uchar.c \
		cls_uint.c \
		cls_ulonglong.c \
		cls_ushort.c \
		float.c \
		float1.c \
		float2.c \
		float3.c \
		float4.c \
		many.c \
		negint.c \
		nested_struct.c \
		nested_struct1.c \
		nested_struct10.c \
		nested_struct2.c \
		nested_struct3.c \
		nested_struct4.c \
		nested_struct5.c \
		nested_struct6.c \
		nested_struct7.c \
		nested_struct8.c \
		nested_struct9.c \
		problem1.c \
		promotion.c \
		pyobjc-tc.c \
		return_dbl.c \
		return_dbl1.c \
		return_dbl2.c \
		return_fl.c \
		return_fl1.c \
		return_fl2.c \
		return_fl3.c \
		return_ll.c \
		return_ll1.c \
		return_sc.c \
		return_uc.c \
		return_ul.c \
		strlen.c \
		struct1.c \
		struct2.c \
		struct3.c \
		struct4.c \
		struct5.c \
		struct6.c \
		struct7.c \
		struct8.c \
		struct9.c

#		many_win32.c \
#		strlen_win32.c \
#

# define this to make it stop on the first error
#FFI_EXIT := exit 1
FFI_EXIT := true

#
# Build and run each test individually.  This doesn't work for device builds.
# The alternative is to build and install all of the little tests on the
# device, but that seems silly.
#
ffitests:
	@echo "Testing with LD_LIBRARY_PATH=$(TARGET_OUT_SHARED_LIBRARIES) /tmp/android-ffi-test"
	@(for file in $(FFI_TEST_FILES); do \
		echo -n $$file ;\
		$(CC) -g -Iexternal/libffi/$(TARGET_OS)-$(TARGET_ARCH) \
			-o /tmp/android-ffi-test \
			$(FFI_TEST_BASE)/libffi.call/$$file \
			-L$(TARGET_OUT_SHARED_LIBRARIES) -lffi ;\
		LD_LIBRARY_PATH=$(TARGET_OUT_SHARED_LIBRARIES) /tmp/android-ffi-test > /tmp/android-ffi-out ;\
		if [ "$$?" -eq 0 ]; then \
		    echo " OK" ;\
		else \
		    echo " FAIL" ;\
			cat /tmp/android-ffi-out ;\
			$(FFI_EXIT) ;\
		fi ;\
		done ;\
	)
	rm -f /tmp/android-ffi-test

#
# Build and install one test, so we have something to try on the device.
#
LOCAL_MODULE := ffitest_struct5
LOCAL_SRC_FILES := libffi.call/struct5.c
LOCAL_C_INCLUDES := external/libffi/$(TARGET_OS)-$(TARGET_ARCH)
LOCAL_SHARED_LIBRARIES := libffi

LOCAL_MODULE_TAGS := tests

include $(BUILD_EXECUTABLE)