Skip to content

Commit c9c39c0

Browse files
authored
Add missing signer override tests (#6463)
1 parent ba102d6 commit c9c39c0

File tree

2 files changed

+163
-5
lines changed

2 files changed

+163
-5
lines changed

test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/SignerOverrideTest.java

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,23 @@
1515

1616
package software.amazon.awssdk.services;
1717

18+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1819
import static org.mockito.ArgumentMatchers.any;
1920
import static org.mockito.Mockito.verify;
21+
import static org.mockito.Mockito.when;
2022
import static software.amazon.awssdk.core.client.config.SdkAdvancedClientOption.SIGNER;
2123

24+
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
25+
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
2226
import java.net.URI;
27+
import java.nio.ByteBuffer;
28+
import java.util.concurrent.CompletableFuture;
2329
import org.junit.Test;
30+
import org.junit.jupiter.api.BeforeEach;
2431
import org.junit.runner.RunWith;
2532
import org.mockito.Mock;
2633
import org.mockito.junit.MockitoJUnitRunner;
34+
import org.reactivestreams.Publisher;
2735
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
2836
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
2937
import software.amazon.awssdk.awscore.AwsRequest;
@@ -33,19 +41,59 @@
3341
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
3442
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
3543
import software.amazon.awssdk.core.signer.Signer;
44+
import software.amazon.awssdk.core.sync.RequestBody;
45+
import software.amazon.awssdk.http.SdkHttpClient;
3646
import software.amazon.awssdk.http.SdkHttpFullRequest;
47+
import software.amazon.awssdk.http.SdkHttpRequest;
48+
import software.amazon.awssdk.http.async.SdkAsyncHttpClient;
49+
import software.amazon.awssdk.http.auth.aws.scheme.AwsV4AuthScheme;
50+
import software.amazon.awssdk.http.auth.aws.signer.AwsV4HttpSigner;
51+
import software.amazon.awssdk.http.auth.spi.signer.AsyncSignRequest;
52+
import software.amazon.awssdk.http.auth.spi.signer.AsyncSignedRequest;
53+
import software.amazon.awssdk.http.auth.spi.signer.SignRequest;
54+
import software.amazon.awssdk.http.auth.spi.signer.SignedRequest;
55+
import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
56+
import software.amazon.awssdk.identity.spi.IdentityProvider;
57+
import software.amazon.awssdk.identity.spi.IdentityProviders;
3758
import software.amazon.awssdk.regions.Region;
3859
import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonAsyncClient;
3960
import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonClient;
4061
import software.amazon.awssdk.services.protocolrestjson.model.AllTypesRequest;
4162
import software.amazon.awssdk.services.protocolrestjson.model.StreamingInputOperationRequest;
42-
63+
import software.amazon.awssdk.services.testutil.ValidSdkObjects;
64+
import software.amazon.awssdk.testutils.service.http.MockAsyncHttpClient;
65+
import software.amazon.awssdk.testutils.service.http.MockSyncHttpClient;
4366

4467
@RunWith(MockitoJUnitRunner.class)
4568
public class SignerOverrideTest {
4669
@Mock
4770
public Signer mockSigner;
4871

72+
@Mock
73+
public static AwsV4HttpSigner mockHttpSigner;
74+
75+
@Mock
76+
public SignedRequest signedRequest;
77+
@Mock
78+
public AsyncSignedRequest asyncSignedRequest;
79+
80+
@BeforeEach
81+
public void setup() {
82+
SdkHttpRequest sdkHttpRequest = ValidSdkObjects.sdkHttpFullRequest().build();
83+
Publisher<ByteBuffer> signedPayload = AsyncRequestBody.fromString("signed async request body");
84+
85+
when(mockHttpSigner.sign(any(SignRequest.class))).thenReturn(SignedRequest.builder().build());
86+
87+
CompletableFuture<AsyncSignedRequest> requestFuture = new CompletableFuture<>();
88+
requestFuture.complete(asyncSignedRequest);
89+
when(mockHttpSigner.signAsync(any(AsyncSignRequest.class)))
90+
.thenReturn(
91+
CompletableFuture.completedFuture(AsyncSignedRequest.builder()
92+
.request(sdkHttpRequest)
93+
.payload(signedPayload)
94+
.build()));
95+
}
96+
4997
/**
5098
* Test to ensure that operations that use the {@link software.amazon.awssdk.auth.signer.AsyncAws4Signer} don't apply
5199
* the override when the signer is overridden by the customer.
@@ -99,21 +147,61 @@ public void syncClient_oldSignerOverriddenInExecutionInterceptor_takesPrecedence
99147
verify(mockSigner).sign(any(SdkHttpFullRequest.class), any(ExecutionAttributes.class));
100148
}
101149

150+
@Test
151+
public void sync_httpSignerOverride_takesPrecedence() {
152+
try (ProtocolRestJsonClient client = ProtocolRestJsonClient.builder()
153+
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("akid", "skid")))
154+
.region(Region.US_WEST_2)
155+
.putAuthScheme(new MockAuthScheme())
156+
.build()) {
157+
158+
assertThatThrownBy(() -> client.streamingInputOperation(StreamingInputOperationRequest.builder().build(),
159+
RequestBody.fromString("test"))).isInstanceOf(NullPointerException.class);
160+
verify(mockHttpSigner).sign(any(SignRequest.class));
161+
}
162+
}
163+
164+
@Test
165+
public void async_httpSignerOverride_takesPrecedence() {
166+
try(ProtocolRestJsonAsyncClient asyncClient = ProtocolRestJsonAsyncClient.builder()
167+
.credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("akid", "skid")))
168+
.region(Region.US_WEST_2)
169+
.putAuthScheme(new MockAuthScheme())
170+
.build()) {
171+
assertThatThrownBy(() -> asyncClient.streamingInputOperation(StreamingInputOperationRequest.builder().build(),
172+
AsyncRequestBody.fromString("test")).join()).hasRootCauseInstanceOf(NullPointerException.class);
173+
}
174+
verify(mockHttpSigner).signAsync(any(AsyncSignRequest.class));
175+
}
176+
177+
102178
private ExecutionInterceptor signerOverrideExecutionInterceptor(Signer signer) {
103179
return new ExecutionInterceptor() {
104180
@Override
105181
public SdkRequest modifyRequest(Context.ModifyRequest context, ExecutionAttributes executionAttributes) {
106182
AwsRequest.Builder builder = (AwsRequest.Builder) context.request().toBuilder();
107183
builder.overrideConfiguration(c -> c.signer(signer)
108-
.build());
184+
.build());
109185

110186
return builder.build();
111187
}
112188
};
113189
}
114190

115-
// TODO(sra-identity-and-auth): Add test for SRA way of overriding signer to assert that overridden signer is used.
116-
// At that point, rename this class to SignerOverrideTest, not specific to AsyncSignerOverride (which was for operation
117-
// level codegen changes).
191+
private static class MockAuthScheme implements AwsV4AuthScheme {
192+
@Override
193+
public IdentityProvider<AwsCredentialsIdentity> identityProvider(IdentityProviders providers) {
194+
return providers.identityProvider(AwsCredentialsIdentity.class);
195+
}
196+
197+
@Override
198+
public AwsV4HttpSigner signer() {
199+
return mockHttpSigner;
200+
}
118201

202+
@Override
203+
public String schemeId() {
204+
return SCHEME_ID;
205+
}
206+
}
119207
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.awssdk.services.testutil;
17+
18+
import java.net.URI;
19+
import java.util.List;
20+
import java.util.Optional;
21+
import software.amazon.awssdk.core.RequestOverrideConfiguration;
22+
import software.amazon.awssdk.core.SdkField;
23+
import software.amazon.awssdk.core.SdkRequest;
24+
import software.amazon.awssdk.http.SdkHttpFullRequest;
25+
import software.amazon.awssdk.http.SdkHttpFullResponse;
26+
import software.amazon.awssdk.http.SdkHttpMethod;
27+
28+
/**
29+
* A collection of objects (or object builder) pre-populated with all required fields. This allows tests to focus on what data
30+
* they care about, not necessarily what data is required.
31+
*/
32+
public final class ValidSdkObjects {
33+
private ValidSdkObjects() {}
34+
35+
public static SdkRequest sdkRequest() {
36+
return new SdkRequest() {
37+
@Override
38+
public Optional<? extends RequestOverrideConfiguration> overrideConfiguration() {
39+
return Optional.empty();
40+
}
41+
42+
@Override
43+
public Builder toBuilder() {
44+
return null;
45+
}
46+
47+
@Override
48+
public List<SdkField<?>> sdkFields() {
49+
return null;
50+
}
51+
};
52+
}
53+
54+
public static SdkHttpFullRequest.Builder sdkHttpFullRequest() {
55+
return sdkHttpFullRequest(80);
56+
}
57+
58+
public static SdkHttpFullRequest.Builder sdkHttpFullRequest(int port) {
59+
return SdkHttpFullRequest.builder()
60+
.uri(URI.create("http://localhost"))
61+
.port(port)
62+
.putHeader("Host", "localhost")
63+
.method(SdkHttpMethod.GET);
64+
}
65+
66+
public static SdkHttpFullResponse.Builder sdkHttpFullResponse() {
67+
return SdkHttpFullResponse.builder()
68+
.statusCode(200);
69+
}
70+
}

0 commit comments

Comments
 (0)