@@ -442,6 +442,93 @@ static void s_after_prepare_upload_part_finish(struct aws_s3_request *request) {
442442 }
443443}
444444
445+ /**
446+ * This test is built for
447+ * 1. The retry happens before the upload has finished.
448+ */
449+ TEST_CASE (multipart_upload_checksum_with_retry_before_finish_mock_server ) {
450+ (void )ctx ;
451+ struct aws_s3_tester tester ;
452+ ASSERT_SUCCESS (aws_s3_tester_init (allocator , & tester ));
453+ struct aws_s3_tester_client_options client_options = {
454+ .part_size = MB_TO_BYTES (5 ),
455+ .tls_usage = AWS_S3_TLS_DISABLED ,
456+ };
457+
458+ struct aws_s3_client * client = NULL ;
459+ ASSERT_SUCCESS (aws_s3_tester_client_new (& tester , & client_options , & client ));
460+ struct aws_s3_client_vtable * patched_client_vtable = aws_s3_tester_patch_client_vtable (& tester , client , NULL );
461+ patched_client_vtable -> after_prepare_upload_part_finish = s_after_prepare_upload_part_finish ;
462+
463+ struct aws_byte_cursor object_path = aws_byte_cursor_from_c_str ("/throttle_before_finish" );
464+ {
465+ /* 1. Trailer checksum */
466+ struct aws_s3_tester_meta_request_options put_options = {
467+ .allocator = allocator ,
468+ .meta_request_type = AWS_S3_META_REQUEST_TYPE_PUT_OBJECT ,
469+ .client = client ,
470+ .checksum_algorithm = AWS_SCA_CRC32 ,
471+ .validate_get_response_checksum = false,
472+ .put_options =
473+ {
474+ .object_size_mb = 10 ,
475+ .object_path_override = object_path ,
476+ .sleep_before_read_secs = 1 ,
477+ },
478+ .mock_server = true,
479+ };
480+
481+ struct aws_s3_meta_request_test_results meta_request_test_results ;
482+ aws_s3_meta_request_test_results_init (& meta_request_test_results , allocator );
483+
484+ ASSERT_SUCCESS (aws_s3_tester_send_meta_request_with_options (& tester , & put_options , & meta_request_test_results ));
485+
486+ ASSERT_INT_EQUALS (meta_request_test_results .upload_review .part_count , 2 );
487+ /* Note: the data we currently generate is always the same,
488+ * so make sure that retry does not mangle the data by checking the checksum value */
489+ ASSERT_STR_EQUALS (
490+ "7/xUXw==" , aws_string_c_str (meta_request_test_results .upload_review .part_checksums_array [0 ]));
491+ ASSERT_STR_EQUALS (
492+ "PCOjcw==" , aws_string_c_str (meta_request_test_results .upload_review .part_checksums_array [1 ]));
493+ aws_s3_meta_request_test_results_clean_up (& meta_request_test_results );
494+ }
495+ {
496+ /* 2. header checksum */
497+ struct aws_s3_tester_meta_request_options put_options = {
498+ .allocator = allocator ,
499+ .meta_request_type = AWS_S3_META_REQUEST_TYPE_PUT_OBJECT ,
500+ .client = client ,
501+ .checksum_algorithm = AWS_SCA_CRC32 ,
502+ .checksum_via_header = true,
503+ .validate_get_response_checksum = false,
504+ .put_options =
505+ {
506+ .object_size_mb = 10 ,
507+ .object_path_override = object_path ,
508+ },
509+ .mock_server = true,
510+ };
511+
512+ struct aws_s3_meta_request_test_results meta_request_test_results ;
513+ aws_s3_meta_request_test_results_init (& meta_request_test_results , allocator );
514+
515+ ASSERT_SUCCESS (aws_s3_tester_send_meta_request_with_options (& tester , & put_options , & meta_request_test_results ));
516+
517+ ASSERT_INT_EQUALS (meta_request_test_results .upload_review .part_count , 2 );
518+ /* Note: the data we currently generate is always the same,
519+ * so make sure that retry does not mangle the data by checking the checksum value */
520+ ASSERT_STR_EQUALS (
521+ "7/xUXw==" , aws_string_c_str (meta_request_test_results .upload_review .part_checksums_array [0 ]));
522+ ASSERT_STR_EQUALS (
523+ "PCOjcw==" , aws_string_c_str (meta_request_test_results .upload_review .part_checksums_array [1 ]));
524+ aws_s3_meta_request_test_results_clean_up (& meta_request_test_results );
525+ }
526+ aws_s3_client_release (client );
527+ aws_s3_tester_clean_up (& tester );
528+
529+ return AWS_OP_SUCCESS ;
530+ }
531+
445532/**
446533 * This test is built for
447534 * 1. We had a memory leak when the retry was triggered and the checksum was calculated.
0 commit comments