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
1922using namespace Aws ;
2023using namespace Aws ::S3;
2124using namespace Aws ::S3::Model;
2225
2326namespace {
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
2934class ListObjectsV2PaginationTest : public Aws ::Testing::AwsCppSdkGTestSuite {
3035protected:
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