include(AwsTestHarness)
enable_testing()

file(GLOB TEST_SRC "*.c")
file(GLOB LOGGING_TEST_SRC "logging/*.c")
file(GLOB TEST_HDRS "*.h")
file(GLOB LOGGING_TEST_HDRS "logging/*.h")
file(GLOB TESTS ${TEST_HDRS} ${LOGGING_TEST_HDRS} ${TEST_SRC} ${LOGGING_TEST_SRC})

# Each pipe test runs in 2 different configurations
macro(add_pipe_test_case name)
    add_test_case("${name}")
    add_test_case("${name}_2loops")
endmacro()

add_pipe_test_case(pipe_open_close)
add_pipe_test_case(pipe_read_write)
add_pipe_test_case(pipe_read_write_large_buffer)
add_pipe_test_case(pipe_readable_event_sent_after_write)
add_pipe_test_case(pipe_readable_event_sent_once)
add_pipe_test_case(pipe_readable_event_sent_on_subscribe_if_data_present)
add_pipe_test_case(pipe_readable_event_sent_on_resubscribe_if_data_present)
add_pipe_test_case(pipe_readable_event_sent_again_after_all_data_read)
add_pipe_test_case(pipe_error_event_sent_after_write_end_closed)
add_pipe_test_case(pipe_error_event_sent_on_subscribe_if_write_end_already_closed)
add_pipe_test_case(pipe_writes_are_fifo)
add_pipe_test_case(pipe_clean_up_cancels_pending_writes)

add_test_case(event_loop_xthread_scheduled_tasks_execute)
if (USE_IO_COMPLETION_PORTS)
    add_test_case(event_loop_completion_events)
else ()
    add_test_case(event_loop_subscribe_unsubscribe)
    add_test_case(event_loop_writable_event_on_subscribe)
    add_test_case(event_loop_no_readable_event_before_write)
    add_test_case(event_loop_readable_event_after_write)
    add_test_case(event_loop_readable_event_on_subscribe_if_data_present)
    add_test_case(event_loop_readable_event_on_2nd_time_readable)
    add_test_case(event_loop_no_events_after_unsubscribe)
endif ()

add_test_case(event_loop_stop_then_restart)
add_test_case(event_loop_group_setup_and_shutdown)

add_test_case(io_testing_channel)

add_test_case(local_socket_communication)
add_test_case(tcp_socket_communication)
add_test_case(udp_socket_communication)
add_test_case(connect_timeout)
add_test_case(outgoing_local_sock_errors)
add_test_case(outgoing_tcp_sock_error)
add_test_case(incoming_tcp_sock_errors)
add_test_case(incoming_udp_sock_errors)
add_test_case(wrong_thread_read_write_fails)
add_test_case(cleanup_before_connect_or_timeout_doesnt_explode)
add_test_case(cleanup_in_accept_doesnt_explode)
add_test_case(cleanup_in_write_cb_doesnt_explode)

if (WIN32)
    add_test_case(local_socket_pipe_connected_race)
endif()

add_test_case(channel_setup)
add_test_case(channel_single_slot_cleans_up)
add_test_case(channel_slots_clean_up)
add_test_case(channel_refcount_delays_clean_up)
add_test_case(channel_tasks_run)
add_test_case(channel_rejects_post_shutdown_tasks)
add_test_case(channel_cancels_pending_tasks)
add_test_case(channel_connect_some_hosts_timeout)

if (NOT WIN32)
    add_test_case(channel_message_passing)
endif ()

add_test_case(test_default_with_ipv6_lookup)
add_test_case(test_resolver_ipv6_address_lookup)
add_test_case(test_default_with_multiple_lookups)
add_test_case(test_resolver_ipv4_address_lookup)
add_test_case(test_default_with_ipv4_only_lookup)
add_test_case(test_resolver_ttls)
add_test_case(test_resolver_connect_failure_recording)
add_test_case(test_resolver_ttl_refreshes_on_resolve)

add_test_case(test_pem_single_cert_parse)
add_test_case(test_pem_private_key_parse)
add_test_case(test_pem_cert_chain_parse)
add_test_case(test_pem_cert_parse_from_file)
add_test_case(test_pem_private_key_parse_from_file)
add_test_case(test_pem_cert_chain_comments_and_whitespace)
add_test_case(test_pem_invalid_parse)
add_test_case(test_pem_valid_data_invalid_parse)
add_test_case(test_pem_invalid_in_chain_parse)

add_test_case(socket_handler_echo_and_backpressure)
add_test_case(socket_handler_close)

add_test_case(tls_channel_echo_and_backpressure_test)
add_test_case(tls_client_channel_negotiation_error_expired)
add_test_case(tls_client_channel_negotiation_error_wrong_host)
add_test_case(tls_client_channel_negotiation_error_self_signed)
add_test_case(tls_client_channel_negotiation_error_untrusted_root)
add_test_case(tls_client_channel_negotiation_success)
#track these down in s2n and find out why that aren't failing.
#add_test_case(tls_client_channel_negotiation_error_revoked)
#add_test_case(tls_client_channel_negotiation_error_pinning)
#add_test_case(tls_client_channel_negotiation_success)
#add_test_case(tls_channel_negotiation_error)

add_test_case(alpn_successfully_negotiates)
add_test_case(alpn_no_protocol_message)
add_test_case(alpn_error_creating_handler)

add_test_case(test_logging_filter_at_AWS_LL_NONE_s_logf_all_levels)
add_test_case(test_logging_filter_at_AWS_LL_FATAL_s_logf_all_levels)
add_test_case(test_logging_filter_at_AWS_LL_ERROR_s_logf_all_levels)
add_test_case(test_logging_filter_at_AWS_LL_WARN_s_logf_all_levels)
add_test_case(test_logging_filter_at_AWS_LL_INFO_s_logf_all_levels)
add_test_case(test_logging_filter_at_AWS_LL_DEBUG_s_logf_all_levels)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels)

add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_trace_cutoff)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_debug_cutoff)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_info_cutoff)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_warn_cutoff)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_error_cutoff)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_fatal_cutoff)
add_test_case(test_logging_filter_at_AWS_LL_TRACE_s_logf_all_levels_none_cutoff)

add_test_case(test_log_formatter_s_formatter_empty_case)
add_test_case(test_log_formatter_s_formatter_simple_case)
add_test_case(test_log_formatter_s_formatter_number_case)
add_test_case(test_log_formatter_s_formatter_string_case)
add_test_case(test_log_formatter_s_formatter_newline_case)

add_test_case(test_log_writer_simple_file_test)
add_test_case(test_log_writer_existing_file_test)
add_test_case(test_log_writer_bad_file_test)

add_test_case(test_foreground_log_channel_single_line)
add_test_case(test_foreground_log_channel_numbers)
add_test_case(test_foreground_log_channel_words)
add_test_case(test_foreground_log_channel_all)
add_test_case(test_background_log_channel_single_line)
add_test_case(test_background_log_channel_numbers)
add_test_case(test_background_log_channel_words)
add_test_case(test_background_log_channel_all)

add_test_case(test_pipeline_logger_unformatted_test)
add_test_case(test_pipeline_logger_formatted_test)

add_test_case(uri_full_parse)
add_test_case(uri_no_scheme_parse)
add_test_case(uri_no_port_parse)
add_test_case(uri_no_path_parse)
add_test_case(uri_no_query_parse)
add_test_case(uri_minimal_parse)
add_test_case(uri_root_only_parse)
add_test_case(uri_path_and_query_only_parse)
add_test_case(uri_query_params)
add_test_case(uri_invalid_scheme_parse)
add_test_case(uri_invalid_port_parse)
add_test_case(uri_port_too_large_parse)
add_test_case(uri_builder)
add_test_case(uri_builder_from_string)

add_test_case(test_home_directory_not_null)

set(TEST_BINARY_NAME ${CMAKE_PROJECT_NAME}-tests)
generate_test_driver(${TEST_BINARY_NAME})

#SSL certificates to use for testing.
add_custom_command(TARGET ${TEST_BINARY_NAME} PRE_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_CURRENT_SOURCE_DIR}/resources ${CMAKE_CURRENT_BINARY_DIR})


