diff --git a/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/KnownS3ExpressEndpointProperty.java b/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/KnownS3ExpressEndpointProperty.java index 0bb694100826..c87b9aef20b8 100644 --- a/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/KnownS3ExpressEndpointProperty.java +++ b/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/KnownS3ExpressEndpointProperty.java @@ -15,12 +15,7 @@ package software.amazon.awssdk.services.s3.endpoints.internal; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; -import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; import software.amazon.awssdk.endpoints.EndpointAttributeKey; @SdkInternalApi @@ -32,49 +27,6 @@ public final class KnownS3ExpressEndpointProperty { public static final EndpointAttributeKey BACKEND = new EndpointAttributeKey<>("Backend", String.class); - public static final List> KNOWN_S3_ENDPOINT_PROPERTIES = Collections.unmodifiableList( - Arrays.asList( - new AuthSchemesProperty(), - new BackendProperty() - ) - ); - private KnownS3ExpressEndpointProperty() { } - - private static class AuthSchemesProperty implements EndpointAttributeProvider> { - @Override - public String propertyName() { - return "authSchemes"; - } - - @Override - public EndpointAttributeKey> attributeKey() { - return AwsEndpointAttribute.AUTH_SCHEMES; - } - - @Override - public List attributeValue(Value value) { - EndpointAuthSchemeStrategyFactory endpointAuthSchemeStrategyFactory = new S3EndpointAuthSchemeStrategyFactory(); - EndpointAuthSchemeStrategy strategy = endpointAuthSchemeStrategyFactory.endpointAuthSchemeStrategy(); - return strategy.createAuthSchemes(value); - } - } - - private static class BackendProperty implements EndpointAttributeProvider { - @Override - public String propertyName() { - return "backend"; - } - - @Override - public EndpointAttributeKey attributeKey() { - return BACKEND; - } - - @Override - public String attributeValue(Value value) { - return value.expectString(); - } - } } diff --git a/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/S3EndpointAuthSchemeStrategyFactory.java b/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/S3EndpointAuthSchemeStrategyFactory.java deleted file mode 100644 index 57555d45843d..000000000000 --- a/services/s3/src/main/java/software/amazon/awssdk/services/s3/endpoints/internal/S3EndpointAuthSchemeStrategyFactory.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.services.s3.endpoints.internal; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import software.amazon.awssdk.annotations.SdkInternalApi; -import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; -import software.amazon.awssdk.services.s3.endpoints.authscheme.S3ExpressEndpointAuthScheme; - -@SdkInternalApi -public final class S3EndpointAuthSchemeStrategyFactory implements EndpointAuthSchemeStrategyFactory { - - public static final String SIGNING_NAME_ID = "signingName"; - public static final String SIGNING_REGION_SET_ID = "signingRegionSet"; - public static final String DISABLE_DOUBLE_ENCODING_ID = "disableDoubleEncoding"; - public static final String SIGNING_REGION_ID = "signingRegion"; - - private static final String SIGV4_NAME = "sigv4"; - private static final String SIGV4A_NAME = "sigv4a"; - private static final String S3EXPRESS_NAME = "sigv4-s3express"; - - @Override - public EndpointAuthSchemeStrategy endpointAuthSchemeStrategy() { - Map> knownAuthSchemesMapping = new HashMap<>(); - knownAuthSchemesMapping.put(SIGV4A_NAME, this::sigV4A); - knownAuthSchemesMapping.put(SIGV4_NAME, this::sigV4); - knownAuthSchemesMapping.put(S3EXPRESS_NAME, this::s3Express); - return new DefaultEndpointAuthSchemeStrategy(knownAuthSchemesMapping); - } - - private EndpointAuthScheme sigV4A(Value.Record scheme) { - SigV4aAuthScheme.Builder schemeBuilder = SigV4aAuthScheme.builder(); - - Value signingName = scheme.get(Identifier.of(SIGNING_NAME_ID)); - if (signingName != null) { - schemeBuilder.signingName(signingName.expectString()); - } - - Value signingRegionSet = scheme.get(Identifier.of(SIGNING_REGION_SET_ID)); - if (signingRegionSet != null) { - Value.Array signingRegionSetArray = signingRegionSet.expectArray(); - for (int j = 0; j < signingRegionSetArray.size(); ++j) { - schemeBuilder.addSigningRegion(signingRegionSetArray.get(j).expectString()); - } - } - - Value disableDoubleEncoding = scheme.get(Identifier.of(DISABLE_DOUBLE_ENCODING_ID)); - if (disableDoubleEncoding != null) { - schemeBuilder.disableDoubleEncoding(disableDoubleEncoding.expectBool()); - } - - return schemeBuilder.build(); - } - - private EndpointAuthScheme sigV4(Value.Record scheme) { - SigV4AuthScheme.Builder schemeBuilder = SigV4AuthScheme.builder(); - - Value signingName = scheme.get(Identifier.of(SIGNING_NAME_ID)); - if (signingName != null) { - schemeBuilder.signingName(signingName.expectString()); - } - - Value signingRegion = scheme.get(Identifier.of(SIGNING_REGION_ID)); - if (signingRegion != null) { - schemeBuilder.signingRegion(signingRegion.expectString()); - } - - Value disableDoubleEncoding = scheme.get(Identifier.of(DISABLE_DOUBLE_ENCODING_ID)); - if (disableDoubleEncoding != null) { - schemeBuilder.disableDoubleEncoding(disableDoubleEncoding.expectBool()); - } - - return schemeBuilder.build(); - } - - private EndpointAuthScheme s3Express(Value.Record scheme) { - S3ExpressEndpointAuthScheme.Builder schemeBuilder = S3ExpressEndpointAuthScheme.builder(); - - Value signingName = scheme.get(Identifier.of(SIGNING_NAME_ID)); - if (signingName != null) { - schemeBuilder.signingName(signingName.expectString()); - } - - Value signingRegion = scheme.get(Identifier.of(SIGNING_REGION_ID)); - if (signingRegion != null) { - schemeBuilder.signingRegion(signingRegion.expectString()); - } - - Value disableDoubleEncoding = scheme.get(Identifier.of(DISABLE_DOUBLE_ENCODING_ID)); - if (disableDoubleEncoding != null) { - schemeBuilder.disableDoubleEncoding(disableDoubleEncoding.expectBool()); - } - - return schemeBuilder.build(); - } -} diff --git a/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionSyncClientTest.java b/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionSyncClientTest.java index fdec8f328aca..f7e78567b1d9 100644 --- a/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionSyncClientTest.java +++ b/services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionSyncClientTest.java @@ -43,7 +43,6 @@ import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; -import org.mockito.Mock; import org.mockito.Mockito; import software.amazon.awssdk.core.interceptor.Context; import software.amazon.awssdk.core.interceptor.ExecutionAttributes; diff --git a/services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsGetFederationTokenCredentialsProvider.java b/services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsGetFederationTokenCredentialsProvider.java index 7fb6a33e9cba..e096d66eceb3 100644 --- a/services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsGetFederationTokenCredentialsProvider.java +++ b/services/sts/src/main/java/software/amazon/awssdk/services/sts/auth/StsGetFederationTokenCredentialsProvider.java @@ -25,7 +25,7 @@ import software.amazon.awssdk.auth.credentials.AwsSessionCredentials; import software.amazon.awssdk.core.useragent.BusinessMetricFeatureId; import software.amazon.awssdk.services.sts.StsClient; -import software.amazon.awssdk.services.sts.endpoints.internal.Arn; +import software.amazon.awssdk.services.sts.endpoints.internal.RuleArn; import software.amazon.awssdk.services.sts.model.FederatedUser; import software.amazon.awssdk.services.sts.model.GetFederationTokenRequest; import software.amazon.awssdk.services.sts.model.GetFederationTokenResponse; @@ -89,9 +89,11 @@ private String accountIdFromArn(FederatedUser federatedUser) { if (federatedUser == null) { return null; } - return Arn.parse(federatedUser.arn()) - .map(Arn::accountId) - .orElse(null); + RuleArn arn = RuleArn.parse(federatedUser.arn()); + if (arn == null) { + return null; + } + return arn.accountId(); } @Override diff --git a/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsAuthUtils.java b/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsAuthUtils.java index e854495e0124..fb84fbb2f1cf 100644 --- a/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsAuthUtils.java +++ b/services/sts/src/main/java/software/amazon/awssdk/services/sts/internal/StsAuthUtils.java @@ -17,7 +17,7 @@ import software.amazon.awssdk.annotations.SdkInternalApi; import software.amazon.awssdk.auth.credentials.AwsSessionCredentials; -import software.amazon.awssdk.services.sts.endpoints.internal.Arn; +import software.amazon.awssdk.services.sts.endpoints.internal.RuleArn; import software.amazon.awssdk.services.sts.model.AssumedRoleUser; import software.amazon.awssdk.services.sts.model.Credentials; @@ -31,9 +31,11 @@ public static String accountIdFromArn(AssumedRoleUser assumedRoleUser) { if (assumedRoleUser == null) { return null; } - return Arn.parse(assumedRoleUser.arn()) - .map(Arn::accountId) - .orElse(null); + RuleArn arn = RuleArn.parse(assumedRoleUser.arn()); + if (arn == null) { + return null; + } + return arn.accountId(); } public static AwsSessionCredentials fromStsCredentials(Credentials credentials, String provider) { diff --git a/services/sts/src/test/java/software/amazon/awssdk/services/sts/auth/StsCredentialsProviderTestBase.java b/services/sts/src/test/java/software/amazon/awssdk/services/sts/auth/StsCredentialsProviderTestBase.java index 8c054aa97e1a..e7bce1105295 100644 --- a/services/sts/src/test/java/software/amazon/awssdk/services/sts/auth/StsCredentialsProviderTestBase.java +++ b/services/sts/src/test/java/software/amazon/awssdk/services/sts/auth/StsCredentialsProviderTestBase.java @@ -29,7 +29,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.awssdk.auth.credentials.AwsSessionCredentials; import software.amazon.awssdk.services.sts.StsClient; -import software.amazon.awssdk.services.sts.endpoints.internal.Arn; import software.amazon.awssdk.services.sts.model.Credentials; /** diff --git a/test/architecture-tests/src/test/java/software/amazon/awssdk/archtests/NamingConventionWithSuppressionTest.java b/test/architecture-tests/src/test/java/software/amazon/awssdk/archtests/NamingConventionWithSuppressionTest.java index 75277418c19a..65f6eb4e8ab1 100644 --- a/test/architecture-tests/src/test/java/software/amazon/awssdk/archtests/NamingConventionWithSuppressionTest.java +++ b/test/architecture-tests/src/test/java/software/amazon/awssdk/archtests/NamingConventionWithSuppressionTest.java @@ -23,12 +23,12 @@ import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.function.Supplier; import java.util.regex.Pattern; import org.junit.jupiter.api.Test; -import software.amazon.awssdk.services.s3.endpoints.internal.S3EndpointAuthSchemeStrategyFactory; /** * This test class diffs from {@link NamingConventionTest}; it doesn't use archunit annotations such as {@link ArchTest} @@ -45,8 +45,7 @@ public class NamingConventionWithSuppressionTest { * DO NOT ADD NEW EXCEPTIONS */ private static final Set ALLOWED_SUPPLIER_SUPPRESSION = new HashSet<>( - Arrays.asList(Pattern.compile(".*/DefaultEndpointAuthSchemeStrategyFactory.class"), - ArchUtils.classNameToPattern(S3EndpointAuthSchemeStrategyFactory.class))); + Collections.singletonList(Pattern.compile(".*/DefaultEndpointAuthSchemeStrategyFactory.class"))); @Test void supplierImpl_shouldHaveSupplierSuffix() { diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/restjsonendpointproviders/endpoints/internal/RestJsonEndpointProvidersEndpointProviderTest.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/restjsonendpointproviders/endpoints/internal/RestJsonEndpointProvidersEndpointProviderTest.java deleted file mode 100644 index 755828a7871b..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/restjsonendpointproviders/endpoints/internal/RestJsonEndpointProvidersEndpointProviderTest.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.net.URI; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import software.amazon.awssdk.awscore.endpoints.AwsEndpointAttribute; -import software.amazon.awssdk.awscore.endpoints.authscheme.EndpointAuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4AuthScheme; -import software.amazon.awssdk.awscore.endpoints.authscheme.SigV4aAuthScheme; -import software.amazon.awssdk.core.exception.SdkClientException; -import software.amazon.awssdk.endpoints.Endpoint; -import software.amazon.awssdk.utils.MapUtils; - -class RestJsonEndpointProvidersEndpointProviderTest { - - private DefaultRestJsonEndpointProvidersEndpointProvider provider; - - @BeforeEach - void init() { - this.provider = new DefaultRestJsonEndpointProvidersEndpointProvider(); - } - - @Test - public void valueAsEndpoint_isNone_throws() { - assertThatThrownBy(() -> provider.valueAsEndpointOrThrow(Value.none())) - .isInstanceOf(SdkClientException.class); - } - - @Test - public void valueAsEndpoint_isString_throwsAsMsg() { - assertThatThrownBy(() -> provider.valueAsEndpointOrThrow(Value.fromStr("oops!"))) - .isInstanceOf(SdkClientException.class) - .hasMessageContaining("oops!"); - } - - @Test - public void valueAsEndpoint_isEndpoint_returnsEndpoint() { - Value.Endpoint endpointVal = Value.Endpoint.builder() - .url("https://myservice.aws") - .build(); - - Endpoint expected = Endpoint.builder() - .url(URI.create("https://myservice.aws")) - .build(); - - assertThat(expected.url()).isEqualTo(provider.valueAsEndpointOrThrow(endpointVal).url()); - } - - @Test - public void valueAsEndpoint_endpointHasAuthSchemes_includesAuthSchemes() { - List authSchemes = Arrays.asList( - Value.fromRecord(MapUtils.of(Identifier.of("name"), Value.fromStr("sigv4"), - Identifier.of("signingRegion"), Value.fromStr("us-west-2"), - Identifier.of("signingName"), Value.fromStr("myservice"), - Identifier.of("disableDoubleEncoding"), Value.fromBool(false))), - - Value.fromRecord(MapUtils.of(Identifier.of("name"), Value.fromStr("sigv4a"), - Identifier.of("signingRegionSet"), - Value.fromArray(Collections.singletonList(Value.fromStr("*"))), - Identifier.of("signingName"), Value.fromStr("myservice"), - Identifier.of("disableDoubleEncoding"), Value.fromBool(false))), - - // Unknown scheme name, should ignore - Value.fromRecord(MapUtils.of(Identifier.of("name"), Value.fromStr("sigv5"))) - ); - - - Value.Endpoint endpointVal = Value.Endpoint.builder() - .url("https://myservice.aws") - .property("authSchemes", Value.fromArray(authSchemes)) - .build(); - - - EndpointAuthScheme sigv4 = SigV4AuthScheme.builder() - .signingName("myservice") - .signingRegion("us-west-2") - .disableDoubleEncoding(false) - .build(); - - EndpointAuthScheme sigv4a = SigV4aAuthScheme.builder() - .signingName("myservice") - .addSigningRegion("*") - .disableDoubleEncoding(false) - .build(); - - assertThat(provider.valueAsEndpointOrThrow(endpointVal).attribute(AwsEndpointAttribute.AUTH_SCHEMES)) - .containsExactly(sigv4, sigv4a); - } - - @Test - public void valueAsEndpoint_endpointHasUnknownProperty_ignores() { - Value.Endpoint endpointVal = Value.Endpoint.builder() - .url("https://myservice.aws") - .property("foo", Value.fromStr("baz")) - .build(); - - assertThat(provider.valueAsEndpointOrThrow(endpointVal).attribute(AwsEndpointAttribute.AUTH_SCHEMES)).isNull(); - } - - @Test - public void valueAsEndpoint_endpointHasHeaders_includesHeaders() { - Value.Endpoint endpointVal = Value.Endpoint.builder() - .url("https://myservice.aws") - .addHeader("foo1", "bar1") - .addHeader("foo1", "bar2") - .addHeader("foo2", "baz") - .build(); - - Map> expectedHeaders = MapUtils.of("foo1", Arrays.asList("bar1", "bar2"), - "foo2", Arrays.asList("baz")); - - assertThat(provider.valueAsEndpointOrThrow(endpointVal).headers()).isEqualTo(expectedHeaders); - } - -} \ No newline at end of file diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/DefaultVisitor.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/DefaultVisitor.java deleted file mode 100644 index b805994d098c..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/DefaultVisitor.java +++ /dev/null @@ -1,117 +0,0 @@ -package software.amazon.awssdk.services.rules; - -import java.util.List; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.BooleanEqualsFn; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Expr; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ExprVisitor; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Fn; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.FnVisitor; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.GetAttr; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.IsSet; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.IsValidHostLabel; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.IsVirtualHostableS3Bucket; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Literal; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Not; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ParseArn; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ParseUrl; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.PartitionFn; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Ref; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Rule; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleValueVisitor; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.StringEqualsFn; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Substring; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.UriEncodeFn; - -public abstract class DefaultVisitor implements RuleValueVisitor, ExprVisitor, FnVisitor { - public abstract R getDefault(); - - @Override - public R visitLiteral(Literal literal) { - return getDefault(); - } - - @Override - public R visitRef(Ref ref) { - return getDefault(); - } - - @Override - public R visitFn(Fn fn) { - return getDefault(); - } - - @Override - public R visitPartition(PartitionFn fn) { - return getDefault(); - } - - @Override - public R visitParseArn(ParseArn fn) { - return getDefault(); - } - - - @Override - public R visitIsValidHostLabel(IsValidHostLabel fn) { - return getDefault(); - } - - @Override - public R visitBoolEquals(BooleanEqualsFn fn) { - return getDefault(); - } - - @Override - public R visitStringEquals(StringEqualsFn fn) { - return getDefault(); - } - - @Override - public R visitIsSet(IsSet fn) { - return getDefault(); - } - - @Override - public R visitNot(Not not) { - return getDefault(); - } - - @Override - public R visitGetAttr(GetAttr getAttr) { - return getDefault(); - } - - @Override - public R visitParseUrl(ParseUrl parseUrl) { - return getDefault(); - } - - @Override - public R visitSubstring(Substring substring) { return getDefault(); } - - @Override - public R visitTreeRule(List rules) { - return getDefault(); - } - - @Override - public R visitErrorRule(Expr error) { - return getDefault(); - } - - @Override - public R visitEndpointRule(EndpointResult endpoint) { - return getDefault(); - } - - @Override - public R visitUriEncode(UriEncodeFn fn) { - return getDefault(); - } - - @Override - public R visitIsVirtualHostLabelsS3Bucket(IsVirtualHostableS3Bucket fn) { - return getDefault(); - } -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/EndpointTest.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/EndpointTest.java deleted file mode 100644 index 4636966756a2..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/EndpointTest.java +++ /dev/null @@ -1,241 +0,0 @@ -package software.amazon.awssdk.services.rules; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Optional; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Identifier; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Parameter; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.ParameterType; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleEngine; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleError; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Value; -import software.amazon.awssdk.utils.Pair; - -public class EndpointTest { - public static final String EXPECT = "expect"; - public static final String PARAMS = "params"; - public static final String DOCUMENTATION = "documentation"; - - private final String documentation; - - public Expectation getExpectation() { - return expectation; - } - - private final Expectation expectation; - - private final Value.Record params; - - private EndpointTest(Builder builder) { - this.documentation = builder.documentation; - this.expectation = Optional.ofNullable(builder.expectation).orElseThrow(NoSuchElementException::new); - this.params = Optional.ofNullable(builder.params).orElseThrow(NoSuchElementException::new);; - } - - public String getDocumentation() { - return documentation; - } - - public List> getParams() { - ArrayList> out = new ArrayList<>(); - params.forEach((name, value) -> { - out.add(Pair.of(name, value)); - }); - return out; - } - - public List getParameters() { - ArrayList result = new ArrayList(); - params.forEach((name, value) -> { - - Parameter.Builder pb = Parameter.builder().name(name); - - if (value instanceof Value.Str) { - pb.type(ParameterType.STRING); - result.add(pb.build()); - } else if (value instanceof Value.Bool) { - pb.type(ParameterType.BOOLEAN); - result.add(pb.build()); - } - }); - return result; - } - - public void execute(EndpointRuleset ruleset) { - Value actual = RuleEngine.defaultEngine().evaluate(ruleset, this.params.getValue()); - RuleError.ctx( - String.format("while executing test case%s", Optional - .ofNullable(documentation) - .map(d -> " " + d) - .orElse("")), - () -> expectation.check(actual) - ); - } - - public static EndpointTest fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Builder b = builder(); - - JsonNode documentationNode = objNode.get(DOCUMENTATION); - if (documentationNode != null) { - b.documentation(documentationNode.asString()); - } - - b.params(Value.fromNode(objNode.get(PARAMS)).expectRecord()); - b.expectation(Expectation.fromNode(objNode.get(EXPECT))); - - return b.build(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - EndpointTest that = (EndpointTest) o; - - if (documentation != null ? !documentation.equals(that.documentation) : that.documentation != null) - return false; - if (!expectation.equals(that.expectation)) return false; - return params.equals(that.params); - } - - @Override - public int hashCode() { - int result = documentation != null ? documentation.hashCode() : 0; - result = 31 * result + expectation.hashCode(); - result = 31 * result + params.hashCode(); - return result; - } - - public static Builder builder() { - return new Builder(); - } - - public static abstract class Expectation { - public static final String ERROR = "error"; - - public static Expectation fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Expectation result; - JsonNode errorNode = objNode.get(ERROR); - if (errorNode != null) { - result = new Error(errorNode.asString()); - } else { - result = new Endpoint(Value.endpointFromNode(node)); - } - return result; - } - - abstract void check(Value value); - - public static Error error(String message) { - return new Error(message); - } - - public static class Error extends Expectation { - public String getMessage() { - return message; - } - - private final String message; - - public Error(String message) { - this.message = message; - } - - @Override - void check(Value value) { - RuleError.ctx("While checking endpoint test (expecting an error)", () -> { - if (!value.expectString().equals(this.message)) { - throw new AssertionError(String.format("Expected error %s but got %s", this.message, value)); - } - }); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Error error = (Error) o; - - return message.equals(error.message); - } - - @Override - public int hashCode() { - return message.hashCode(); - } - } - - public static class Endpoint extends Expectation { - public Value.Endpoint getEndpoint() { - return endpoint; - } - - private final Value.Endpoint endpoint; - - public Endpoint(Value.Endpoint endpoint) { - this.endpoint = endpoint; - } - - @Override - void check(Value value) { - Value.Endpoint actual = value.expectEndpoint(); - if (!actual.equals(this.endpoint)) { - throw new AssertionError( - String.format("Expected endpoint:\n%s but got:\n%s", - this.endpoint.toString(), - actual)); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Endpoint endpoint1 = (Endpoint) o; - - return endpoint != null ? endpoint.equals(endpoint1.endpoint) : endpoint1.endpoint == null; - } - - @Override - public int hashCode() { - return endpoint != null ? endpoint.hashCode() : 0; - } - } - } - - public static class Builder { - private String documentation; - private Expectation expectation; - private Value.Record params; - - public Builder documentation(String documentation) { - this.documentation = documentation; - return this; - } - - public Builder expectation(Expectation expectation) { - this.expectation = expectation; - return this; - } - - public Builder params(Value.Record params) { - this.params = params; - return this; - } - - public EndpointTest build() { - return new EndpointTest(this); - } - } -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/EndpointTestSuite.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/EndpointTestSuite.java deleted file mode 100644 index 5ff9365cedec..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/EndpointTestSuite.java +++ /dev/null @@ -1,94 +0,0 @@ -package software.amazon.awssdk.services.rules; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset; - -public class EndpointTestSuite { - public static final String SERVICE = "service"; - public static final String TEST_CASES = "testCases"; - - private final List testCases; - private final String service; - - - public EndpointTestSuite(String service, List testCases) { - this.service = service; - this.testCases = testCases; - } - - private EndpointTestSuite(Builder b) { - this(b.service, b.testCases); - } - - public void execute(EndpointRuleset ruleset) { - for (EndpointTest test : this.getTestCases()) { - test.execute(ruleset); - } - } - - public static EndpointTestSuite fromNode(JsonNode node) { - Map objNode = node.asObject(); - - Builder b = builder(); - - b.service(objNode.get(SERVICE).asString()); - objNode.get(TEST_CASES).asArray() - .stream().map(EndpointTest::fromNode) - .forEach(b::addTestCase); - - return b.build(); - } - - public String getService() { - return service; - } - - public List getTestCases() { - return testCases; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - EndpointTestSuite that = (EndpointTestSuite) o; - - if (!testCases.equals(that.testCases)) return false; - return service.equals(that.service); - } - - @Override - public int hashCode() { - int result = testCases.hashCode(); - result = 31 * result + service.hashCode(); - return result; - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private String service; - private final List testCases = new ArrayList<>(); - - public Builder service(String service) { - this.service = service; - return this; - } - - public Builder addTestCase(EndpointTest testCase) { - this.testCases.add(testCase); - return this; - } - - public EndpointTestSuite build() { - return new EndpointTestSuite(this); - } - } - -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/IntegrationTest.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/IntegrationTest.java deleted file mode 100644 index bde0c8728ed1..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/IntegrationTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.services.rules; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.net.URL; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset; -import software.amazon.awssdk.services.rules.testutil.TestDiscovery; - -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -public class IntegrationTest { - private static final TestDiscovery TEST_DISCOVERY = new TestDiscovery(); - - @ParameterizedTest - @MethodSource("validTestcases") - void checkValidRules(ValidationTestCase validationTestCase) { - EndpointRuleset ruleset = EndpointRuleset.fromNode(validationTestCase.contents()); - List errors = new ValidateUriScheme().visitRuleset(ruleset) - .collect(Collectors.toList()); - assertEquals(errors, Collections.emptyList()); - } - - @ParameterizedTest - @MethodSource("checkableTestCases") - void executeTestSuite(TestDiscovery.RulesTestcase testcase) { - testcase.testcase().execute(testcase.ruleset()); - } - - private Stream validTestcases() { - return TEST_DISCOVERY.getValidRules() - .stream() - .map(name -> new ValidationTestCase(name, TEST_DISCOVERY.validRulesetUrl(name), TEST_DISCOVERY.testCaseUrl(name))); - } - - private Stream checkableTestCases() { - return TEST_DISCOVERY.testSuites() - .flatMap( - suite -> suite.testSuites() - .stream() - .flatMap(ts -> ts.getTestCases() - .stream() - .map(tc -> new TestDiscovery.RulesTestcase(suite.ruleset(), tc)))); - } - - public static final class ValidationTestCase { - private final String name; - private final URL ruleSet; - private final URL testCase; - - public ValidationTestCase(String name, URL ruleSet, URL testCase) { - this.name = name; - this.ruleSet = ruleSet; - this.testCase = testCase; - } - - JsonNode contents() { - try { - return JsonNode.parser().parse(ruleSet.openStream()); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public URL ruleSet() { - return ruleSet; - } - - public URL testCase() { - return testCase; - } - - @Override - public String toString() { - return name; - } - } -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/RuleEngineTest.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/RuleEngineTest.java deleted file mode 100644 index b97688fbaf17..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/RuleEngineTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package software.amazon.awssdk.services.rules; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.InputStream; -import java.util.Collections; -import org.junit.jupiter.api.Test; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; -import software.amazon.awssdk.protocols.jsoncore.JsonNodeParser; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Identifier; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.RuleEngine; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Value; -import software.amazon.awssdk.utils.MapUtils; - -public class RuleEngineTest { - private EndpointRuleset parse(String resource) { - InputStream is = getClass().getClassLoader().getResourceAsStream(resource); - JsonNode node = JsonNodeParser.create().parse(is); - return EndpointRuleset.fromNode(node); - } - - @Test - void testRuleEval() { - EndpointRuleset actual = parse("rules/valid-rules/minimal-ruleset.json"); - Value result = RuleEngine.defaultEngine().evaluate(actual, MapUtils.of(Identifier.of("Region"), Value.fromStr("us-east-1"))); - Value.Endpoint expected = Value.Endpoint.builder() - .url("https://us-east-1.amazonaws.com") - .property("authSchemes", Value.fromArray(Collections.singletonList( - Value.fromRecord(MapUtils.of( - Identifier.of("name"), Value.fromStr("v4"), - Identifier.of("signingScope"), Value.fromStr("us-east-1"), - Identifier.of("signingName"), Value.fromStr("serviceName") - )) - ))) - .build(); - - assertThat(result.expectEndpoint()).isEqualTo(expected); - } -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/TraversingVisitor.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/TraversingVisitor.java deleted file mode 100644 index d5124a6dbc46..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/TraversingVisitor.java +++ /dev/null @@ -1,63 +0,0 @@ -package software.amazon.awssdk.services.rules; - -import java.util.List; -import java.util.stream.Stream; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Condition; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Expr; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Fn; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Rule; - -public abstract class TraversingVisitor extends DefaultVisitor> { - public Stream visitRuleset(EndpointRuleset ruleset) { - return ruleset.getRules() - .stream() - .flatMap(this::handleRule); - } - - private Stream handleRule(Rule rule) { - Stream fromConditions = visitConditions(rule.getConditions()); - return Stream.concat(fromConditions, rule.accept(this)); - } - - @Override - public Stream visitFn(Fn fn) { - return fn.acceptFnVisitor(this); - } - - @Override - public Stream getDefault() { - return Stream.empty(); - } - - @Override - public Stream visitEndpointRule(EndpointResult endpoint) { - return visitEndpoint(endpoint); - } - - @Override - public Stream visitErrorRule(Expr error) { - return error.accept(this); - } - - @Override - public Stream visitTreeRule(List rules) { - return rules.stream().flatMap(subrule -> subrule.accept(this)); - } - - public Stream visitEndpoint(EndpointResult endpoint) { - return Stream.concat( - endpoint.getUrl() - .accept(this), - endpoint.getProperties() - .entrySet() - .stream() - .flatMap(map -> map.getValue().accept(this)) - ); - } - - public Stream visitConditions(List conditions) { - return conditions.stream().flatMap(c -> c.getFn().accept(this)); - } -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidateUriScheme.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidateUriScheme.java deleted file mode 100644 index 75daab21ccfc..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidateUriScheme.java +++ /dev/null @@ -1,71 +0,0 @@ -package software.amazon.awssdk.services.rules; - -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointResult; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Identifier; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Literal; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.Template; - -/** - * Validate that URIs start with a scheme - */ -public class ValidateUriScheme extends TraversingVisitor { - boolean checkingEndpoint = false; - - @Override - public Stream visitEndpoint(EndpointResult endpoint) { - checkingEndpoint = true; - Stream errors = endpoint.getUrl().accept(this); - checkingEndpoint = false; - return errors; - } - - @Override - public Stream visitLiteral(Literal literal) { - return literal.accept(new Literal.Visitor>() { - @Override - public Stream visitBool(boolean b) { - return Stream.empty(); - } - - @Override - public Stream visitStr(Template value) { - return validateTemplate(value); - } - - @Override - public Stream visitObject(Map members) { - return Stream.empty(); - } - - @Override - public Stream visitTuple(List members) { - return Stream.empty(); - } - - @Override - public Stream visitInt(int value) { - return Stream.empty(); - } - }); - } - - private Stream validateTemplate(Template template) { - if (checkingEndpoint) { - Template.Part head = template.getParts().get(0); - if (head instanceof Template.Literal) { - String templateStart = ((Template.Literal) head).getValue(); - if (!(templateStart.startsWith("http://") || templateStart.startsWith("https://"))) { - return Stream.of(new ValidationError( - ValidationErrorType.INVALID_URI, - "URI should start with `http://` or `https://` but the URI started with " + templateStart) - ); - } - } - /* Allow dynamic URIs for now—we should lint that at looks like a scheme at some point */ - } - return Stream.empty(); - } -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidationError.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidationError.java deleted file mode 100644 index 4e37db505cbb..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidationError.java +++ /dev/null @@ -1,41 +0,0 @@ -package software.amazon.awssdk.services.rules; - -import java.util.Objects; - -public final class ValidationError { - private final ValidationErrorType validationErrorType; - private final String error; - - public ValidationError(ValidationErrorType validationErrorType, String error) { - this.validationErrorType = validationErrorType; - this.error = error; - } - - public ValidationErrorType validationErrorType() { - return validationErrorType; - } - - public String error() { - return error; - } - - @Override - public String toString() { - return this.validationErrorType + ", " + this.error; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) return true; - if (obj == null || obj.getClass() != this.getClass()) return false; - ValidationError that = (ValidationError) obj; - return Objects.equals(this.validationErrorType, that.validationErrorType) && - Objects.equals(this.error, that.error); - } - - @Override - public int hashCode() { - return Objects.hash(validationErrorType, error); - } - -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidationErrorType.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidationErrorType.java deleted file mode 100644 index 36b4d93f6bd5..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/ValidationErrorType.java +++ /dev/null @@ -1,14 +0,0 @@ -package software.amazon.awssdk.services.rules; - -public enum ValidationErrorType { - INCONSISTENT_PARAMETER_TYPE, - UNSUPPORTED_PARAMETER_TYPE, - PARAMETER_MISMATCH, - PARAMETER_TYPE_MISMATCH, - SERVICE_ID_MISMATCH, - REQUIRED_PARAMETER_MISSING, - PARAMETER_IS_NOT_USED, - PARAMETER_IS_NOT_DEFINED, - - INVALID_URI, -} diff --git a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/testutil/TestDiscovery.java b/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/testutil/TestDiscovery.java deleted file mode 100644 index d8099708f535..000000000000 --- a/test/codegen-generated-classes-test/src/test/java/software/amazon/awssdk/services/rules/testutil/TestDiscovery.java +++ /dev/null @@ -1,196 +0,0 @@ -package software.amazon.awssdk.services.rules.testutil; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UncheckedIOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import software.amazon.awssdk.protocols.jsoncore.JsonNode; -import software.amazon.awssdk.services.restjsonendpointproviders.endpoints.internal.EndpointRuleset; -import software.amazon.awssdk.services.rules.EndpointTest; -import software.amazon.awssdk.services.rules.EndpointTestSuite; - -public class TestDiscovery { - private static final String RESOURCE_ROOT = "/rules"; - - public static final class RulesTestcase { - private final EndpointRuleset ruleset; - private final EndpointTest testcase; - - public RulesTestcase(EndpointRuleset ruleset, EndpointTest testcase) { - this.ruleset = ruleset; - this.testcase = testcase; - } - - @Override - public String toString() { - return testcase.getDocumentation(); - } - - public EndpointRuleset ruleset() { - return ruleset; - } - - public EndpointTest testcase() { - return testcase; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) return true; - if (obj == null || obj.getClass() != this.getClass()) return false; - RulesTestcase that = (RulesTestcase) obj; - return Objects.equals(this.ruleset, that.ruleset) && - Objects.equals(this.testcase, that.testcase); - } - - @Override - public int hashCode() { - return Objects.hash(ruleset, testcase); - } - - } - - public static final class RulesTestSuite { - private final EndpointRuleset ruleset; - private final List testSuites; - - public RulesTestSuite(EndpointRuleset ruleset, List testSuites) { - this.ruleset = ruleset; - this.testSuites = testSuites; - } - - @Override - public String toString() { - return ruleset.toString(); - } - - public EndpointRuleset ruleset() { - return ruleset; - } - - public List testSuites() { - return testSuites; - } - - @Override - public boolean equals(Object obj) { - if (obj == this) return true; - if (obj == null || obj.getClass() != this.getClass()) return false; - RulesTestSuite that = (RulesTestSuite) obj; - return Objects.equals(this.ruleset, that.ruleset) && - Objects.equals(this.testSuites, that.testSuites); - } - - @Override - public int hashCode() { - return Objects.hash(ruleset, testSuites); - } - - } - - public Stream testSuites() { - JsonNode.parser(); - List rulesetNodes = getValidRules() - .stream() - .map(e -> JsonNode.parser().parse(getResourceStream("valid-rules/" + e))) - .collect(Collectors.toList()); - - List testSuiteFiles = getManifestEntries("test-cases/manifest.txt") - .stream() - .map(e -> JsonNode.parser().parse(getResourceStream("test-cases/" + e))) - .collect(Collectors.toList()); - - List rulesets = rulesetNodes.stream() - .map(EndpointRuleset::fromNode) - .collect(Collectors.toList()); - List rulesetIds = rulesets.stream() - .map(EndpointRuleset::getServiceId) - .collect(Collectors.toList()); - if (rulesetIds.stream() - .distinct() - .count() != rulesets.size()) { - throw new RuntimeException(String.format("Duplicate service ids discovered: %s", rulesets.stream() - .map(EndpointRuleset::getServiceId) - .sorted() - .collect(Collectors.toList()))); - } - - List testSuites = testSuiteFiles.stream() - .map(EndpointTestSuite::fromNode) - .collect(Collectors.toList()); - testSuites.stream() - .filter(testSuite -> !rulesetIds.contains(testSuite.getService())) - .forEach(bad -> { - throw new RuntimeException("did not find service for " + bad.getService()); - }); - return rulesets.stream() - .map(ruleset -> { - List matchingTestSuites = testSuites.stream() - .filter(test -> test.getService() - .equals(ruleset.getServiceId())) - .collect(Collectors.toList()); - return new RulesTestSuite(ruleset, matchingTestSuites); - }); - } - - private List getManifestEntries(String path) { - String absPath = RESOURCE_ROOT + "/" + path; - try (BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(absPath)))) { - List entries = new ArrayList<>(); - while (true) { - String e = br.readLine(); - if (e == null) { - break; - } - entries.add(e); - } - return entries; - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - private InputStream getResourceStream(String path) { - String absPath = RESOURCE_ROOT + "/" + path; - return getClass().getResourceAsStream(absPath); - } - - private URL getResource(String path) { - String absPath = RESOURCE_ROOT + "/" + path; - return getClass().getResource(absPath); - } - - public RulesTestSuite getTestSuite(String name) { - return new RulesTestSuite(rulesetFromPath(name), Collections.singletonList(testSuiteFromPath(name))); - } - - public List getValidRules() { - return getManifestEntries("valid-rules/manifest.txt"); - } - - public URL validRulesetUrl(String name) { - return getResource("valid-rules/" + name); - } - - public URL testCaseUrl(String name) { - return getResource("test-cases/" + name); - } - - private EndpointRuleset rulesetFromPath(String name) { - return EndpointRuleset.fromNode(JsonNode.parser().parse(Objects.requireNonNull(this.getClass() - .getResourceAsStream(String.format("valid-rules/%s", name))))); - } - - private EndpointTestSuite testSuiteFromPath(String name) { - return EndpointTestSuite.fromNode(JsonNode.parser().parse(Objects.requireNonNull(this.getClass() - .getResourceAsStream(String.format("test-cases/%s", name))))); - } -}