Skip to content

Commit 088e72a

Browse files
authored
Fixed Transfer Download with assertion failed on empty object
1 parent 242fede commit 088e72a

File tree

2 files changed

+88
-22
lines changed

2 files changed

+88
-22
lines changed

aws-cpp-sdk-transfer-tests/TransferTests.cpp

Lines changed: 86 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ static const char* SMALL_FILE_KEY = "SmallFileKey";
6161
static const char* MEDIUM_TEST_FILE_NAME = "MedTransferTestFile.txt";
6262
static const char* MEDIUM_FILE_KEY = "MediumFileKey";
6363

64+
static const char* EMPTY_TEST_FILE_NAME = "EmptyTransferTestFile.txt";
65+
static const char* EMPTY_FILE_KEY = "EmptyFileKey";
66+
6467
static const char* MULTI_PART_CONTENT_FILE = "MultiContentTransferTestFile.txt";
6568
static const char* MULTI_PART_CONTENT_KEY = "MultiContentKey";
6669
static const char* MULTI_PART_CONTENT_TEXT = "This is a test..##";
@@ -294,7 +297,7 @@ class TransferTests : public ::testing::Test
294297
auto copyMetadata = metadata;
295298
// ETag will be added to Metadata when finished uploading/downloading
296299
copyMetadata["ETag"] = downloadPtr->GetMetadata().find("ETag")->second;
297-
ASSERT_TRUE(copyMetadata == downloadPtr->GetMetadata());
300+
ASSERT_EQ(copyMetadata, downloadPtr->GetMetadata());
298301
}
299302

300303
Aws::FileSystem::RemoveFileIfExists(downloadFileName.c_str());
@@ -515,8 +518,8 @@ TEST_F(TransferTests, TransferManager_SinglePartUploadTest)
515518
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
516519

517520
uint64_t fileSize = requestPtr->GetBytesTotalSize();
518-
ASSERT_TRUE(fileSize == (MB5 / testStrLen * testStrLen));
519-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
521+
ASSERT_EQ(fileSize, (MB5 / testStrLen * testStrLen));
522+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
520523

521524
HeadObjectRequest headObjectRequest;
522525
headObjectRequest.WithBucket(GetTestBucketName())
@@ -532,6 +535,68 @@ TEST_F(TransferTests, TransferManager_SinglePartUploadTest)
532535
Aws::Map<Aws::String, Aws::String>());
533536
}
534537

538+
TEST_F(TransferTests, TransferManager_EmptyFileTest)
539+
{
540+
Aws::String emptyTestFileName = MakeFilePath(EMPTY_TEST_FILE_NAME);
541+
ScopedTestFile testFile(emptyTestFileName, 0, testString);
542+
543+
if (EmptyBucket(GetTestBucketName()))
544+
{
545+
WaitForBucketToEmpty(GetTestBucketName());
546+
}
547+
548+
GetObjectRequest getObjectRequest;
549+
getObjectRequest.SetBucket(GetTestBucketName());
550+
getObjectRequest.SetKey(EMPTY_FILE_KEY);
551+
552+
GetObjectOutcome getObjectOutcome = m_s3Client->GetObject(getObjectRequest);
553+
EXPECT_FALSE(getObjectOutcome.IsSuccess());
554+
555+
ListMultipartUploadsRequest listMultipartRequest;
556+
listMultipartRequest.SetBucket(GetTestBucketName());
557+
558+
AWS_LOGSTREAM_DEBUG("TransferTests", "*******************************")
559+
560+
561+
TransferManagerConfiguration transferManagerConfig(m_executor.get());
562+
transferManagerConfig.s3Client = m_s3Client;
563+
auto transferManager = TransferManager::Create(transferManagerConfig);
564+
565+
std::shared_ptr<TransferHandle> requestPtr = transferManager->UploadFile(emptyTestFileName, GetTestBucketName(), EMPTY_FILE_KEY, "text/plain", Aws::Map<Aws::String, Aws::String>());
566+
567+
ASSERT_EQ(true, requestPtr->ShouldContinue());
568+
ASSERT_EQ(TransferDirection::UPLOAD, requestPtr->GetTransferDirection());
569+
ASSERT_STREQ(emptyTestFileName.c_str(), requestPtr->GetTargetFilePath().c_str());
570+
requestPtr->WaitUntilFinished();
571+
572+
ASSERT_EQ(TransferStatus::COMPLETED, requestPtr->GetStatus());
573+
ASSERT_EQ(1u, requestPtr->GetCompletedParts().size());
574+
ASSERT_EQ(0u, requestPtr->GetFailedParts().size());
575+
ASSERT_EQ(0u, requestPtr->GetPendingParts().size());
576+
ASSERT_EQ(0u, requestPtr->GetQueuedParts().size());
577+
578+
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
579+
580+
uint64_t fileSize = requestPtr->GetBytesTotalSize();
581+
ASSERT_EQ(0u, fileSize);
582+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
583+
584+
HeadObjectRequest headObjectRequest;
585+
headObjectRequest.WithBucket(GetTestBucketName())
586+
.WithKey(EMPTY_FILE_KEY);
587+
588+
auto outcome = m_s3Client->HeadObject(headObjectRequest);
589+
590+
ASSERT_TRUE(outcome.IsSuccess());
591+
ASSERT_STREQ(requestPtr->GetContentType().c_str(), outcome.GetResult().GetContentType().c_str());
592+
593+
VerifyUploadedFile(*transferManager,
594+
emptyTestFileName,
595+
GetTestBucketName(),
596+
EMPTY_FILE_KEY,
597+
"text/plain",
598+
Aws::Map<Aws::String, Aws::String>());
599+
}
535600

536601
TEST_F(TransferTests, TransferManager_SmallTest)
537602
{
@@ -576,8 +641,8 @@ TEST_F(TransferTests, TransferManager_SmallTest)
576641
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
577642

578643
uint64_t fileSize = requestPtr->GetBytesTotalSize();
579-
ASSERT_TRUE(fileSize == (SMALL_TEST_SIZE / testStrLen * testStrLen));
580-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
644+
ASSERT_EQ(fileSize, (SMALL_TEST_SIZE / testStrLen * testStrLen));
645+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
581646

582647
HeadObjectRequest headObjectRequest;
583648
headObjectRequest.WithBucket(GetTestBucketName())
@@ -637,8 +702,8 @@ TEST_F(TransferTests, TransferManager_ContentTest)
637702
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
638703

639704
uint64_t fileSize = requestPtr->GetBytesTotalSize();
640-
ASSERT_TRUE(fileSize == strlen(CONTENT_TEST_FILE_TEXT));
641-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
705+
ASSERT_EQ(fileSize, strlen(CONTENT_TEST_FILE_TEXT));
706+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
642707

643708
HeadObjectRequest headObjectRequest;
644709
headObjectRequest.WithBucket(GetTestBucketName())
@@ -821,8 +886,8 @@ TEST_F(TransferTests, TransferManager_MediumTest)
821886
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
822887

823888
uint64_t fileSize = requestPtr->GetBytesTotalSize();
824-
ASSERT_TRUE(fileSize == MEDIUM_TEST_SIZE / testStrLen * testStrLen);
825-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
889+
ASSERT_EQ(fileSize, MEDIUM_TEST_SIZE / testStrLen * testStrLen);
890+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
826891

827892
HeadObjectRequest headObjectRequest;
828893
headObjectRequest.WithBucket(GetTestBucketName())
@@ -886,8 +951,8 @@ TEST_F(TransferTests, TransferManager_BigTest)
886951
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
887952

888953
uint64_t fileSize = requestPtr->GetBytesTotalSize();
889-
ASSERT_TRUE(fileSize == BIG_TEST_SIZE / testStrLen * testStrLen);
890-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
954+
ASSERT_EQ(fileSize, BIG_TEST_SIZE / testStrLen * testStrLen);
955+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
891956

892957
HeadObjectRequest headObjectRequest;
893958
headObjectRequest.WithBucket(GetTestBucketName())
@@ -950,8 +1015,8 @@ TEST_F(TransferTests, TransferManager_UnicodeFileNameTest)
9501015
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
9511016

9521017
uint64_t fileSize = requestPtr->GetBytesTotalSize();
953-
ASSERT_TRUE(fileSize == MEDIUM_TEST_SIZE / testStrLen * testStrLen);
954-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
1018+
ASSERT_EQ(fileSize, MEDIUM_TEST_SIZE / testStrLen * testStrLen);
1019+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
9551020

9561021
HeadObjectRequest headObjectRequest;
9571022
headObjectRequest.WithBucket(GetTestBucketName())
@@ -1066,7 +1131,7 @@ TEST_F(TransferTests, TransferManager_CancelAndRetryUploadTest)
10661131
ASSERT_TRUE(completedPartsStayedCompletedDuringRetry);
10671132
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
10681133

1069-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
1134+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
10701135

10711136
listMultipartOutcome = m_s3Client->ListMultipartUploads(listMultipartRequest);
10721137

@@ -1176,7 +1241,7 @@ TEST_F(TransferTests, TransferManager_AbortAndRetryUploadTest)
11761241
ASSERT_EQ(30u, requestPtr->GetCompletedParts().size());
11771242
ASSERT_TRUE(completionCheckDone);
11781243
ASSERT_FALSE(completedPartsStayedCompletedDuringRetry);
1179-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
1244+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
11801245

11811246
headObjectRequest.WithBucket(GetTestBucketName())
11821247
.WithKey(CANCEL_FILE_KEY);
@@ -1227,7 +1292,7 @@ TEST_F(TransferTests, TransferManager_MultiPartContentTest)
12271292

12281293
ASSERT_EQ(TransferStatus::COMPLETED, requestPtr->GetStatus());
12291294
ASSERT_EQ(PARTS_IN_MEDIUM_TEST, requestPtr->GetCompletedParts().size()); // > 1 part
1230-
ASSERT_TRUE(requestPtr->GetBytesTotalSize() == requestPtr->GetBytesTransferred());
1295+
ASSERT_EQ(requestPtr->GetBytesTotalSize(), requestPtr->GetBytesTransferred());
12311296

12321297
VerifyUploadedFile(*transferManager,
12331298
multiPartContentFileName,
@@ -1267,7 +1332,7 @@ TEST_F(TransferTests, TransferManager_SinglePartUploadWithMetadataTest)
12671332

12681333
requestPtr->WaitUntilFinished();
12691334
ASSERT_EQ(TransferStatus::COMPLETED, requestPtr->GetStatus());
1270-
ASSERT_TRUE(requestPtr->GetBytesTotalSize() == requestPtr->GetBytesTransferred());
1335+
ASSERT_EQ(requestPtr->GetBytesTotalSize(), requestPtr->GetBytesTransferred());
12711336

12721337
// Check the metadata matches
12731338
HeadObjectRequest headObjectRequest;
@@ -1332,7 +1397,7 @@ TEST_F(TransferTests, MultipartUploadWithMetadataTest)
13321397
requestPtr->WaitUntilFinished();
13331398
}
13341399
ASSERT_EQ(TransferStatus::COMPLETED, requestPtr->GetStatus());
1335-
ASSERT_TRUE(requestPtr->GetBytesTotalSize() == requestPtr->GetBytesTransferred());
1400+
ASSERT_EQ(requestPtr->GetBytesTotalSize(), requestPtr->GetBytesTransferred());
13361401

13371402
// Check the metadata matches
13381403
HeadObjectRequest headObjectRequest;
@@ -1468,7 +1533,7 @@ TEST_F(TransferTests, TransferManager_CancelAndRetryDownloadTest)
14681533
ASSERT_TRUE(completedPartsStayedCompletedDuringRetry);
14691534
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
14701535

1471-
ASSERT_TRUE(requestPtr->GetBytesTotalSize() == requestPtr->GetBytesTransferred());
1536+
ASSERT_EQ(requestPtr->GetBytesTotalSize(), requestPtr->GetBytesTransferred());
14721537

14731538
ASSERT_TRUE(AreFilesSame(downloadFileName, cancelTestFileName));
14741539
}
@@ -1536,8 +1601,8 @@ TEST_F(TransferTests, TransferManager_MediumVersionedTest)
15361601
ASSERT_STREQ("text/plain", requestPtr->GetContentType().c_str());
15371602
15381603
uint64_t fileSize = requestPtr->GetBytesTotalSize();
1539-
ASSERT_TRUE(fileSize == MEDIUM_TEST_SIZE / testStrLen * testStrLen);
1540-
ASSERT_TRUE(fileSize == requestPtr->GetBytesTransferred());
1604+
ASSERT_EQ(fileSize, MEDIUM_TEST_SIZE / testStrLen * testStrLen);
1605+
ASSERT_EQ(fileSize, requestPtr->GetBytesTransferred());
15411606
15421607
HeadObjectRequest headObjectRequest;
15431608
headObjectRequest.WithBucket(GetTestBucketName())

aws-cpp-sdk-transfer/source/transfer/TransferManager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,8 @@ namespace Aws
623623
handle->SetVersionId(headObjectOutcome.GetResult().GetVersionId());
624624
}
625625

626-
std::size_t partCount = ( downloadSize + bufferSize - 1 ) / bufferSize;
626+
// For empty file, we create 1 part here to make downloading behaviors consistent for files with different size.
627+
std::size_t partCount = (std::max)((downloadSize + bufferSize - 1) / bufferSize, static_cast<std::size_t>(1));
627628
handle->SetIsMultipart(partCount > 1); // doesn't make a difference but let's be accurate
628629

629630
for(std::size_t i = 0; i < partCount; ++i)

0 commit comments

Comments
 (0)