include(AwsTestHarness)
enable_testing()

option(BYO_CRYPTO "Don't build a tls implementation or link against a crypto interface. This feature is only for unix builds currently." OFF)

if(BYO_CRYPTO)
    set(ENABLE_NET_TESTS OFF)

    add_test_case(test_s3_client_byo_crypto_no_options)
    add_test_case(test_s3_client_byo_crypto_with_options)
endif()

file(GLOB TEST_SRC "*.c")
file(GLOB TEST_HDRS "*.h")
file(GLOB TESTS ${TEST_HDRS} ${TEST_SRC})

add_test_case(test_s3_copy_http_message)
add_test_case(test_s3_message_util_assign_body)
add_test_case(test_s3_ranged_get_object_message_new)
add_test_case(test_s3_set_multipart_request_path)
add_test_case(test_s3_create_multipart_upload_message_new)
add_test_case(test_s3_upload_part_message_new)
add_test_case(test_s3_complete_multipart_message_new)
add_test_case(test_s3_abort_multipart_upload_message_new)

add_net_test_case(test_s3_client_create_destroy)
add_net_test_case(test_s3_client_max_active_connections_override)
add_test_case(test_s3_client_get_max_active_connections)
add_test_case(test_s3_request_create_destroy)
add_test_case(test_s3_client_queue_requests)
add_test_case(test_s3_meta_request_body_streaming)
add_test_case(test_s3_update_meta_requests_trigger_prepare)
add_test_case(test_s3_client_update_connections_finish_result)

add_net_test_case(test_s3_client_exceed_retries)
add_net_test_case(test_s3_client_acquire_connection_fail)
add_net_test_case(test_s3_meta_request_fail_prepare_request)
add_net_test_case(test_s3_meta_request_sign_request_fail)
add_net_test_case(test_s3_meta_request_send_request_finish_fail)
add_net_test_case(test_s3_auto_range_put_missing_upload_id)

add_net_test_case(test_s3_cancel_mpu_create_not_sent)
add_net_test_case(test_s3_cancel_mpu_create_completed)
add_net_test_case(test_s3_cancel_mpu_one_part_completed)
add_net_test_case(test_s3_cancel_mpu_all_parts_completed)
add_net_test_case(test_s3_cancel_mpd_nothing_sent)
add_net_test_case(test_s3_cancel_mpd_one_part_sent)
add_net_test_case(test_s3_cancel_mpd_one_part_completed)
add_net_test_case(test_s3_cancel_mpd_two_parts_completed)
add_net_test_case(test_s3_cancel_mpd_head_object_sent)
add_net_test_case(test_s3_cancel_mpd_head_object_completed)
add_net_test_case(test_s3_cancel_mpd_get_without_range_sent)
add_net_test_case(test_s3_cancel_mpd_get_without_range_completed)
add_net_test_case(test_s3_cancel_prepare)

add_net_test_case(test_s3_get_object_tls_disabled)
add_net_test_case(test_s3_get_object_tls_enabled)
add_net_test_case(test_s3_get_object_tls_default)
add_net_test_case(test_s3_get_object_less_than_part_size)
add_net_test_case(test_s3_get_object_empty_object)
add_net_test_case(test_s3_get_object_multiple)
add_net_test_case(test_s3_get_object_sse_kms)
add_net_test_case(test_s3_get_object_sse_aes256)
add_net_test_case(test_s3_no_signing)
add_net_test_case(test_s3_signing_override)
add_net_test_case(test_s3_put_object_tls_disabled)
add_net_test_case(test_s3_put_object_tls_enabled)
add_net_test_case(test_s3_put_object_tls_default)
add_net_test_case(test_s3_multipart_put_object_with_acl)
add_net_test_case(test_s3_put_object_multiple)
add_net_test_case(test_s3_put_object_less_than_part_size)
add_net_test_case(test_s3_put_object_empty_object)
add_net_test_case(test_s3_put_object_with_part_remainder)
add_net_test_case(test_s3_put_object_sse_kms)
add_net_test_case(test_s3_put_object_sse_kms_multipart)
add_net_test_case(test_s3_put_object_sse_aes256)
add_net_test_case(test_s3_put_object_sse_aes256_multipart)
add_net_test_case(test_s3_put_object_singlepart_no_content_md5_enabled)
add_net_test_case(test_s3_put_object_singlepart_no_content_md5_disabled)
add_net_test_case(test_s3_put_object_singlepart_correct_content_md5_enabled)
add_net_test_case(test_s3_put_object_singlepart_correct_content_md5_disabled)
add_net_test_case(test_s3_put_object_singlepart_incorrect_content_md5_enabled)
add_net_test_case(test_s3_put_object_singlepart_incorrect_content_md5_disabled)
add_net_test_case(test_s3_put_object_multipart_no_content_md5_enabled)
add_net_test_case(test_s3_put_object_multipart_no_content_md5_disabled)
add_net_test_case(test_s3_put_object_multipart_correct_content_md5_enabled)
add_net_test_case(test_s3_put_object_multipart_correct_content_md5_disabled)
add_net_test_case(test_s3_put_object_multipart_incorrect_content_md5_enabled)
add_net_test_case(test_s3_put_object_multipart_incorrect_content_md5_disabled)
add_net_test_case(test_s3_upload_part_message_with_content_md5)
add_net_test_case(test_s3_upload_part_message_without_content_md5)
add_net_test_case(test_s3_create_multipart_upload_message_with_content_md5)
add_net_test_case(test_s3_complete_multipart_message_with_content_md5)
add_net_test_case(test_s3_put_object_double_slashes)
add_net_test_case(test_s3_get_object_less_than_part_size_mrap)
add_net_test_case(test_s3_get_object_multipart_mrap)
add_net_test_case(test_s3_put_object_less_than_part_size_mrap)
add_net_test_case(test_s3_put_object_multipart_mrap)

add_net_test_case(test_s3_round_trip)
add_net_test_case(test_s3_round_trip_default_get)
add_net_test_case(test_s3_round_trip_multipart_get_fc)
add_net_test_case(test_s3_round_trip_default_get_fc)
add_net_test_case(test_s3_round_trip_mpu_multipart_get_fc)
add_net_test_case(test_s3_round_trip_mpu_default_get_fc)
add_net_test_case(test_s3_chunked_then_unchunked)

add_net_test_case(test_s3_cancel_mpu_one_part_completed_fc)
add_net_test_case(test_s3_cancel_mpd_one_part_completed_fc)

add_net_test_case(test_s3_meta_request_default)
add_net_test_case(test_s3_put_object_fail_headers_callback)
add_net_test_case(test_s3_put_object_fail_body_callback)
add_net_test_case(test_s3_get_object_fail_headers_callback)
add_net_test_case(test_s3_get_object_fail_body_callback)
add_net_test_case(test_s3_default_fail_headers_callback)
add_net_test_case(test_s3_default_invoke_headers_callback_on_error)
add_net_test_case(test_s3_default_invoke_headers_callback_cancels_on_error)
add_net_test_case(test_s3_get_object_invoke_headers_callback_on_error)
add_net_test_case(test_s3_put_object_invoke_headers_callback_on_error)
add_net_test_case(test_s3_put_object_invoke_headers_callback_on_error_with_user_cancellation)
add_net_test_case(test_s3_default_fail_body_callback)
add_net_test_case(test_s3_error_missing_file)
add_net_test_case(test_s3_existing_host_entry)
add_net_test_case(test_s3_put_fail_object_invalid_request)
add_net_test_case(test_s3_put_fail_object_inputstream_fail_reading)
add_net_test_case(test_s3_put_single_part_fail_object_inputstream_fail_reading)
add_net_test_case(test_s3_put_object_clamp_part_size)
add_net_test_case(test_s3_auto_ranged_get_sending_user_agent)
add_net_test_case(test_s3_auto_ranged_put_sending_user_agent)
add_net_test_case(test_s3_default_sending_meta_request_user_agent)
add_net_test_case(test_s3_range_requests)
add_net_test_case(test_s3_not_satisfiable_range)

add_net_test_case(test_s3_bad_endpoint)
add_net_test_case(test_s3_different_endpoints)

add_test_case(test_s3_replace_quote_entities)
add_test_case(test_s3_strip_quotes)
add_test_case(test_s3_parse_content_range_response_header)
add_test_case(test_s3_parse_content_length_response_header)
add_test_case(test_s3_get_num_parts_and_get_part_range)
add_test_case(test_add_user_agent_header)

add_test_case(test_get_existing_compute_platform_info)
add_test_case(test_get_nonexistent_compute_platform_info)

add_net_test_case(sha1_nist_test_case_1)
add_net_test_case(sha1_nist_test_case_2)
add_net_test_case(sha1_nist_test_case_3)
add_net_test_case(sha1_nist_test_case_4)
add_net_test_case(sha1_nist_test_case_5)
add_net_test_case(sha1_nist_test_case_5_truncated)
add_net_test_case(sha1_nist_test_case_6)
add_net_test_case(sha1_test_invalid_buffer)
add_net_test_case(sha1_test_oneshot)
add_net_test_case(sha1_test_invalid_state)

add_net_test_case(sha256_nist_test_case_1)
add_net_test_case(sha256_nist_test_case_2)
add_net_test_case(sha256_nist_test_case_3)
add_net_test_case(sha256_nist_test_case_4)
add_net_test_case(sha256_nist_test_case_5)
add_net_test_case(sha256_nist_test_case_5_truncated)
add_net_test_case(sha256_nist_test_case_6)
add_net_test_case(sha256_test_invalid_buffer)
add_net_test_case(sha256_test_oneshot)
add_net_test_case(sha256_test_invalid_state)

add_test_case(crc32_nist_test_case_1)
add_test_case(crc32_nist_test_case_2)
add_test_case(crc32_nist_test_case_3)
add_test_case(crc32_nist_test_case_4)
add_test_case(crc32_nist_test_case_5)
add_test_case(crc32_nist_test_case_5_truncated)
add_test_case(crc32_nist_test_case_6)
add_test_case(crc32_test_invalid_buffer)
add_test_case(crc32_test_oneshot)
add_test_case(crc32_test_invalid_state)

add_test_case(crc32c_nist_test_case_1)
add_test_case(crc32c_nist_test_case_2)
add_test_case(crc32c_nist_test_case_3)
add_test_case(crc32c_nist_test_case_4)
add_test_case(crc32c_nist_test_case_5)
add_test_case(crc32c_nist_test_case_5_truncated)
add_test_case(crc32c_nist_test_case_6)
add_test_case(crc32c_test_invalid_buffer)
add_test_case(crc32c_test_oneshot)
add_test_case(crc32c_test_invalid_state)

add_net_test_case(verify_checksum_stream)
add_net_test_case(verify_chunk_stream)
add_net_test_case(test_s3_copy_small_object)
add_net_test_case(test_s3_copy_small_object_special_char)
add_net_test_case(test_s3_multipart_copy_large_object_special_char)
add_net_test_case(test_s3_multipart_copy_large_object)
add_net_test_case(test_s3_copy_object_invalid_source_key)
add_net_test_case(test_s3_put_pause_resume)
add_net_test_case(test_s3_put_pause_resume_all_parts_done)
add_net_test_case(test_s3_put_pause_resume_invalid_checksum)
add_net_test_case(test_s3_copy_source_prefixed_by_slash)
add_net_test_case(test_s3_copy_source_prefixed_by_slash_multipart)

add_test_case(test_s3_list_bucket_init_mem_safety)
add_test_case(test_s3_list_bucket_init_mem_safety_optional_copies)
add_net_test_case(test_s3_list_bucket_valid)

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