22
22
import static org .mockito .Mockito .verify ;
23
23
import static org .mockito .Mockito .when ;
24
24
25
+ import java .util .Arrays ;
25
26
import java .util .Collections ;
26
27
import java .util .List ;
27
28
import java .util .Map ;
35
36
import org .mockito .junit .MockitoJUnitRunner ;
36
37
import software .amazon .awssdk .auth .credentials .AwsBasicCredentials ;
37
38
import software .amazon .awssdk .auth .credentials .StaticCredentialsProvider ;
39
+ import software .amazon .awssdk .awscore .AwsRequest ;
38
40
import software .amazon .awssdk .awscore .AwsRequestOverrideConfiguration ;
39
41
import software .amazon .awssdk .awscore .client .config .AwsClientOption ;
42
+ import software .amazon .awssdk .awscore .client .http .NoopTestAwsRequest ;
40
43
import software .amazon .awssdk .core .SdkRequest ;
41
44
import software .amazon .awssdk .core .SdkResponse ;
42
45
import software .amazon .awssdk .core .SelectedAuthScheme ;
46
49
import software .amazon .awssdk .core .client .config .SdkClientOption ;
47
50
import software .amazon .awssdk .core .client .handler .ClientExecutionParams ;
48
51
import software .amazon .awssdk .core .http .ExecutionContext ;
52
+ import software .amazon .awssdk .core .interceptor .Context ;
49
53
import software .amazon .awssdk .core .interceptor .ExecutionAttributes ;
50
54
import software .amazon .awssdk .core .interceptor .ExecutionInterceptor ;
51
55
import software .amazon .awssdk .core .interceptor .SdkExecutionAttribute ;
52
56
import software .amazon .awssdk .core .interceptor .SdkInternalExecutionAttribute ;
53
57
import software .amazon .awssdk .core .interceptor .trait .HttpChecksum ;
54
58
import software .amazon .awssdk .core .internal .util .HttpChecksumUtils ;
59
+ import software .amazon .awssdk .core .signer .NoOpSigner ;
55
60
import software .amazon .awssdk .core .signer .Signer ;
56
61
import software .amazon .awssdk .http .auth .aws .scheme .AwsV4AuthScheme ;
57
62
import software .amazon .awssdk .http .auth .scheme .NoAuthAuthScheme ;
58
63
import software .amazon .awssdk .http .auth .spi .scheme .AuthScheme ;
59
64
import software .amazon .awssdk .http .auth .spi .scheme .AuthSchemeOption ;
60
65
import software .amazon .awssdk .http .auth .spi .signer .HttpSigner ;
66
+ import software .amazon .awssdk .http .auth .spi .signer .SignerProperty ;
61
67
import software .amazon .awssdk .identity .spi .AwsCredentialsIdentity ;
62
68
import software .amazon .awssdk .identity .spi .IdentityProvider ;
63
69
import software .amazon .awssdk .identity .spi .IdentityProviders ;
64
70
import software .amazon .awssdk .profiles .ProfileFile ;
71
+ import software .amazon .awssdk .regions .RegionScope ;
65
72
66
73
@ RunWith (MockitoJUnitRunner .class )
67
74
public class AwsExecutionContextBuilderTest {
@@ -177,6 +184,34 @@ public void postSra_signing_ifClientOverride_assignClientOverrideSigner_resolveI
177
184
verify (defaultCredentialsProvider , times (1 )).resolveIdentity ();
178
185
}
179
186
187
+ @ Test
188
+ public void postSra_oldSignerOverriddenThroughExecutionInterceptor_shouldTakePrecedence () {
189
+ SdkRequest request = NoopTestAwsRequest .builder ().build ();
190
+
191
+ Signer noOpSigner = new NoOpSigner ();
192
+ ExecutionInterceptor signerExecutionInterceptor = signerOverrideExecutionInterceptor (noOpSigner );
193
+ SdkClientConfiguration configuration = testClientConfiguration (signerExecutionInterceptor ).build ();
194
+ ExecutionContext executionContext =
195
+ AwsExecutionContextBuilder .invokeInterceptorsAndCreateExecutionContext (clientExecutionParams (request ),
196
+ configuration );
197
+
198
+ assertThat (executionContext .signer ()).isEqualTo (noOpSigner );
199
+ verify (defaultCredentialsProvider , times (1 )).resolveIdentity ();
200
+ }
201
+
202
+ private ExecutionInterceptor signerOverrideExecutionInterceptor (Signer signer ) {
203
+ return new ExecutionInterceptor () {
204
+ @ Override
205
+ public SdkRequest modifyRequest (Context .ModifyRequest context , ExecutionAttributes executionAttributes ) {
206
+ AwsRequest .Builder builder = (AwsRequest .Builder ) context .request ().toBuilder ();
207
+ builder .overrideConfiguration (c -> c .signer (signer )
208
+ .build ());
209
+
210
+ return builder .build ();
211
+ }
212
+ };
213
+ }
214
+
180
215
@ Test
181
216
public void preSra_authTypeNone_doesNotAssignSigner_doesNotResolveIdentity () {
182
217
SdkClientConfiguration .Builder clientConfig = preSraClientConfiguration ();
@@ -388,13 +423,21 @@ public void invokeInterceptorsAndCreateExecutionContext_requestOverrideForIdenti
388
423
}
389
424
390
425
private ClientExecutionParams <SdkRequest , SdkResponse > clientExecutionParams () {
426
+ return clientExecutionParams (sdkRequest );
427
+ }
428
+
429
+ private ClientExecutionParams <SdkRequest , SdkResponse > clientExecutionParams (SdkRequest sdkRequest ) {
391
430
return new ClientExecutionParams <SdkRequest , SdkResponse >()
392
431
.withInput (sdkRequest )
393
432
.withFullDuplex (false )
394
433
.withOperationName ("TestOperation" );
395
434
}
396
435
397
436
private SdkClientConfiguration .Builder testClientConfiguration () {
437
+ return testClientConfiguration (interceptor );
438
+ }
439
+
440
+ private SdkClientConfiguration .Builder testClientConfiguration (ExecutionInterceptor ... executionInterceptors ) {
398
441
// In real SRA case, SelectedAuthScheme is setup as an executionAttribute by {Service}AuthSchemeInterceptor that is setup
399
442
// in EXECUTION_INTERCEPTORS. But, faking it here for unit test, by already setting SELECTED_AUTH_SCHEME into the
400
443
// executionAttributes.
@@ -408,9 +451,8 @@ private SdkClientConfiguration.Builder testClientConfiguration() {
408
451
.put (SdkInternalExecutionAttribute .SELECTED_AUTH_SCHEME , selectedAuthScheme )
409
452
.build ();
410
453
411
- List <ExecutionInterceptor > interceptorList = Collections .singletonList (interceptor );
412
454
return SdkClientConfiguration .builder ()
413
- .option (SdkClientOption .EXECUTION_INTERCEPTORS , interceptorList )
455
+ .option (SdkClientOption .EXECUTION_INTERCEPTORS , Arrays . asList ( executionInterceptors ) )
414
456
.option (AwsClientOption .CREDENTIALS_IDENTITY_PROVIDER , defaultCredentialsProvider )
415
457
.option (SdkClientOption .AUTH_SCHEMES , defaultAuthSchemes )
416
458
.option (SdkClientOption .EXECUTION_ATTRIBUTES , executionAttributes );
0 commit comments