From 9c6930e3833306a704925648eba37a082f0c19da Mon Sep 17 00:00:00 2001 From: Deepak Mishra <107930718+deepak-swirlds@users.noreply.github.com> Date: Tue, 24 Oct 2023 18:41:46 +0530 Subject: [PATCH] feat: Adding topology model classes and junit annotation processing (#383) Signed-off-by: Deepak Mishra --- .../extensions/TestSetupExtension.java | 62 +++++++++++++++++- .../annotation-processing.drawio.png | Bin 0 -> 33069 bytes .../junit/support/model/ApplicationNodes.java | 39 +++++++++++ .../support/model/ConfigurationValue.java | 39 +++++++++++ .../model/NetworkDeploymentConfiguration.java | 48 ++++++++++++++ .../support/model/PlatformApplication.java | 47 +++++++++++++ .../support/model/PlatformConfiguration.java | 41 ++++++++++++ .../junit/support/model/ResourceShape.java | 33 ++++++++++ 8 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/annotation-processing.drawio.png create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/ApplicationNodes.java create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/ConfigurationValue.java create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/NetworkDeploymentConfiguration.java create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/PlatformApplication.java create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/PlatformConfiguration.java create mode 100644 fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/ResourceShape.java diff --git a/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/TestSetupExtension.java b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/TestSetupExtension.java index 4ff797802..137b9ff39 100644 --- a/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/TestSetupExtension.java +++ b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/TestSetupExtension.java @@ -16,6 +16,16 @@ package com.hedera.fullstack.junit.support.extensions; +import com.hedera.fullstack.junit.support.annotations.application.ApplicationNodes; +import com.hedera.fullstack.junit.support.annotations.application.PlatformApplication; +import com.hedera.fullstack.junit.support.annotations.application.PlatformConfiguration; +import com.hedera.fullstack.junit.support.model.ConfigurationValue; +import com.hedera.fullstack.junit.support.model.NetworkDeploymentConfiguration; +import com.hedera.fullstack.junit.support.model.ResourceShape; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Optional; +import java.util.stream.Stream; import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -28,7 +38,57 @@ public class TestSetupExtension implements BeforeEachCallback { * * @param context the current extension context; never {@code null} * @throws Exception if an error occurs during callback execution. + * + *

annotation processing call flow

*/ @Override - public void beforeEach(final ExtensionContext context) throws Exception {} + public void beforeEach(final ExtensionContext context) throws Exception { + + Optional testMethod = context.getTestMethod(); + + if (testMethod.isPresent()) { + // FUTURE: add support for NamedApplicationNodes + ApplicationNodes applicationNodes = testMethod.get().getAnnotation(ApplicationNodes.class); + PlatformApplication platformApplication = testMethod.get().getAnnotation(PlatformApplication.class); + PlatformConfiguration platformConfigurations = testMethod.get().getAnnotation(PlatformConfiguration.class); + + // Convert the annotations to model class objects + com.hedera.fullstack.junit.support.model.ApplicationNodes.Builder appNodesBuilder = + new com.hedera.fullstack.junit.support.model.ApplicationNodes.Builder(); + if (applicationNodes != null) { + appNodesBuilder + .value(applicationNodes.value()) + .shape(new ResourceShape.Builder() + .cpuInMillis(applicationNodes.shape().cpuInMillis()) + .build()); + } + + com.hedera.fullstack.junit.support.model.PlatformApplication.Builder platformAppBuilder = + new com.hedera.fullstack.junit.support.model.PlatformApplication.Builder(); + if (platformApplication != null) { + platformAppBuilder + .fileName(platformApplication.fileName()) + .parameters( + Arrays.stream(platformApplication.parameters()).toList()); + } + + com.hedera.fullstack.junit.support.model.PlatformConfiguration.Builder platformConfigBuilder = + new com.hedera.fullstack.junit.support.model.PlatformConfiguration.Builder(); + if (platformConfigurations != null) { + Stream.of(platformConfigurations.value()) + .forEach(config -> + // FUTURE: support values[] + platformConfigBuilder.addConfigurationValue( + new ConfigurationValue(config.name(), config.value()))); + } + + // Topology holds all the information needed to provision + NetworkDeploymentConfiguration networkDeploymentConfiguration = new NetworkDeploymentConfiguration.Builder() + .applicationNodes(appNodesBuilder.build()) + .platformApplication(platformAppBuilder.build()) + .platformConfiguration(platformConfigBuilder.build()) + .build(); + // FUTURE: provision this topology using test tool kit here + } + } } diff --git a/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/annotation-processing.drawio.png b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/extensions/annotation-processing.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..71aee8859da974c18d8b73a7ffbdc08b131b9986 GIT binary patch literal 33069 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

yt`kB-qvD+NQf{(nd#Os@Znwu; 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 parameters) { + + public static class Builder { + private String fileName; + private List parameters = new ArrayList<>(); + + public Builder fileName(String fileName) { + this.fileName = fileName; + return this; + } + + public Builder parameters(List parameters) { + this.parameters = parameters; + return this; + } + + public Builder addParameter(String parameter) { + this.parameters.add(parameter); + return this; + } + + public PlatformApplication build() { + return new PlatformApplication(fileName, parameters); + } + } +} diff --git a/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/PlatformConfiguration.java b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/PlatformConfiguration.java new file mode 100644 index 000000000..8cf770d91 --- /dev/null +++ b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/PlatformConfiguration.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License 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 com.hedera.fullstack.junit.support.model; + +import java.util.ArrayList; +import java.util.List; + +public record PlatformConfiguration(List configurationValues) { + + public static class Builder { + private List configurationValues = new ArrayList<>(); + + public Builder configurationValues(List configurationValues) { + this.configurationValues = configurationValues; + return this; + } + + public Builder addConfigurationValue(ConfigurationValue configurationValue) { + this.configurationValues.add(configurationValue); + return this; + } + + public PlatformConfiguration build() { + return new PlatformConfiguration(configurationValues); + } + } +} diff --git a/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/ResourceShape.java b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/ResourceShape.java new file mode 100644 index 000000000..041183ba0 --- /dev/null +++ b/fullstack-junit-support/src/main/java/com/hedera/fullstack/junit/support/model/ResourceShape.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2023 Hedera Hashgraph, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License 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 com.hedera.fullstack.junit.support.model; + +public record ResourceShape(float cpuInMillis) { + + public static class Builder { + private float cpuInMillis; + + public Builder cpuInMillis(float cpuInMillis) { + this.cpuInMillis = cpuInMillis; + return this; + } + + public ResourceShape build() { + return new ResourceShape(cpuInMillis); + } + } +}