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