Skip to content

Commit e644134

Browse files
committed
Adding additional tests
1 parent 4c38871 commit e644134

3 files changed

Lines changed: 86 additions & 28 deletions

File tree

services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsCredentialsProvider.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ public Duration prefetchTime() {
131131
return prefetchTime;
132132
}
133133

134+
/**
135+
* Whether the provider should fetch credentials asynchronously in the background.
136+
*/
137+
public Boolean asyncCredentialUpdateEnabled() {
138+
return asyncCredentialUpdateEnabled;
139+
}
140+
134141
@Override
135142
public String toString() {
136143
return ToString.create(providerName());

services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsWebIdentityTokenFileCredentialsProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,8 @@ private StsWebIdentityTokenFileCredentialsProvider(Builder builder) {
113113
.refreshRequest(supplier);
114114

115115
internalBuilder.staleTime(this.staleTime())
116-
.prefetchTime(this.prefetchTime());
116+
.prefetchTime(this.prefetchTime())
117+
.asyncCredentialUpdateEnabled(this.asyncCredentialUpdateEnabled());
117118

118119
credentialsProviderLocal = internalBuilder.build();
119120
} catch (RuntimeException e) {

services/sts/src/test/java/software/amazon/awssdk/services/sts/auth/StsWebIdentityTokenCredentialProviderTest.java

Lines changed: 77 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import software.amazon.awssdk.services.sts.StsClient;
2828
import software.amazon.awssdk.services.sts.model.AssumeRoleWithWebIdentityRequest;
2929
import software.amazon.awssdk.services.sts.model.AssumeRoleWithWebIdentityResponse;
30+
import software.amazon.awssdk.services.sts.model.AssumedRoleUser;
3031
import software.amazon.awssdk.services.sts.model.Credentials;
3132

3233
import java.nio.file.Paths;
@@ -127,55 +128,104 @@ void createAssumeRoleWithWebIdentityTokenCredentialsProvider_raisesInResolveCred
127128
}
128129

129130
@Test
130-
void prefetchTimeAndStaleTime_withCustomConfiguration_shouldReturnConfiguredValues() {
131-
mockStsClientResponse(Instant.now().plusSeconds(3600));
131+
void customPrefetchTime_actuallyTriggersRefreshEarly() throws InterruptedException {
132+
Instant tokenExpiration = Instant.now().plusSeconds(8);
133+
Duration customPrefetchTime = Duration.ofSeconds(2);
134+
Duration customStaleTime = Duration.ofSeconds(1);
135+
136+
when(stsClient.assumeRoleWithWebIdentity(Mockito.any(AssumeRoleWithWebIdentityRequest.class)))
137+
.thenReturn(AssumeRoleWithWebIdentityResponse.builder()
138+
.credentials(Credentials.builder()
139+
.accessKeyId("key1")
140+
.secretAccessKey("secret1")
141+
.sessionToken("session1")
142+
.expiration(tokenExpiration)
143+
.build())
144+
.assumedRoleUser(AssumedRoleUser.builder()
145+
.arn("arn:aws:iam::123456789012:role/test-role")
146+
.assumedRoleId("role:session")
147+
.build())
148+
.build())
149+
150+
.thenReturn(AssumeRoleWithWebIdentityResponse.builder()
151+
.credentials(Credentials.builder()
152+
.accessKeyId("key2")
153+
.secretAccessKey("secret2")
154+
.sessionToken("session2")
155+
.expiration(Instant.now().plusSeconds(8))
156+
.build())
157+
.assumedRoleUser(AssumedRoleUser.builder()
158+
.arn("arn:aws:iam::123456789012:role/test-role")
159+
.assumedRoleId("role:session")
160+
.build())
161+
.build());
162+
132163

133164
StsWebIdentityTokenFileCredentialsProvider provider =
134165
StsWebIdentityTokenFileCredentialsProvider.builder()
135166
.stsClient(stsClient)
136-
.prefetchTime(Duration.ofMinutes(10))
137-
.staleTime(Duration.ofMinutes(2))
167+
.asyncCredentialUpdateEnabled(true)
168+
.prefetchTime(customPrefetchTime)
169+
.staleTime(customStaleTime)
138170
.build();
139171

140-
provider.resolveCredentials();
141-
142-
assertThat(provider.prefetchTime()).isEqualTo(Duration.ofMinutes(10));
143-
assertThat(provider.staleTime()).isEqualTo(Duration.ofMinutes(2));
172+
try {
173+
assertThat(provider.prefetchTime()).isEqualTo(customPrefetchTime);
174+
assertThat(provider.staleTime()).isEqualTo(customStaleTime);
175+
176+
provider.resolveCredentials();
177+
Mockito.verify(stsClient, Mockito.times(1)).assumeRoleWithWebIdentity(Mockito.any(AssumeRoleWithWebIdentityRequest.class));
178+
179+
// Wait 7 seconds to ensure prefetch completes
180+
Thread.sleep(7_000);
181+
Mockito.verify(stsClient, Mockito.times(2)).assumeRoleWithWebIdentity(Mockito.any(AssumeRoleWithWebIdentityRequest.class));
144182

183+
} finally {
184+
provider.close();
185+
}
145186
}
146187

147188
@Test
148-
void prefetchTimeAndStaleTime_withoutConfiguration_shouldReturnDefaultValues() {
149-
mockStsClientResponse(Instant.now().plusSeconds(3600));
150-
189+
void defaultTiming_usesStandardValues() {
151190
StsWebIdentityTokenFileCredentialsProvider provider =
152191
StsWebIdentityTokenFileCredentialsProvider.builder()
153192
.stsClient(stsClient)
154193
.build();
155194

156-
157-
provider.resolveCredentials();
158-
159-
assertThat(provider.prefetchTime()).isEqualTo(Duration.ofMinutes(5));
160-
assertThat(provider.staleTime()).isEqualTo(Duration.ofMinutes(1));
195+
try {
196+
assertThat(provider.prefetchTime()).isEqualTo(Duration.ofMinutes(5));
197+
assertThat(provider.staleTime()).isEqualTo(Duration.ofMinutes(1));
198+
} finally {
199+
provider.close();
200+
}
161201
}
162202

163203
@Test
164-
void toBuilder_withTimingConfiguration_shouldPreserveConfiguration() {
165-
mockStsClientResponse(Instant.now().plusSeconds(3600));
204+
void toBuilder_preservesCustomTimingConfiguration() {
205+
Duration customPrefetch = Duration.ofMinutes(10);
206+
Duration customStale = Duration.ofMinutes(3);
207+
166208
StsWebIdentityTokenFileCredentialsProvider originalProvider =
167209
StsWebIdentityTokenFileCredentialsProvider.builder()
168210
.stsClient(stsClient)
169-
.prefetchTime(Duration.ofMinutes(8))
170-
.staleTime(Duration.ofMinutes(3))
211+
.prefetchTime(customPrefetch)
212+
.staleTime(customStale)
171213
.build();
172214

173-
174-
StsWebIdentityTokenFileCredentialsProvider copiedProvider = originalProvider.toBuilder().build();
175-
176-
copiedProvider.resolveCredentials();
177-
178-
assertThat(copiedProvider.prefetchTime()).isEqualTo(Duration.ofMinutes(8));
179-
assertThat(copiedProvider.staleTime()).isEqualTo(Duration.ofMinutes(3));
215+
try {
216+
assertThat(originalProvider.prefetchTime()).isEqualTo(customPrefetch);
217+
assertThat(originalProvider.staleTime()).isEqualTo(customStale);
218+
219+
StsWebIdentityTokenFileCredentialsProvider copiedProvider = originalProvider.toBuilder().build();
220+
221+
try {
222+
assertThat(copiedProvider.prefetchTime()).isEqualTo(customPrefetch);
223+
assertThat(copiedProvider.staleTime()).isEqualTo(customStale);
224+
} finally {
225+
copiedProvider.close();
226+
}
227+
} finally {
228+
originalProvider.close();
229+
}
180230
}
181231
}

0 commit comments

Comments
 (0)