Skip to content

Commit 50262ba

Browse files
committed
Improved test reliability.
1. Allow integration tests to pass when using session credentials. In the process, some tests were deleted, but they were only validating behavior that was validated by other mean already. 2. Verify buckets exist before attempting to delete them.
1 parent 4d1a8b5 commit 50262ba

File tree

5 files changed

+35
-103
lines changed

5 files changed

+35
-103
lines changed

services/dynamodb/src/it/java/software/amazon/awssdk/services/dynamodb/DynamoDbJavaClientExceptionIntegrationTest.java

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,8 @@
1919
import junit.framework.Assert;
2020
import org.junit.BeforeClass;
2121
import org.junit.Test;
22-
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
23-
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
24-
import software.amazon.awssdk.awscore.exception.AwsServiceException;
25-
import software.amazon.awssdk.core.exception.SdkServiceException;
26-
import software.amazon.awssdk.regions.Region;
2722
import software.amazon.awssdk.services.dynamodb.model.DescribeTableRequest;
28-
import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;
2923
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
30-
import software.amazon.awssdk.services.sts.StsClient;
31-
import software.amazon.awssdk.services.sts.model.Credentials;
32-
import software.amazon.awssdk.services.sts.model.GetFederationTokenRequest;
3324
import software.amazon.awssdk.testutils.service.AwsTestBase;
3425

3526
/**
@@ -56,33 +47,4 @@ public void testResourceNotFoundException() {
5647
Assert.assertNotNull(e.awsErrorDetails().rawResponse());
5748
}
5849
}
59-
60-
@Test
61-
public void testPermissionError() {
62-
StsClient sts = StsClient.builder()
63-
.credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
64-
.region(Region.US_EAST_1)
65-
.build();
66-
67-
Credentials creds = sts.getFederationToken(GetFederationTokenRequest.builder()
68-
.name("NoAccess")
69-
.policy(
70-
"{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Deny\",\"Action\":\"*\",\"Resource\":\"*\"}]}")
71-
.durationSeconds(900).build()).credentials();
72-
73-
74-
DynamoDbClient client = DynamoDbClient.builder().credentialsProvider(
75-
StaticCredentialsProvider.create(AwsSessionCredentials.create(
76-
creds.accessKeyId(),
77-
creds.secretAccessKey(),
78-
creds.sessionToken()))).build();
79-
80-
try {
81-
client.listTables(ListTablesRequest.builder().build());
82-
} catch (AwsServiceException e) {
83-
Assert.assertEquals("AccessDeniedException", e.awsErrorDetails().errorCode());
84-
Assert.assertNotNull(e.awsErrorDetails().errorMessage());
85-
Assert.assertNotNull(e.getMessage());
86-
}
87-
}
8850
}

services/s3/src/it/java/software/amazon/awssdk/services/s3/utils/S3TestUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,20 @@
3030
import software.amazon.awssdk.services.s3.model.ListObjectsRequest;
3131
import software.amazon.awssdk.services.s3.model.ListObjectsResponse;
3232
import software.amazon.awssdk.services.s3.model.S3Object;
33+
import software.amazon.awssdk.testutils.Waiter;
3334
import software.amazon.awssdk.utils.BinaryUtils;
3435
import software.amazon.awssdk.utils.IoUtils;
3536

3637
public class S3TestUtils {
3738

3839
public static void deleteBucketAndAllContents(S3Client s3, String bucketName) {
40+
if (!Waiter.run(s3::listBuckets)
41+
.until(r -> r.buckets().stream().anyMatch(b -> b.name().equals(bucketName)))
42+
.orReturnFalse()) {
43+
// The bucket did not show up after 30 seconds, so it probably doesn't exist.
44+
return;
45+
}
46+
3947
System.out.println("Deleting S3 bucket: " + bucketName);
4048
ListObjectsResponse response = s3.listObjects(ListObjectsRequest.builder().bucket(bucketName).build());
4149
List<S3Object> objectListing = response.contents();

services/sqs/src/it/java/software/amazon/awssdk/services/sqs/SessionBasedAuthenticationIntegrationTest.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

services/sts/src/it/java/software/amazon/awssdk/services/sts/SecurityTokenServiceIntegrationTest.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,29 @@
1919
import static org.junit.Assert.assertTrue;
2020

2121
import org.junit.Test;
22+
import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
2223
import software.amazon.awssdk.core.SdkGlobalTime;
2324
import software.amazon.awssdk.services.sts.model.GetFederationTokenRequest;
2425
import software.amazon.awssdk.services.sts.model.GetFederationTokenResponse;
2526
import software.amazon.awssdk.services.sts.model.GetSessionTokenRequest;
2627
import software.amazon.awssdk.services.sts.model.GetSessionTokenResponse;
28+
import software.amazon.awssdk.utils.Logger;
2729

2830

2931
public class SecurityTokenServiceIntegrationTest extends IntegrationTestBase {
32+
private static final Logger log = Logger.loggerFor(SecurityTokenServiceIntegrationTest.class);
3033

3134
private static final int SESSION_DURATION = 60 * 60;
3235

3336
/** Tests that we can call GetSession to start a session. */
3437
@Test
3538
public void testGetSessionToken() throws Exception {
39+
if (CREDENTIALS_PROVIDER_CHAIN.resolveCredentials() instanceof AwsSessionCredentials) {
40+
log.warn(() -> "testGetSessionToken() skipped due to the current credentials being session credentials. " +
41+
"Session credentials cannot be used to get other session tokens.");
42+
return;
43+
}
44+
3645
GetSessionTokenRequest request = GetSessionTokenRequest.builder().durationSeconds(SESSION_DURATION).build();
3746
GetSessionTokenResponse result = sts.getSessionToken(request);
3847

@@ -45,6 +54,12 @@ public void testGetSessionToken() throws Exception {
4554
/** Tests that we can call GetFederatedSession to start a federated session. */
4655
@Test
4756
public void testGetFederatedSessionToken() throws Exception {
57+
if (CREDENTIALS_PROVIDER_CHAIN.resolveCredentials() instanceof AwsSessionCredentials) {
58+
log.warn(() -> "testGetFederatedSessionToken() skipped due to the current credentials being session credentials. " +
59+
"Session credentials cannot be used to get federation tokens.");
60+
return;
61+
}
62+
4863
GetFederationTokenRequest request = GetFederationTokenRequest.builder()
4964
.durationSeconds(SESSION_DURATION)
5065
.name("Name").build();
@@ -57,25 +72,5 @@ public void testGetFederatedSessionToken() throws Exception {
5772

5873
assertNotNull(result.federatedUser().arn());
5974
assertNotNull(result.federatedUser().federatedUserId());
60-
61-
62-
}
63-
64-
/**
65-
* In the following test, we purposely setting the time offset to trigger a clock skew error.
66-
* The time offset must be fixed and then we validate the global value for time offset has been
67-
* update.
68-
*/
69-
@Test
70-
public void testClockSkew() {
71-
SdkGlobalTime.setGlobalTimeOffset(3600);
72-
assertTrue(SdkGlobalTime.getGlobalTimeOffset() == 3600);
73-
sts = StsClient.builder().credentialsProvider(CREDENTIALS_PROVIDER_CHAIN).build();
74-
sts.getSessionToken(GetSessionTokenRequest.builder().build());
75-
assertTrue("Clockskew is fixed!", SdkGlobalTime.getGlobalTimeOffset() < 3600);
76-
// subsequent changes to the global time offset won't affect existing client
77-
SdkGlobalTime.setGlobalTimeOffset(3600);
78-
sts.getSessionToken(GetSessionTokenRequest.builder().build());
79-
assertTrue(SdkGlobalTime.getGlobalTimeOffset() == 3600);
8075
}
8176
}

test/test-utils/src/main/java/software/amazon/awssdk/testutils/Waiter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,18 @@ public final Waiter<T> ignoringException(Class<? extends Throwable>... whatToIgn
9797
return this;
9898
}
9999

100+
/**
101+
* Execute the function, returning true if the thing we're trying does not succeed after 30 seconds.
102+
*/
103+
public boolean orReturnFalse() {
104+
try {
105+
orFail();
106+
return true;
107+
} catch (AssertionError e) {
108+
return false;
109+
}
110+
}
111+
100112
/**
101113
* Execute the function, throwing an assertion error if the thing we're trying does not succeed after 30 seconds.
102114
*/

0 commit comments

Comments
 (0)