Skip to content

Commit 661e748

Browse files
committed
literally copy bucket integration test
1 parent bb186b3 commit 661e748

1 file changed

Lines changed: 126 additions & 40 deletions

File tree

tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp

Lines changed: 126 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,68 @@
1-
/*
1+
/**
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0.
44
*/
55

66
#include <aws/testing/AwsCppSdkGTestSuite.h>
7+
#include <aws/testing/AwsTestHelpers.h>
8+
#include <aws/core/auth/AWSCredentialsProviderChain.h>
79
#include <aws/core/client/ClientConfiguration.h>
8-
#include <aws/core/Aws.h>
10+
#include <aws/core/utils/memory/stl/AWSStringStream.h>
911
#include <aws/s3/S3Client.h>
1012
#include <aws/s3/model/CreateBucketRequest.h>
1113
#include <aws/s3/model/DeleteBucketRequest.h>
14+
#include <aws/s3/model/HeadBucketRequest.h>
1215
#include <aws/s3/model/DeleteObjectRequest.h>
1316
#include <aws/s3/model/PutObjectRequest.h>
1417
#include <aws/s3/model/ListObjectsV2Request.h>
1518
#include <aws/s3/model/pagination/ListObjectsV2PaginationTraits.h>
16-
#include <aws/core/utils/memory/stl/AWSStringStream.h>
17-
#include <aws/testing/AwsTestHelpers.h>
19+
#include <aws/s3/model/PutBucketTaggingRequest.h>
20+
#include <thread>
1821

1922
using namespace Aws;
2023
using namespace Aws::S3;
2124
using namespace Aws::S3::Model;
2225

2326
namespace {
2427
static const char* ALLOCATION_TAG = "ListObjectsV2PaginationTest";
28+
static const char* TEST_BUCKET_TAG = "IntegrationTestResource";
29+
static const int TIMEOUT_MAX = 20;
2530
const size_t OBJECT_COUNT = 15;
2631
const size_t MAX_KEYS = 3;
2732
}
2833

2934
class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite {
3035
protected:
31-
std::shared_ptr<S3Client> s3Client;
36+
std::shared_ptr<S3Client> Client;
3237
Aws::String bucketName;
3338
Aws::String emptyBucketName;
3439

3540
void SetUp() override {
36-
Aws::SDKOptions options;
37-
Aws::InitAPI(options);
41+
Aws::Client::ClientConfiguration config;
42+
config.region = Aws::Region::US_EAST_1;
43+
config.scheme = Aws::Http::Scheme::HTTPS;
44+
config.connectTimeoutMs = 30000;
45+
config.requestTimeoutMs = 30000;
3846

39-
s3Client = Aws::MakeShared<S3Client>(ALLOCATION_TAG);
47+
Client = Aws::MakeShared<S3Client>(ALLOCATION_TAG, config);
48+
4049
bucketName = CalculateBucketName("listobjectsv2paginationtest");
4150
emptyBucketName = CalculateBucketName("listobjectsv2emptytest");
4251

4352
CreateBucketRequest createRequest;
4453
createRequest.SetBucket(bucketName);
45-
s3Client->CreateBucket(createRequest);
54+
createRequest.SetACL(BucketCannedACL::private_);
55+
auto createOutcome = Client->CreateBucket(createRequest);
56+
AWS_ASSERT_SUCCESS(createOutcome);
4657

4758
createRequest.SetBucket(emptyBucketName);
48-
s3Client->CreateBucket(createRequest);
59+
createOutcome = Client->CreateBucket(createRequest);
60+
AWS_ASSERT_SUCCESS(createOutcome);
61+
62+
ASSERT_TRUE(WaitForBucketToPropagate(bucketName));
63+
ASSERT_TRUE(WaitForBucketToPropagate(emptyBucketName));
64+
TagTestBucket(bucketName);
65+
TagTestBucket(emptyBucketName);
4966

5067
// Create test objects
5168
for (size_t i = 1; i <= OBJECT_COUNT; ++i) {
@@ -56,31 +73,99 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite {
5673
}
5774

5875
void TearDown() override {
59-
// Delete all objects
60-
ListObjectsV2Request listRequest;
61-
listRequest.SetBucket(bucketName);
62-
auto listOutcome = s3Client->ListObjectsV2(listRequest);
63-
if (listOutcome.IsSuccess()) {
64-
for (const auto& object : listOutcome.GetResult().GetContents()) {
65-
DeleteObjectRequest deleteRequest;
66-
deleteRequest.SetBucket(bucketName);
67-
deleteRequest.SetKey(object.GetKey());
68-
s3Client->DeleteObject(deleteRequest);
76+
DeleteBucket(bucketName);
77+
DeleteBucket(emptyBucketName);
78+
Client = nullptr;
79+
}
80+
81+
static void TagTestBucket(const Aws::String& bucketName, const std::shared_ptr<S3Client>& client) {
82+
ASSERT_TRUE(!bucketName.empty());
83+
ASSERT_TRUE(client);
84+
85+
PutBucketTaggingRequest taggingRequest;
86+
taggingRequest.SetBucket(bucketName);
87+
Tag tag;
88+
tag.SetKey(TEST_BUCKET_TAG);
89+
tag.SetValue(TEST_BUCKET_TAG);
90+
Tagging tagging;
91+
tagging.AddTagSet(tag);
92+
taggingRequest.SetTagging(tagging);
93+
94+
auto taggingOutcome = client->PutBucketTagging(taggingRequest);
95+
AWS_ASSERT_SUCCESS(taggingOutcome);
96+
}
97+
98+
void TagTestBucket(const Aws::String& bucketNameParam) {
99+
TagTestBucket(bucketNameParam, Client);
100+
}
101+
102+
bool WaitForBucketToPropagate(const Aws::String& bucketNameParam) {
103+
unsigned timeoutCount = 0;
104+
while (timeoutCount++ < TIMEOUT_MAX) {
105+
ListObjectsV2Request listRequest;
106+
listRequest.SetBucket(bucketNameParam);
107+
auto listOutcome = Client->ListObjectsV2(listRequest);
108+
if (listOutcome.IsSuccess()) {
109+
return true;
69110
}
111+
std::this_thread::sleep_for(std::chrono::seconds(10));
112+
}
113+
return false;
114+
}
115+
116+
void EmptyBucket(const Aws::String& bucketNameParam) {
117+
ListObjectsV2Request listObjectsRequest;
118+
listObjectsRequest.SetBucket(bucketNameParam);
119+
120+
ListObjectsV2Outcome listObjectsOutcome = Client->ListObjectsV2(listObjectsRequest);
121+
122+
if (!listObjectsOutcome.IsSuccess())
123+
return;
124+
125+
for (const auto& object : listObjectsOutcome.GetResult().GetContents()) {
126+
DeleteObjectRequest deleteObjectRequest;
127+
deleteObjectRequest.SetBucket(bucketNameParam);
128+
deleteObjectRequest.SetKey(object.GetKey());
129+
auto deleteObjectOutcome = Client->DeleteObject(deleteObjectRequest);
130+
AWS_ASSERT_SUCCESS(deleteObjectOutcome);
131+
}
132+
}
133+
134+
void WaitForBucketToEmpty(const Aws::String& bucketNameParam) {
135+
ListObjectsV2Request listObjectsRequest;
136+
listObjectsRequest.SetBucket(bucketNameParam);
137+
138+
unsigned checkForObjectsCount = 0;
139+
while (checkForObjectsCount++ < TIMEOUT_MAX) {
140+
ListObjectsV2Outcome listObjectsOutcome = Client->ListObjectsV2(listObjectsRequest);
141+
AWS_EXPECT_SUCCESS(listObjectsOutcome);
142+
143+
if (listObjectsOutcome.GetResult().GetContents().size() > 0) {
144+
std::this_thread::sleep_for(std::chrono::seconds(5));
145+
} else {
146+
break;
147+
}
148+
}
149+
}
150+
151+
void DeleteBucket(const Aws::String& bucketNameParam) {
152+
HeadBucketRequest headBucketRequest;
153+
headBucketRequest.SetBucket(bucketNameParam);
154+
HeadBucketOutcome bucketOutcome = Client->HeadBucket(headBucketRequest);
155+
156+
if (bucketOutcome.IsSuccess()) {
157+
EmptyBucket(bucketNameParam);
158+
WaitForBucketToEmpty(bucketNameParam);
159+
160+
DeleteBucketRequest deleteBucketRequest;
161+
deleteBucketRequest.SetBucket(bucketNameParam);
162+
163+
DeleteBucketOutcome deleteBucketOutcome = Client->DeleteBucket(deleteBucketRequest);
164+
AWS_EXPECT_SUCCESS(deleteBucketOutcome);
70165
}
71-
72-
DeleteBucketRequest deleteRequest;
73-
deleteRequest.SetBucket(bucketName);
74-
s3Client->DeleteBucket(deleteRequest);
75-
76-
deleteRequest.SetBucket(emptyBucketName);
77-
s3Client->DeleteBucket(deleteRequest);
78-
79-
Aws::SDKOptions options;
80-
Aws::ShutdownAPI(options);
81166
}
82167

83-
Aws::String CalculateBucketName(const Aws::String& bucketPrefix) {
168+
static Aws::String CalculateBucketName(const Aws::String& bucketPrefix) {
84169
return Aws::Testing::GetAwsResourcePrefix() + bucketPrefix;
85170
}
86171

@@ -93,7 +178,8 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite {
93178
*data << "Test data for " << key;
94179
putRequest.SetBody(data);
95180

96-
s3Client->PutObject(putRequest);
181+
auto putOutcome = Client->PutObject(putRequest);
182+
AWS_ASSERT_SUCCESS(putOutcome);
97183
}
98184
};
99185

@@ -103,7 +189,7 @@ TEST_F(ListObjectsV2PaginationTest, TestPaginationOnEmptyBucket) {
103189
request.SetMaxKeys(MAX_KEYS);
104190

105191
size_t objectCount = 0;
106-
auto outcome = s3Client->ListObjectsV2(request);
192+
auto outcome = Client->ListObjectsV2(request);
107193

108194
while (outcome.IsSuccess()) {
109195
const auto& result = outcome.GetResult();
@@ -114,10 +200,10 @@ TEST_F(ListObjectsV2PaginationTest, TestPaginationOnEmptyBucket) {
114200
}
115201

116202
Aws::S3::Pagination::ListObjectsV2PaginationTraits::SetNextRequest(result, request);
117-
outcome = s3Client->ListObjectsV2(request);
203+
outcome = Client->ListObjectsV2(request);
118204
}
119205

120-
ASSERT_TRUE(outcome.IsSuccess());
206+
AWS_ASSERT_SUCCESS(outcome);
121207
EXPECT_EQ(0u, objectCount);
122208
}
123209

@@ -128,7 +214,7 @@ TEST_F(ListObjectsV2PaginationTest, TestPaginationOnNonEmptyBucket) {
128214

129215
size_t objectCount = 0;
130216
size_t pageCount = 0;
131-
auto outcome = s3Client->ListObjectsV2(request);
217+
auto outcome = Client->ListObjectsV2(request);
132218

133219
while (outcome.IsSuccess()) {
134220
const auto& result = outcome.GetResult();
@@ -140,10 +226,10 @@ TEST_F(ListObjectsV2PaginationTest, TestPaginationOnNonEmptyBucket) {
140226
}
141227

142228
Aws::S3::Pagination::ListObjectsV2PaginationTraits::SetNextRequest(result, request);
143-
outcome = s3Client->ListObjectsV2(request);
229+
outcome = Client->ListObjectsV2(request);
144230
}
145231

146-
ASSERT_TRUE(outcome.IsSuccess());
232+
AWS_ASSERT_SUCCESS(outcome);
147233
EXPECT_EQ(OBJECT_COUNT, objectCount);
148234
EXPECT_GT(pageCount, 1u); // Should have multiple pages with MaxKeys=3
149235
}
@@ -156,8 +242,8 @@ TEST_F(ListObjectsV2PaginationTest, TestManualPaginationLoop) {
156242
Aws::Vector<Aws::String> allKeys;
157243

158244
do {
159-
auto outcome = s3Client->ListObjectsV2(request);
160-
ASSERT_TRUE(outcome.IsSuccess());
245+
auto outcome = Client->ListObjectsV2(request);
246+
AWS_ASSERT_SUCCESS(outcome);
161247

162248
const auto& result = outcome.GetResult();
163249
for (const auto& object : result.GetContents()) {

0 commit comments

Comments
 (0)