@@ -655,6 +655,58 @@ class ResumableObjectTest : public::testing::Test {
655655 EXPECT_EQ (RemoveDirectory (checkpointKey), true );
656656 }
657657
658+ TEST_F (ResumableObjectTest, NormalResumableUploadRetryWithUploadIdAbortTest)
659+ {
660+ std::string key = TestUtils::GetObjectKey (" NormalResumableUploadRetryWithUploadIdAbortTest" );
661+ std::string tmpFile = TestUtils::GetTargetFileName (" NormalResumableUploadRetryWithUploadIdAbortTest" ).append (" .tmp" );
662+ int num = 2 + rand () % 10 ;
663+ TestUtils::WriteRandomDatatoFile (tmpFile, 1024 * 100 * num);
664+ std::string sourceFileMd5 = TestUtils::GetFileMd5 (tmpFile);
665+ std::string checkpointKey = TestUtils::GetObjectKey (" checkpoint" );
666+ EXPECT_EQ (CreateDirectory (checkpointKey), true );
667+ EXPECT_EQ (IsDirectoryExist (checkpointKey), true );
668+
669+ // resumable upload object failed
670+ UploadObjectRequest request (BucketName, key, tmpFile);
671+ request.setThreadNum (1 );
672+ request.setPartSize (102400 );
673+ request.setFlags (request.Flags () | UploadPartFailedFlag);
674+ request.setCheckpointDir (checkpointKey);
675+ auto outcome = Client->ResumableUploadObject (request);
676+ EXPECT_EQ (outcome.isSuccess (), false );
677+
678+ // abort upload Id
679+ ListMultipartUploadsRequest lmuRequest (BucketName);
680+ lmuRequest.setPrefix (key);
681+ auto lmuOutcome = Client->ListMultipartUploads (lmuRequest);
682+ EXPECT_EQ (lmuOutcome.isSuccess (), true );
683+ EXPECT_EQ (lmuOutcome.result ().MultipartUploadList ().size (), 1L );
684+ auto uploadId = lmuOutcome.result ().MultipartUploadList ()[0 ].UploadId ;
685+ AbortMultipartUploadRequest abortRequest (BucketName, key, uploadId);
686+ auto abortOutcome = Client->AbortMultipartUpload (abortRequest);
687+ EXPECT_EQ (abortOutcome.isSuccess (), true );
688+
689+ // retry
690+ request.setFlags (request.Flags () ^ UploadPartFailedFlag);
691+ auto retryOutcome = Client->ResumableUploadObject (request);
692+ EXPECT_EQ (retryOutcome.isSuccess (), true );
693+ EXPECT_EQ (Client->DoesObjectExist (BucketName, key), true );
694+
695+ // download target object
696+ std::string targetFile = TestUtils::GetObjectKey (" DownloadResumableUploadObject" );
697+ auto getObjectOutcome = Client->GetObject (BucketName, key, targetFile);
698+ std::shared_ptr<std::iostream> getObjectContent = nullptr ;
699+ getObjectOutcome.result ().setContent (getObjectContent);
700+ EXPECT_EQ (getObjectOutcome.isSuccess (), true );
701+
702+ std::string targetFileMd5 = TestUtils::GetFileMd5 (targetFile);
703+ EXPECT_EQ (targetFileMd5, sourceFileMd5);
704+
705+ EXPECT_EQ (RemoveFile (tmpFile), true );
706+ EXPECT_EQ (RemoveFile (targetFile), true );
707+ EXPECT_EQ (RemoveDirectory (checkpointKey), true );
708+ }
709+
658710 TEST_F (ResumableObjectTest, NormalResumableUploadWithProgressCallbackTest)
659711 {
660712 std::string key = TestUtils::GetObjectKey (" NormalResumableUploadObjectWithCallback" );
@@ -2074,6 +2126,45 @@ class ResumableObjectTest : public::testing::Test {
20742126 EXPECT_EQ (RemoveDirectory (checkpointDir), true );
20752127 }
20762128
2129+
2130+ TEST_F (ResumableObjectTest, NormalResumableCopyRetryWithUploadAbortTest)
2131+ {
2132+ std::string sourceKey = TestUtils::GetObjectKey (" NormalResumableCopyRetryWithUploadAbortTest" );
2133+ std::string targetKey = TestUtils::GetObjectKey (" NormalResumableCopyRetryWithUploadAbortTest-target" );
2134+ std::string checkpointDir = TestUtils::GetTargetFileName (" checkpoint" );
2135+ EXPECT_EQ (CreateDirectory (checkpointDir), true );
2136+ EXPECT_EQ (IsDirectoryExist (checkpointDir), true );
2137+
2138+ auto putObjectContent = TestUtils::GetRandomStream (102400 * (2 + rand () % 10 ));
2139+ auto putObjectOutcome = Client->PutObject (BucketName, sourceKey, putObjectContent);
2140+ EXPECT_EQ (putObjectOutcome.isSuccess (), true );
2141+ EXPECT_EQ (Client->DoesObjectExist (BucketName, sourceKey), true );
2142+
2143+ MultiCopyObjectRequest request (BucketName, targetKey, BucketName, sourceKey, checkpointDir, 102401 , 1 );
2144+ request.setFlags (request.Flags () | CopyPartFailedFlag);
2145+ auto outcome = Client->ResumableCopyObject (request);
2146+ EXPECT_EQ (outcome.isSuccess (), false );
2147+ EXPECT_EQ (Client->DoesObjectExist (BucketName, targetKey), false );
2148+
2149+ // abort upload Id
2150+ ListMultipartUploadsRequest lmuRequest (BucketName);
2151+ lmuRequest.setPrefix (targetKey);
2152+ auto lmuOutcome = Client->ListMultipartUploads (lmuRequest);
2153+ EXPECT_EQ (lmuOutcome.isSuccess (), true );
2154+ EXPECT_EQ (lmuOutcome.result ().MultipartUploadList ().size (), 1L );
2155+ auto uploadId = lmuOutcome.result ().MultipartUploadList ()[0 ].UploadId ;
2156+ AbortMultipartUploadRequest abortRequest (BucketName, targetKey, uploadId);
2157+ auto abortOutcome = Client->AbortMultipartUpload (abortRequest);
2158+ EXPECT_EQ (abortOutcome.isSuccess (), true );
2159+
2160+ // retry
2161+ request.setFlags (request.Flags () ^ CopyPartFailedFlag);
2162+ auto retryOutcome = Client->ResumableCopyObject (request);
2163+ EXPECT_EQ (retryOutcome.isSuccess (), true );
2164+ EXPECT_EQ (Client->DoesObjectExist (BucketName, targetKey), true );
2165+ EXPECT_EQ (RemoveDirectory (checkpointDir), true );
2166+ }
2167+
20772168 TEST_F (ResumableObjectTest, NormalResumableCopyWithProgressCallbackTest)
20782169 {
20792170 std::string sourceKey = TestUtils::GetObjectKey (" NormalDownloadSourceObjectWithProgressCallback" );
0 commit comments