include(CTest)
include(AwsTestHarness)
include(AwsLibFuzzer)
enable_testing()

file(GLOB TEST_HDRS "*.h")
set(TEST_SRC packet_encoding_test.c topic_tree_test.c connection_state_test.c mqtt_mock_server_handler.c)
file(GLOB TESTS ${TEST_HDRS} ${TEST_SRC})

add_test_case(mqtt_packet_puback)
add_test_case(mqtt_packet_pubrec)
add_test_case(mqtt_packet_pubrel)
add_test_case(mqtt_packet_pubcomp)
add_test_case(mqtt_packet_suback)
add_test_case(mqtt_packet_unsuback)
add_test_case(mqtt_packet_connect)
add_test_case(mqtt_packet_connect_will)
add_test_case(mqtt_packet_connect_empty_payload_will)
add_test_case(mqtt_packet_connect_password)
add_test_case(mqtt_packet_connack)
add_test_case(mqtt_packet_publish_qos0_dup)
add_test_case(mqtt_packet_publish_qos2_retain)
add_test_case(mqtt_packet_publish_empty_payload)
add_test_case(mqtt_packet_subscribe)
add_test_case(mqtt_packet_unsubscribe)
add_test_case(mqtt_packet_pingreq)
add_test_case(mqtt_packet_pingresp)
add_test_case(mqtt_packet_disconnect)

add_test_case(mqtt_topic_tree_match)
add_test_case(mqtt_topic_tree_unsubscribe)
add_test_case(mqtt_topic_tree_duplicate_transactions)
add_test_case(mqtt_topic_tree_transactions)
add_test_case(mqtt_topic_validation)

add_test_case(mqtt_connect_disconnect)
add_test_case(mqtt_connect_set_will_login)
add_test_case(mqtt_connection_interrupted)
add_test_case(mqtt_connection_any_publish)
add_test_case(mqtt_connection_timeout)
add_test_case(mqtt_connection_connack_timeout)
add_test_case(mqtt_connect_subscribe)
add_test_case(mqtt_connect_subscribe_fail_from_broker)
add_test_case(mqtt_connect_subscribe_multi)
add_test_case(mqtt_connect_unsubscribe)
add_test_case(mqtt_connect_resubscribe)
add_test_case(mqtt_connect_publish)
add_test_case(mqtt_connect_publish_payload)
add_test_case(mqtt_connection_offline_publish)
add_test_case(mqtt_connection_disconnect_while_reconnecting)
add_test_case(mqtt_connection_closes_while_making_requests)
add_test_case(mqtt_connection_resend_packets)
# It's too complicate to implement... Let's save it for the future.
# add_test_case(mqtt_connection_not_retry_publish_QoS_0)
add_test_case(mqtt_connection_consistent_retry_policy)
add_test_case(mqtt_connection_not_resend_packets_on_healthy_connection)
add_test_case(mqtt_connection_destory_pending_requests)
add_test_case(mqtt_clean_session_not_retry)
add_test_case(mqtt_clean_session_discard_previous)
add_test_case(mqtt_clean_session_keep_next_session)
add_test_case(mqtt_connection_publish_QoS1_timeout)
add_test_case(mqtt_connection_unsub_timeout)
add_test_case(mqtt_connection_publish_QoS1_timeout_connection_lost_reset_time)

generate_test_driver(${PROJECT_NAME}-tests)

set(TEST_PAHO_CLIENT_BINARY_NAME ${PROJECT_NAME}-paho-client)

add_executable(${TEST_PAHO_CLIENT_BINARY_NAME} "paho_client_test.c")
target_link_libraries(${TEST_PAHO_CLIENT_BINARY_NAME} PRIVATE ${PROJECT_NAME})
aws_set_common_properties(${TEST_PAHO_CLIENT_BINARY_NAME})
aws_add_sanitizers(${TEST_PAHO_CLIENT_BINARY_NAME} ${${PROJECT_NAME}_SANITIZERS})
target_compile_definitions(${TEST_PAHO_CLIENT_BINARY_NAME} PRIVATE AWS_UNSTABLE_TESTING_API=1)
target_include_directories(${TEST_PAHO_CLIENT_BINARY_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR})

set(TEST_IOT_CLIENT_BINARY_NAME ${PROJECT_NAME}-iot-client)

add_executable(${TEST_IOT_CLIENT_BINARY_NAME} "aws_iot_client_test.c")
target_link_libraries(${TEST_IOT_CLIENT_BINARY_NAME} PRIVATE ${PROJECT_NAME})
aws_set_common_properties(${TEST_IOT_CLIENT_BINARY_NAME})
aws_add_sanitizers(${TEST_IOT_CLIENT_BINARY_NAME} ${${PROJECT_NAME}_SANITIZERS})
target_compile_definitions(${TEST_IOT_CLIENT_BINARY_NAME} PRIVATE AWS_UNSTABLE_TESTING_API=1)
target_include_directories(${TEST_IOT_CLIENT_BINARY_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
