2727import software .amazon .awssdk .services .sts .StsClient ;
2828import software .amazon .awssdk .services .sts .model .AssumeRoleWithWebIdentityRequest ;
2929import software .amazon .awssdk .services .sts .model .AssumeRoleWithWebIdentityResponse ;
30+ import software .amazon .awssdk .services .sts .model .AssumedRoleUser ;
3031import software .amazon .awssdk .services .sts .model .Credentials ;
3132
3233import 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