ALL=test-base64 test-md4 test-milenage \
	test-rsa-sig-ver \
	test-sha1 \
	test-sha256 test-aes test-asn1 test-x509v3 test-list test-rc4

include ../src/build.rules

ifdef LIBFUZZER
CC=clang
CFLAGS = -MMD -O2 -Wall -g
CFLAGS += -fsanitize=fuzzer,address,signed-integer-overflow,unsigned-integer-overflow
CFLAGS += -DTEST_LIBFUZZER
LDFLAGS += -fsanitize=fuzzer,address,signed-integer-overflow,unsigned-integer-overflow
TEST_FUZZ=y
endif

ifdef TEST_FUZZ
CFLAGS += -DCONFIG_NO_RANDOM_POOL
CFLAGS += -DTEST_FUZZ
endif

CFLAGS += -DCONFIG_IEEE80211R_AP
CFLAGS += -DCONFIG_IEEE80211R
CFLAGS += -DCONFIG_TDLS

CFLAGS += -I../src
CFLAGS += -I../src/utils

SLIBS = ../src/utils/libutils.a

DLIBS = ../src/crypto/libcrypto.a \
	../src/common/libcommon.a \
	../src/ap/libap.a \
	../src/eapol_auth/libeapol_auth.a \
	../src/eapol_supp/libeapol_supp.a \
	../src/eap_peer/libeap_peer.a \
	../src/eap_server/libeap_server.a \
	../src/eap_common/libeap_common.a \
	../src/radius/libradius.a \
	../src/l2_packet/libl2_packet.a \
	../src/wps/libwps.a \
	../src/rsn_supp/librsn_supp.a \
	../src/tls/libtls.a

LIBS = $(SLIBS) $(DLIBS)
LLIBS = -Wl,--start-group $(DLIBS) -Wl,--end-group $(SLIBS)

# glibc < 2.17 needs -lrt for clock_gettime()
LLIBS += -lrt

../src/utils/libutils.a:
	$(MAKE) -C ../src/utils

../src/common/libcommon.a:
	$(MAKE) -C ../src/common

../src/crypto/libcrypto.a:
	$(MAKE) -C ../src/crypto

../src/tls/libtls.a:
	$(MAKE) -C ../src/tls

../src/ap/libap.a:
	$(MAKE) -C ../src/ap

../src/radius/libradius.a:
	$(MAKE) -C ../src/radius

../src/l2_packet/libl2_packet.a:
	$(MAKE) -C ../src/l2_packet

../src/wps/libwps.a:
	$(MAKE) -C ../src/wps

../src/eap_peer/libeap_peer.a:
	$(MAKE) -C ../src/eap_peer

../src/eap_server/libeap_server.a:
	$(MAKE) -C ../src/eap_server

../src/eap_common/libeap_common.a:
	$(MAKE) -C ../src/eap_common

../src/eapol_auth/libeapol_auth.a:
	$(MAKE) -C ../src/eapol_auth

../src/eapol_supp/libeapol_supp.a:
	$(MAKE) -C ../src/eapol_supp

../src/rsn_supp/librsn_supp.a:
	$(MAKE) -C ../src/rsn_supp


test-aes: $(call BUILDOBJ,test-aes.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-asn1: $(call BUILDOBJ,test-asn1.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-base64: $(call BUILDOBJ,test-base64.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-eapol: $(call BUILDOBJ,test-eapol.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)

test-https: $(call BUILDOBJ,test-https.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)

test-https_server: $(call BUILDOBJ,test-https_server.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)

test-json: $(call BUILDOBJ,test-json.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-list: $(call BUILDOBJ,test-list.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-md4: $(call BUILDOBJ,test-md4.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-milenage: $(call BUILDOBJ,test-milenage.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-rc4: $(call BUILDOBJ,test-rc4.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-rsa-sig-ver: $(call BUILDOBJ,test-rsa-sig-ver.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)

test-sha1: $(call BUILDOBJ,test-sha1.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-sha256: $(call BUILDOBJ,test-sha256.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $^ $(LLIBS)

test-tls: $(call BUILDOBJ,test-tls.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)

test-x509v3: $(call BUILDOBJ,test-x509v3.o) $(LIBS)
	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)


run-tests: $(ALL)
	./test-aes
	./test-list
	./test-md4
	./test-milenage
	./test-rsa-sig-ver
	./test-sha1
	./test-sha256
	@echo
	@echo All tests completed successfully.

clean: common-clean
	rm -f *~
	rm -f test-eapol
	rm -f test-https
	rm -f test-json
	rm -f test-tls
	rm -f test_x509v3_nist.out.*
	rm -f test_x509v3_nist2.out.*