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.codegen.poet.auth.scheme; 17 18 import static org.hamcrest.MatcherAssert.assertThat; 19 import static software.amazon.awssdk.codegen.poet.PoetMatchers.generatesTo; 20 21 import java.util.Arrays; 22 import java.util.List; 23 import java.util.function.Function; 24 import java.util.function.Supplier; 25 import org.junit.jupiter.params.ParameterizedTest; 26 import org.junit.jupiter.params.provider.MethodSource; 27 import software.amazon.awssdk.codegen.model.intermediate.IntermediateModel; 28 import software.amazon.awssdk.codegen.poet.ClassSpec; 29 import software.amazon.awssdk.codegen.poet.ClientTestModels; 30 31 public class AuthSchemeSpecTest { 32 33 @ParameterizedTest 34 @MethodSource("parameters") testCase(TestCase testCase)35 void testCase(TestCase testCase) { 36 ClassSpec classSpec = testCase.classSpecProvider.apply(testCase.modelProvider.get()); 37 String expectedFileName = testCase.caseName + "-auth-scheme-" + testCase.outputFileSuffix + ".java"; 38 assertThat("Generated class must match " + expectedFileName, 39 classSpec, generatesTo(expectedFileName)); 40 } 41 parameters()42 static List<TestCase> parameters() { 43 return Arrays.asList( 44 // query 45 TestCase.builder() 46 .modelProvider(ClientTestModels::queryServiceModels) 47 .classSpecProvider(AuthSchemeProviderSpec::new) 48 .caseName("query") 49 .outputFileSuffix("provider") 50 .build(), 51 TestCase.builder() 52 .modelProvider(ClientTestModels::queryServiceModels) 53 .classSpecProvider(AuthSchemeParamsSpec::new) 54 .caseName("query") 55 .outputFileSuffix("params") 56 .build(), 57 TestCase.builder() 58 .modelProvider(ClientTestModels::queryServiceModels) 59 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 60 .caseName("query") 61 .outputFileSuffix("default-provider") 62 .build(), 63 TestCase.builder() 64 .modelProvider(ClientTestModels::queryServiceModels) 65 .classSpecProvider(DefaultAuthSchemeParamsSpec::new) 66 .caseName("query") 67 .outputFileSuffix("default-params") 68 .build(), 69 // query-endpoint-auth-params 70 TestCase.builder() 71 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithAllowList) 72 .classSpecProvider(AuthSchemeProviderSpec::new) 73 .caseName("query-endpoint-auth-params") 74 .outputFileSuffix("provider") 75 .build(), 76 // Endpoint based AuthScheme provider WITH allow list 77 // - Endpoint Provider 78 TestCase.builder() 79 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithAllowList) 80 .classSpecProvider(EndpointBasedAuthSchemeProviderSpec::new) 81 .caseName("query-endpoint-auth-params") 82 .outputFileSuffix("endpoint-provider") 83 .build(), 84 // - Modeled provider 85 TestCase.builder() 86 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithAllowList) 87 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 88 .caseName("query-endpoint-auth-params") 89 .outputFileSuffix("modeled-provider") 90 .build(), 91 // Endpoint based AuthScheme provider WITHOUT allow list 92 // - Endpoint Provider 93 TestCase.builder() 94 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithoutAllowList) 95 .classSpecProvider(EndpointBasedAuthSchemeProviderSpec::new) 96 .caseName("query-endpoint-auth-params") 97 .outputFileSuffix("endpoint-provider-without-allowlist") 98 .build(), 99 // Auth scheme params from endpoint WITH allow list, MUST include ONLY the params in the allow list. 100 // - Interface 101 TestCase.builder() 102 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithAllowList) 103 .classSpecProvider(AuthSchemeParamsSpec::new) 104 .caseName("query-endpoint-auth-params") 105 .outputFileSuffix("params-with-allowlist") 106 .build(), 107 // - Implementation 108 TestCase.builder() 109 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithAllowList) 110 .classSpecProvider(DefaultAuthSchemeParamsSpec::new) 111 .caseName("query-endpoint-auth-params") 112 .outputFileSuffix("default-params-with-allowlist") 113 .build(), 114 // Auth scheme params from endpoint WITHOUT allow list, it MUST include all the endpoint params except for the 115 // default params. 116 // - Interface 117 TestCase.builder() 118 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithoutAllowList) 119 .classSpecProvider(AuthSchemeParamsSpec::new) 120 .caseName("query-endpoint-auth-params") 121 .outputFileSuffix("params-without-allowlist") 122 .build(), 123 // - Implementation 124 TestCase.builder() 125 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithoutAllowList) 126 .classSpecProvider(DefaultAuthSchemeParamsSpec::new) 127 .caseName("query-endpoint-auth-params") 128 .outputFileSuffix("default-params-without-allowlist") 129 .build(), 130 // Granular auth 131 TestCase.builder() 132 .modelProvider(ClientTestModels::granularAuthProvidersServiceModels) 133 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 134 .caseName("granular") 135 .outputFileSuffix("default-provider") 136 .build(), 137 // All operations with auth with the same values 138 TestCase.builder() 139 .modelProvider(ClientTestModels::allOperationsWithAuthSameValueServiceModels) 140 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 141 .caseName("all-ops-auth-same-value") 142 .outputFileSuffix("default-provider") 143 .build(), 144 // All operations with auth with different values 145 TestCase.builder() 146 .modelProvider(ClientTestModels::allOperationsWithAuthDifferentValueServiceModels) 147 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 148 .caseName("all-ops-auth-different-value") 149 .outputFileSuffix("default-provider") 150 .build(), 151 // Service with operations with auth none 152 TestCase.builder() 153 .modelProvider(ClientTestModels::operationWithNoAuth) 154 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 155 .caseName("ops-with-no-auth") 156 .outputFileSuffix("default-provider") 157 .build(), 158 // Service with signature version with the same value as S3 159 TestCase.builder() 160 .modelProvider(ClientTestModels::serviceMiniS3) 161 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 162 .caseName("mini-s3") 163 .outputFileSuffix("default-provider") 164 .build(), 165 TestCase.builder() 166 .modelProvider(ClientTestModels::granularAuthWithLegacyTraitServiceModels) 167 .classSpecProvider(ModelBasedAuthSchemeProviderSpec::new) 168 .caseName("auth-with-legacy-trait") 169 .outputFileSuffix("default-provider") 170 .build(), 171 // Interceptors 172 // - Normal case 173 TestCase.builder() 174 .modelProvider(ClientTestModels::queryServiceModels) 175 .classSpecProvider(AuthSchemeInterceptorSpec::new) 176 .caseName("query") 177 .outputFileSuffix("interceptor") 178 .build(), 179 // - Endpoints based params with allow list 180 TestCase.builder() 181 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithAllowList) 182 .classSpecProvider(AuthSchemeInterceptorSpec::new) 183 .caseName("query-endpoint-auth-params-with-allowlist") 184 .outputFileSuffix("interceptor") 185 .build(), 186 // - Endpoints based params without allow list 187 TestCase.builder() 188 .modelProvider(ClientTestModels::queryServiceModelsEndpointAuthParamsWithoutAllowList) 189 .classSpecProvider(AuthSchemeInterceptorSpec::new) 190 .caseName("query-endpoint-auth-params-without-allowlist") 191 .outputFileSuffix("interceptor") 192 .build() 193 ); 194 } 195 196 static class TestCase { 197 private final Supplier<IntermediateModel> modelProvider; 198 private final Function<IntermediateModel, ClassSpec> classSpecProvider; 199 private final String outputFileSuffix; 200 private final String caseName; 201 TestCase(Builder builder)202 TestCase(Builder builder) { 203 this.modelProvider = builder.modelProvider; 204 this.classSpecProvider = builder.classSpecProvider; 205 this.outputFileSuffix = builder.outputFileSuffix; 206 this.caseName = builder.caseName; 207 } 208 builder()209 static Builder builder() { 210 return new Builder(); 211 } 212 213 static class Builder { 214 private Supplier<IntermediateModel> modelProvider; 215 private Function<IntermediateModel, ClassSpec> classSpecProvider; 216 private String outputFileSuffix; 217 private String caseName; 218 modelProvider(Supplier<IntermediateModel> modelProvider)219 Builder modelProvider(Supplier<IntermediateModel> modelProvider) { 220 this.modelProvider = modelProvider; 221 return this; 222 } 223 classSpecProvider(Function<IntermediateModel, ClassSpec> classSpecProvider)224 Builder classSpecProvider(Function<IntermediateModel, ClassSpec> classSpecProvider) { 225 this.classSpecProvider = classSpecProvider; 226 return this; 227 } 228 outputFileSuffix(String outputFileSuffix)229 Builder outputFileSuffix(String outputFileSuffix) { 230 this.outputFileSuffix = outputFileSuffix; 231 return this; 232 } 233 caseName(String caseName)234 Builder caseName(String caseName) { 235 this.caseName = caseName; 236 return this; 237 } 238 build()239 TestCase build() { 240 return new TestCase(this); 241 } 242 } 243 } 244 } 245