• 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.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