# Use libtins' include directories + test include directories
INCLUDE_DIRECTORIES(
    ${PROJECT_SOURCE_DIR}/include/tins/ 
    ../include/
    ${GOOGLETEST_INCLUDE}
    ${PCAP_INCLUDE_DIR}
)

# Find pthread library
FIND_PACKAGE(Threads REQUIRED)

LINK_DIRECTORIES(
    ${GOOGLETEST_LIBRARY}
)
# Link against GoogleTest, libtins and pthread.
# Pthread is required by GoogleTest
LINK_LIBRARIES(
    gtest
    gtest_main
    tins 
    ${CMAKE_THREAD_LIBS_INIT}
    ${PCAP_LIBRARY}
)

IF(LIBTINS_ENABLE_WPA2)
    SET(OPTIONAL_TEST_TARGETS WPA2DecryptTest)
    ADD_EXECUTABLE(WPA2DecryptTest EXCLUDE_FROM_ALL wpa2_decrypt.cpp)
    ADD_TEST(WPA2Decrypt WPA2DecryptTest)
ENDIF()

# Add tests target
ADD_CUSTOM_TARGET(
    tests DEPENDS
    AddressRangeTest
    AllocatorsTest
    ArpTest
    DHCPTest
    DHCPv6Test
    DNSTest
    Dot11AckTest
    Dot11AssocRequestTest
    Dot11AssocResponseTest
    Dot11AuthenticationTest
    Dot11BeaconTest
    Dot11BlockAckRequestTest
    Dot11CFEndTest
    Dot11CFEndACKTest
    Dot11DataTest
    Dot11DeauthenticationTest
    Dot11DisassocTest
    Dot11Test
    Dot11ProbeRequestTest
    Dot11ProbeResponseTest
    Dot11PSPollTest
    Dot11ReassocRequestTest
    Dot11ReassocResponseTest
    Dot11RTSTest
    Dot1QTest
    EthernetTest
    HWAddressTest
    ICMPExtensionTest
    ICMPTest
    ICMPv6Test
    IPTest
    IPReassemblerTest
    IPAddressTest
    IPSecTest
    IPv6Test
    IPv6AddressTest
    LLCTest
    LoopbackTest
    MatchesResponseTest
    MPLSTest
    NetworkInterfaceTest
    OfflinePacketFilterTest
    PDUTest
    PKTAPTest
    PPITest
    PPPoETest
    RadioTapTest
    RC4EAPOLTest
    RSNEAPOLTest
    SLLTest
    SNAPTest
    STPTest
    TCPIPTest
    TCPTest
    TCPStreamTest
    UDPTest
    UtilsTest
    WEPDecryptTest
    ${OPTIONAL_TEST_TARGETS}
)

# Test executables

ADD_EXECUTABLE(AddressRangeTest EXCLUDE_FROM_ALL address_range.cpp)
ADD_EXECUTABLE(AllocatorsTest EXCLUDE_FROM_ALL allocators.cpp)
ADD_EXECUTABLE(ArpTest EXCLUDE_FROM_ALL arp.cpp)
ADD_EXECUTABLE(DHCPTest EXCLUDE_FROM_ALL dhcp.cpp)
ADD_EXECUTABLE(DHCPv6Test EXCLUDE_FROM_ALL dhcpv6.cpp)
ADD_EXECUTABLE(DNSTest EXCLUDE_FROM_ALL dns.cpp)
ADD_EXECUTABLE(Dot1QTest EXCLUDE_FROM_ALL dot1q.cpp)
ADD_EXECUTABLE(EthernetTest EXCLUDE_FROM_ALL ethernetII.cpp)
ADD_EXECUTABLE(HWAddressTest EXCLUDE_FROM_ALL hwaddress.cpp)
ADD_EXECUTABLE(ICMPExtensionTest EXCLUDE_FROM_ALL icmp_extension.cpp)
ADD_EXECUTABLE(ICMPTest EXCLUDE_FROM_ALL icmp.cpp)
ADD_EXECUTABLE(ICMPv6Test EXCLUDE_FROM_ALL icmpv6.cpp)
ADD_EXECUTABLE(IPTest EXCLUDE_FROM_ALL ip.cpp)
ADD_EXECUTABLE(IPReassemblerTest EXCLUDE_FROM_ALL ip_reassembler.cpp)
ADD_EXECUTABLE(IPAddressTest EXCLUDE_FROM_ALL ipaddress.cpp)
ADD_EXECUTABLE(IPSecTest EXCLUDE_FROM_ALL ipsec.cpp)
ADD_EXECUTABLE(IPv6Test EXCLUDE_FROM_ALL ipv6.cpp)
ADD_EXECUTABLE(IPv6AddressTest EXCLUDE_FROM_ALL ipv6address.cpp)
ADD_EXECUTABLE(LLCTest EXCLUDE_FROM_ALL llc.cpp)
ADD_EXECUTABLE(LoopbackTest EXCLUDE_FROM_ALL loopback.cpp)
ADD_EXECUTABLE(MPLSTest EXCLUDE_FROM_ALL mpls.cpp)
ADD_EXECUTABLE(MatchesResponseTest EXCLUDE_FROM_ALL matches_response.cpp)
ADD_EXECUTABLE(NetworkInterfaceTest EXCLUDE_FROM_ALL network_interface.cpp)
ADD_EXECUTABLE(OfflinePacketFilterTest EXCLUDE_FROM_ALL offline_packet_filter.cpp)
ADD_EXECUTABLE(PDUTest EXCLUDE_FROM_ALL pdu.cpp)
ADD_EXECUTABLE(PKTAPTest EXCLUDE_FROM_ALL pktap.cpp)
ADD_EXECUTABLE(PPITest EXCLUDE_FROM_ALL ppi.cpp)
ADD_EXECUTABLE(PPPoETest EXCLUDE_FROM_ALL pppoe.cpp)
ADD_EXECUTABLE(RadioTapTest EXCLUDE_FROM_ALL radiotap.cpp)
ADD_EXECUTABLE(RC4EAPOLTest EXCLUDE_FROM_ALL rc4eapol.cpp)
ADD_EXECUTABLE(RSNEAPOLTest EXCLUDE_FROM_ALL rsn_eapol.cpp)
ADD_EXECUTABLE(SLLTest EXCLUDE_FROM_ALL sll.cpp)
ADD_EXECUTABLE(SNAPTest EXCLUDE_FROM_ALL snap.cpp)
ADD_EXECUTABLE(STPTest EXCLUDE_FROM_ALL stp.cpp)
ADD_EXECUTABLE(TCPTest EXCLUDE_FROM_ALL tcp.cpp)
ADD_EXECUTABLE(TCPIPTest EXCLUDE_FROM_ALL tcp_ip.cpp)
ADD_EXECUTABLE(TCPStreamTest EXCLUDE_FROM_ALL tcp_stream.cpp)
ADD_EXECUTABLE(UDPTest EXCLUDE_FROM_ALL udp.cpp)
ADD_EXECUTABLE(UtilsTest EXCLUDE_FROM_ALL utils.cpp)
ADD_EXECUTABLE(WEPDecryptTest EXCLUDE_FROM_ALL wep_decrypt.cpp)

# Dot11 tests executables

ADD_EXECUTABLE(Dot11AckTest EXCLUDE_FROM_ALL dot11/ack.cpp)
ADD_EXECUTABLE(Dot11AssocRequestTest EXCLUDE_FROM_ALL dot11/assoc_request.cpp)
ADD_EXECUTABLE(Dot11AssocResponseTest EXCLUDE_FROM_ALL dot11/assoc_response.cpp)
ADD_EXECUTABLE(Dot11AuthenticationTest EXCLUDE_FROM_ALL dot11/authentication.cpp)
ADD_EXECUTABLE(Dot11BeaconTest EXCLUDE_FROM_ALL dot11/beacon.cpp)
ADD_EXECUTABLE(Dot11BlockAckRequestTest EXCLUDE_FROM_ALL dot11/block_ack_request.cpp)
ADD_EXECUTABLE(Dot11CFEndTest EXCLUDE_FROM_ALL dot11/cfend.cpp)
ADD_EXECUTABLE(Dot11CFEndACKTest EXCLUDE_FROM_ALL dot11/cfendack.cpp)
ADD_EXECUTABLE(Dot11DataTest EXCLUDE_FROM_ALL dot11/data.cpp)
ADD_EXECUTABLE(Dot11DeauthenticationTest EXCLUDE_FROM_ALL dot11/deauthentication.cpp)
ADD_EXECUTABLE(Dot11DisassocTest EXCLUDE_FROM_ALL dot11/disassoc.cpp)
ADD_EXECUTABLE(Dot11Test EXCLUDE_FROM_ALL dot11/dot11.cpp)
ADD_EXECUTABLE(Dot11ProbeRequestTest EXCLUDE_FROM_ALL dot11/probe_request.cpp)
ADD_EXECUTABLE(Dot11ProbeResponseTest EXCLUDE_FROM_ALL dot11/probe_response.cpp)
ADD_EXECUTABLE(Dot11PSPollTest EXCLUDE_FROM_ALL dot11/pspoll.cpp)
ADD_EXECUTABLE(Dot11ReassocRequestTest EXCLUDE_FROM_ALL dot11/reassoc_request.cpp)
ADD_EXECUTABLE(Dot11ReassocResponseTest EXCLUDE_FROM_ALL dot11/reassoc_response.cpp)
ADD_EXECUTABLE(Dot11RTSTest EXCLUDE_FROM_ALL dot11/rts.cpp)

# Tests

ADD_TEST(AddressRange AddressRangeTest)
ADD_TEST(Allocators AllocatorsTest)
ADD_TEST(Arp ArpTest)
ADD_TEST(DHCP DHCPTest)
ADD_TEST(DHCPv6 DHCPv6Test)
ADD_TEST(DNS DNSTest)
ADD_TEST(Dot11Ack Dot11AckTest)
ADD_TEST(Dot11AssocRequest Dot11AssocRequestTest)
ADD_TEST(Dot11AssocResponse Dot11AssocResponseTest)
ADD_TEST(Dot11Authentication Dot11AuthenticationTest)
ADD_TEST(Dot11Beacon Dot11BeaconTest)
ADD_TEST(Dot11BlockAckRequest Dot11BlockAckRequestTest)
ADD_TEST(Dot11CFEnd Dot11CFEndTest)
ADD_TEST(Dot11CFEndACK Dot11CFEndACKTest)
ADD_TEST(Dot11Data Dot11DataTest)
ADD_TEST(Dot11Deauthentication Dot11DeauthenticationTest)
ADD_TEST(Dot11Disassoc Dot11DisassocTest)
ADD_TEST(Dot11 Dot11Test)
ADD_TEST(Dot11ProbeRequest Dot11ProbeRequestTest)
ADD_TEST(Dot11ProbeResponse Dot11ProbeResponseTest)
ADD_TEST(Dot11PSPoll Dot11PSPollTest)
ADD_TEST(Dot11ReassocRequest Dot11ReassocRequestTest)
ADD_TEST(Dot11ReassocResponse Dot11ReassocResponseTest)
ADD_TEST(Dot11RTS Dot11RTSTest)
ADD_TEST(Dot1Q Dot1QTest)
ADD_TEST(Ethernet EthernetTest)
ADD_TEST(HWAddress HWAddressTest)
ADD_TEST(ICMPExtension ICMPExtensionTest)
ADD_TEST(ICMP ICMPTest)
ADD_TEST(ICMPv6 ICMPv6Test)
ADD_TEST(IP IPTest)
ADD_TEST(IPReassembler IPReassemblerTest)
ADD_TEST(IPAddress IPAddressTest)
ADD_TEST(IPSec IPSecTest)
ADD_TEST(IPv6 IPv6Test)
ADD_TEST(IPv6Address IPv6AddressTest)
ADD_TEST(LLC LLCTest)
ADD_TEST(Loopback LoopbackTest)
ADD_TEST(MatchesResponse MatchesResponseTest)
ADD_TEST(MPLS MPLSTest)
ADD_TEST(NetworkInterface NetworkInterfaceTest)
ADD_TEST(OfflinePacketFilter OfflinePacketFilterTest)
ADD_TEST(PDU PDUTest)
ADD_TEST(PPI PPITest)
ADD_TEST(PPPoE PPPoETest)
ADD_TEST(RadioTap RadioTapTest)
ADD_TEST(RC4EAPOL RC4EAPOLTest)
ADD_TEST(RSNEAPOL RSNEAPOLTest)
ADD_TEST(SLL SLLTest)
ADD_TEST(SNAP SNAPTest)
ADD_TEST(STP STPTest)
ADD_TEST(TCP TCPTest)
ADD_TEST(TCPIP TCPIPTest)
ADD_TEST(TCPStream TCPStreamTest)
ADD_TEST(UDP UDPTest)
ADD_TEST(Utils UtilsTest)
ADD_TEST(WEPDecrypt WEPDecryptTest)
