• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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;
17 
18 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
19 import static org.mockito.Mockito.mock;
20 
21 import java.net.URI;
22 import java.util.Arrays;
23 import java.util.List;
24 import java.util.concurrent.ScheduledExecutorService;
25 import java.util.function.BiConsumer;
26 import java.util.function.Function;
27 import org.junit.jupiter.params.ParameterizedTest;
28 import org.junit.jupiter.params.provider.MethodSource;
29 import software.amazon.awssdk.awscore.AwsServiceClientConfiguration;
30 import software.amazon.awssdk.awscore.client.config.AwsClientOption;
31 import software.amazon.awssdk.core.client.config.ClientOption;
32 import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
33 import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
34 import software.amazon.awssdk.core.client.config.SdkClientConfiguration;
35 import software.amazon.awssdk.core.client.config.SdkClientOption;
36 import software.amazon.awssdk.core.signer.Signer;
37 import software.amazon.awssdk.endpoints.EndpointProvider;
38 import software.amazon.awssdk.http.auth.spi.scheme.AuthSchemeProvider;
39 import software.amazon.awssdk.identity.spi.AwsCredentialsIdentity;
40 import software.amazon.awssdk.identity.spi.IdentityProvider;
41 import software.amazon.awssdk.regions.Region;
42 import software.amazon.awssdk.services.protocolrestjson.ProtocolRestJsonServiceClientConfiguration;
43 import software.amazon.awssdk.services.protocolrestjson.auth.scheme.ProtocolRestJsonAuthSchemeProvider;
44 import software.amazon.awssdk.services.protocolrestjson.internal.ProtocolRestJsonServiceClientConfigurationBuilder;
45 
46 public class CodegenServiceClientConfigurationTest {
47     private static final EndpointProvider MOCK_ENDPOINT_PROVIDER = mock(EndpointProvider.class);
48     private static final IdentityProvider<AwsCredentialsIdentity> MOCK_IDENTITY_PROVIDER = mock(IdentityProvider.class);
49     private static final ProtocolRestJsonAuthSchemeProvider MOCK_AUTH_SCHEME_PROVIDER =
50         mock(ProtocolRestJsonAuthSchemeProvider.class);
51     private static final ScheduledExecutorService MOCK_SCHEDULED_EXECUTOR_SERVICE = mock(ScheduledExecutorService.class);
52     private static final Signer MOCK_SIGNER = mock(Signer.class);
53 
54     @ParameterizedTest
55     @MethodSource("testCases")
externalInternalTransforms_preserves_propertyValues(TestCase<T> testCase)56     <T> void externalInternalTransforms_preserves_propertyValues(TestCase<T> testCase) {
57         SdkClientConfiguration.Builder clientConfig = SdkClientConfiguration.builder();
58         ProtocolRestJsonServiceClientConfigurationBuilder builder =
59             new ProtocolRestJsonServiceClientConfigurationBuilder(clientConfig);
60 
61         // Verify that initially the value is null for properties with direct mapping.
62         if (testCase.hasDirectMapping) {
63             assertThat(testCase.getter.apply(builder)).isNull();
64         }
65 
66         // Set the value
67         testCase.setter.accept(builder, testCase.value);
68 
69         // Assert that we can retrieve the same value
70         assertThat(testCase.getter.apply(builder)).isEqualTo(testCase.value);
71 
72         // Build the ServiceConfiguration instance
73         ProtocolRestJsonServiceClientConfiguration config = builder.build();
74 
75         // Assert that we can retrieve the same value
76         assertThat(testCase.dataGetter.apply(config)).isEqualTo(testCase.value);
77 
78         // Build a new builder with the created client config
79         ProtocolRestJsonServiceClientConfigurationBuilder anotherBuilder =
80             new ProtocolRestJsonServiceClientConfigurationBuilder(clientConfig);
81 
82         // Assert that we can retrieve the same value
83         if (testCase.hasDirectMapping) {
84             assertThat(testCase.getter.apply(anotherBuilder)).isEqualTo(testCase.value);
85         }
86     }
87 
testCases()88     public static List<TestCase<?>> testCases() throws Exception {
89         return Arrays.asList(
90             TestCase.<Region>builder()
91                     .option(AwsClientOption.AWS_REGION)
92                     .value(Region.US_WEST_2)
93                     .setter(ProtocolRestJsonServiceClientConfiguration.Builder::region)
94                     .getter(ProtocolRestJsonServiceClientConfiguration.Builder::region)
95                     .dataGetter(AwsServiceClientConfiguration::region)
96                     .build(),
97             TestCase.<URI>builder()
98                     .option(SdkClientOption.ENDPOINT)
99                     .value(new URI("http://localhost:8080"))
100                     .setter(ProtocolRestJsonServiceClientConfiguration.Builder::endpointOverride)
101                     .getter(ProtocolRestJsonServiceClientConfiguration.Builder::endpointOverride)
102                     .dataGetter(x -> x.endpointOverride().orElse(null))
103                     .build(),
104             TestCase.<EndpointProvider>builder()
105                     .option(SdkClientOption.ENDPOINT_PROVIDER)
106                     .value(MOCK_ENDPOINT_PROVIDER)
107                     .setter(ProtocolRestJsonServiceClientConfiguration.Builder::endpointProvider)
108                     .getter(ProtocolRestJsonServiceClientConfiguration.Builder::endpointProvider)
109                     .dataGetter(x -> x.endpointProvider().orElse(null))
110                     .build(),
111             TestCase.<IdentityProvider<? extends AwsCredentialsIdentity>>builder()
112                     .option(AwsClientOption.CREDENTIALS_IDENTITY_PROVIDER)
113                     .value(MOCK_IDENTITY_PROVIDER)
114                     .setter(ProtocolRestJsonServiceClientConfiguration.Builder::credentialsProvider)
115                     .getter(ProtocolRestJsonServiceClientConfiguration.Builder::credentialsProvider)
116                     .dataGetter(AwsServiceClientConfiguration::credentialsProvider)
117                     .build(),
118             TestCase.<AuthSchemeProvider>builder()
119                     .option(SdkClientOption.AUTH_SCHEME_PROVIDER)
120                     .value(MOCK_AUTH_SCHEME_PROVIDER)
121                     .setter((b, p) -> b.authSchemeProvider((ProtocolRestJsonAuthSchemeProvider) p))
122                     .getter(ProtocolRestJsonServiceClientConfiguration.Builder::authSchemeProvider)
123                     .dataGetter(ProtocolRestJsonServiceClientConfiguration::authSchemeProvider)
124                     .build(),
125             // Override configuration gets tricky
126             TestCase.<ScheduledExecutorService>builder()
127                     .option(SdkClientOption.SCHEDULED_EXECUTOR_SERVICE)
128                     .value(MOCK_SCHEDULED_EXECUTOR_SERVICE)
129                     .setter((b, p) -> b.overrideConfiguration(
130                         ClientOverrideConfiguration.builder()
131                                                    .scheduledExecutorService(p)
132                                                    .build()))
133                     .getter(b -> b.overrideConfiguration().scheduledExecutorService().orElse(null))
134                     .dataGetter(d -> d.overrideConfiguration().scheduledExecutorService().orElse(null))
135                     .withoutDirectMapping()
136                     .build(),
137             TestCase.<Signer>builder()
138                     .option(SdkAdvancedClientOption.SIGNER)
139                     .value(MOCK_SIGNER)
140                     .setter((b, p) -> b.overrideConfiguration(
141                         ClientOverrideConfiguration.builder()
142                                                    .putAdvancedOption(SdkAdvancedClientOption.SIGNER, p)
143                                                    .build()))
144                     .getter(b -> b.overrideConfiguration().advancedOption(SdkAdvancedClientOption.SIGNER).orElse(null))
145                     .dataGetter(d -> d.overrideConfiguration().advancedOption(SdkAdvancedClientOption.SIGNER).orElse(null))
146                     .withoutDirectMapping()
147                     .build()
148         );
149     }
150 
151     static class TestCase<T> {
152         private final ClientOption<T> option;
153         private final T value;
154         private final BiConsumer<ProtocolRestJsonServiceClientConfiguration.Builder, T> setter;
155         private final Function<ProtocolRestJsonServiceClientConfiguration.Builder, T> getter;
156         private Function<ProtocolRestJsonServiceClientConfiguration, T> dataGetter;
157         private final boolean hasDirectMapping;
158 
TestCase(Builder<T> builder)159         public TestCase(Builder<T> builder) {
160             this.option = builder.option;
161             this.value = builder.value;
162             this.setter = builder.setter;
163             this.getter = builder.getter;
164             this.dataGetter = builder.dataGetter;
165             this.hasDirectMapping = builder.hasDirectMapping;
166         }
167 
builder()168         public static <T> Builder<T> builder() {
169             return new Builder();
170         }
171 
172         static class Builder<T> {
173             private ClientOption<T> option;
174             private T value;
175             private BiConsumer<ProtocolRestJsonServiceClientConfiguration.Builder, T> setter;
176             private Function<ProtocolRestJsonServiceClientConfiguration.Builder, T> getter;
177             private Function<ProtocolRestJsonServiceClientConfiguration, T> dataGetter;
178             private boolean hasDirectMapping = true;
179 
option(ClientOption<T> option)180             Builder<T> option(ClientOption<T> option) {
181                 this.option = option;
182                 return this;
183             }
184 
value(T value)185             Builder<T> value(T value) {
186                 this.value = value;
187                 return this;
188             }
189 
setter(BiConsumer<ProtocolRestJsonServiceClientConfiguration.Builder, T> setter)190             Builder<T> setter(BiConsumer<ProtocolRestJsonServiceClientConfiguration.Builder, T> setter) {
191                 this.setter = setter;
192                 return this;
193             }
194 
getter(Function<ProtocolRestJsonServiceClientConfiguration.Builder, T> getter)195             Builder<T> getter(Function<ProtocolRestJsonServiceClientConfiguration.Builder, T> getter) {
196                 this.getter = getter;
197                 return this;
198             }
199 
dataGetter(Function<ProtocolRestJsonServiceClientConfiguration, T> dataGetter)200             Builder<T> dataGetter(Function<ProtocolRestJsonServiceClientConfiguration, T> dataGetter) {
201                 this.dataGetter = dataGetter;
202                 return this;
203             }
204 
withoutDirectMapping()205             Builder<T> withoutDirectMapping() {
206                 this.hasDirectMapping = false;
207                 return this;
208             }
209 
build()210             TestCase<T> build() {
211                 return new TestCase<>(this);
212             }
213         }
214     }
215 }
216