From 61aa368887d711b160fb16b3734bae6f8f03bd8c Mon Sep 17 00:00:00 2001 From: Nathan Klick Date: Thu, 3 Aug 2023 10:47:27 -0500 Subject: [PATCH 01/27] chore: added unit test coverage Signed-off-by: Nathan Klick --- .../service/locator/api/ArtifactLoader.java | 2 +- .../locator/test/api/ArtifactLoaderTest.java | 30 +++++++++++++++---- .../locator/test/mock/MockSlf4jLocator.java | 5 ++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/fullstack-service-locator/src/main/java/com/hedera/fullstack/service/locator/api/ArtifactLoader.java b/fullstack-service-locator/src/main/java/com/hedera/fullstack/service/locator/api/ArtifactLoader.java index 9dce1a812..1380a3d8f 100644 --- a/fullstack-service-locator/src/main/java/com/hedera/fullstack/service/locator/api/ArtifactLoader.java +++ b/fullstack-service-locator/src/main/java/com/hedera/fullstack/service/locator/api/ArtifactLoader.java @@ -338,7 +338,7 @@ private void loadModules(final ModuleLayer parentLayer) { final ModuleFinder finder = ModuleFinder.of(modulePath.toArray(new Path[0])); try { final Configuration cfg = - parentLayer.configuration().resolve(finder, ModuleFinder.of(), Collections.emptySet()); + parentLayer.configuration().resolveAndBind(finder, ModuleFinder.of(), Collections.emptySet()); moduleLayer = parentLayer.defineModulesWithOneLoader(cfg, classLoader); } catch (LayerInstantiationException | SecurityException e) { LOGGER.atError().setCause(e).log("Failed to instantiate module layer, unable to load module path entries"); diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java index 858c362bf..8c6927cd9 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java @@ -16,16 +16,20 @@ package com.hedera.fullstack.service.locator.test.api; -import static org.assertj.core.api.Assertions.assertThat; - import com.hedera.fullstack.base.api.resource.ResourceLoader; import com.hedera.fullstack.service.locator.api.ArtifactLoader; -import java.io.IOException; -import java.net.URLClassLoader; -import java.nio.file.Path; +import com.hedera.fullstack.service.locator.api.ServiceLocator; +import com.hedera.fullstack.service.locator.test.mock.MockSlf4jLocator; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.slf4j.spi.SLF4JServiceProvider; + +import java.io.IOException; +import java.net.URLClassLoader; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; @DisplayName("Artifact Loader") class ArtifactLoaderTest { @@ -42,7 +46,7 @@ static void setup() throws IOException { } @Test - @DisplayName("Logback: Artifacts dynamically loaded") + @DisplayName("Logback: Artifacts dynamically loaded successfully") void logbackDynamicLoading() { final ArtifactLoader artifactLoader = ArtifactLoader.from(JAR_PATH); assertThat(artifactLoader).isNotNull(); @@ -51,4 +55,18 @@ void logbackDynamicLoading() { assertThat(artifactLoader.classPath()).isNotEmpty(); assertThat(artifactLoader.modulePath()).isNotEmpty(); } + + @Test + @DisplayName("Logback: Artifacts dynamically loaded can be used by Service Loader") + void logbackDynamicServiceLoading() { + final ArtifactLoader artifactLoader = ArtifactLoader.from(JAR_PATH); + assertThat(artifactLoader).isNotNull(); + + final ServiceLocator serviceLocator = MockSlf4jLocator.create(artifactLoader); + assertThat(serviceLocator).isNotNull(); + + final SLF4JServiceProvider serviceProvider = serviceLocator.findFirst().orElseThrow(); + assertThat(serviceProvider).isNotNull().extracting(Object::getClass).extracting(Class::getName) + .isEqualTo("ch.qos.logback.classic.spi.LogbackServiceProvider"); + } } diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/mock/MockSlf4jLocator.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/mock/MockSlf4jLocator.java index c54946fef..cb6085c57 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/mock/MockSlf4jLocator.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/mock/MockSlf4jLocator.java @@ -16,6 +16,7 @@ package com.hedera.fullstack.service.locator.test.mock; +import com.hedera.fullstack.service.locator.api.ArtifactLoader; import com.hedera.fullstack.service.locator.api.ServiceLocator; import java.util.ServiceLoader; import org.slf4j.spi.SLF4JServiceProvider; @@ -28,4 +29,8 @@ private MockSlf4jLocator(ServiceLoader serviceLoader) { public static ServiceLocator create() { return new MockSlf4jLocator(ServiceLoader.load(SLF4JServiceProvider.class)); } + + public static ServiceLocator create(final ArtifactLoader loader) { + return new MockSlf4jLocator(ServiceLoader.load(loader.moduleLayer(), SLF4JServiceProvider.class)); + } } From 25263626dcc52b6f3288f33e6e7ac7496f3a5509 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Thu, 3 Aug 2023 21:19:34 +0100 Subject: [PATCH 02/27] @DisplayName("CtorService: Locator's iterator removes entry") Signed-off-by: Jeromy Cannon --- .../locator/test/api/ServiceLocatorTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ServiceLocatorTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ServiceLocatorTest.java index 02e9ffefa..5f4e97547 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ServiceLocatorTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ServiceLocatorTest.java @@ -17,11 +17,14 @@ package com.hedera.fullstack.service.locator.test.api; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.hedera.fullstack.service.locator.api.ServiceLocator; +import com.hedera.fullstack.service.locator.api.ServiceSupplier; import com.hedera.fullstack.service.locator.test.mock.CtorService; import com.hedera.fullstack.service.locator.test.mock.MockCtorService; import com.hedera.fullstack.service.locator.test.mock.MockLocator; +import java.util.Iterator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -75,4 +78,14 @@ void locatorHasWorkingReloadSupport() { locator.reload(); assertThat(locator.stream().count()).isEqualTo(2); } + + @Test + @DisplayName("CtorService: Locator's iterator removes entry") + void locatorIteratorRemovesEntry() { + final ServiceLocator locator = MockLocator.create(); + assertThat(locator).isNotNull(); + assertThat(locator.stream().count()).isEqualTo(2); + Iterator> iterator = locator.iterator(); + assertThatThrownBy(iterator::remove).isInstanceOf(UnsupportedOperationException.class); + } } From 74a4e4a2bd68b0c27e7cc52ffe4f708a1a34e052 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Fri, 4 Aug 2023 16:31:15 +0100 Subject: [PATCH 03/27] testWrapperAsPrimitiveClass Signed-off-by: Jeromy Cannon --- .../api/test/reflect/ReflectionUtilsTest.java | 72 +++++++++++++++++++ .../locator/test/api/ArtifactLoaderTest.java | 16 +++-- 2 files changed, 81 insertions(+), 7 deletions(-) create mode 100644 fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java new file mode 100644 index 000000000..34da1d478 --- /dev/null +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -0,0 +1,72 @@ +/* + * 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.base.api.test.reflect; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Named.named; + +import com.hedera.fullstack.base.api.reflect.ReflectionUtils; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Named; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class ReflectionUtilsTest { + private record WrapperAsPrimitiveClassTestParameters(Class wrapperClass, Class primitiveClass) {} + + @ParameterizedTest + @MethodSource + @DisplayName("Test wrapper as primitive class") + void testWrapperAsPrimitiveClass(WrapperAsPrimitiveClassTestParameters parameters) { + Class wrapperClass = parameters.wrapperClass(); + Class primitiveClass = parameters.primitiveClass(); + Class result = ReflectionUtils.wrapperAsPrimitiveClass(wrapperClass); + assertThat(result).isEqualTo(primitiveClass); + } + + static Stream> testWrapperAsPrimitiveClass() { + return Stream.of( + named( + "Validate primitive for Void.class", + new WrapperAsPrimitiveClassTestParameters(Void.class, void.class)), + named( + "Validate primitive for Boolean.class", + new WrapperAsPrimitiveClassTestParameters(Boolean.class, boolean.class)), + named( + "Validate primitive for Byte.class", + new WrapperAsPrimitiveClassTestParameters(Byte.class, byte.class)), + named( + "Validate primitive for Character.class", + new WrapperAsPrimitiveClassTestParameters(Character.class, char.class)), + named( + "Validate primitive for Short.class", + new WrapperAsPrimitiveClassTestParameters(Short.class, short.class)), + named( + "Validate primitive for Integer.class", + new WrapperAsPrimitiveClassTestParameters(Integer.class, int.class)), + named( + "Validate primitive for Long.class", + new WrapperAsPrimitiveClassTestParameters(Long.class, long.class)), + named( + "Validate primitive for Float.class", + new WrapperAsPrimitiveClassTestParameters(Float.class, float.class)), + named( + "Validate primitive for Double.class", + new WrapperAsPrimitiveClassTestParameters(Double.class, double.class))); + } +} diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java index 8c6927cd9..2edde67f6 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java @@ -16,21 +16,20 @@ package com.hedera.fullstack.service.locator.test.api; +import static org.assertj.core.api.Assertions.assertThat; + import com.hedera.fullstack.base.api.resource.ResourceLoader; import com.hedera.fullstack.service.locator.api.ArtifactLoader; import com.hedera.fullstack.service.locator.api.ServiceLocator; import com.hedera.fullstack.service.locator.test.mock.MockSlf4jLocator; +import java.io.IOException; +import java.net.URLClassLoader; +import java.nio.file.Path; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.slf4j.spi.SLF4JServiceProvider; -import java.io.IOException; -import java.net.URLClassLoader; -import java.nio.file.Path; - -import static org.assertj.core.api.Assertions.assertThat; - @DisplayName("Artifact Loader") class ArtifactLoaderTest { @@ -66,7 +65,10 @@ void logbackDynamicServiceLoading() { assertThat(serviceLocator).isNotNull(); final SLF4JServiceProvider serviceProvider = serviceLocator.findFirst().orElseThrow(); - assertThat(serviceProvider).isNotNull().extracting(Object::getClass).extracting(Class::getName) + assertThat(serviceProvider) + .isNotNull() + .extracting(Object::getClass) + .extracting(Class::getName) .isEqualTo("ch.qos.logback.classic.spi.LogbackServiceProvider"); } } From 1588bea8d472e009d352e67469b3b119d306a36f Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Fri, 4 Aug 2023 19:35:25 +0100 Subject: [PATCH 04/27] testWrapperAsPrimitiveClass (default) Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index 34da1d478..a2da17de1 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -67,6 +67,9 @@ static Stream> testWrapperAsPrimiti new WrapperAsPrimitiveClassTestParameters(Float.class, float.class)), named( "Validate primitive for Double.class", - new WrapperAsPrimitiveClassTestParameters(Double.class, double.class))); + new WrapperAsPrimitiveClassTestParameters(Double.class, double.class)), + named( + "Validate primitive for String.class", + new WrapperAsPrimitiveClassTestParameters(String.class, String.class))); } } From a95b368dbddb608c4b31b10bc62b1b32c05f7263 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Fri, 4 Aug 2023 19:39:02 +0100 Subject: [PATCH 05/27] testPrimitiveAsWrapperClass Signed-off-by: Jeromy Cannon --- .../api/test/reflect/ReflectionUtilsTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index a2da17de1..394cbb216 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -29,6 +29,52 @@ public class ReflectionUtilsTest { private record WrapperAsPrimitiveClassTestParameters(Class wrapperClass, Class primitiveClass) {} + private record PrimitiveAsWrapperClassTestParameters(Class primitiveClass, Class wrapperClass) {} + + @ParameterizedTest + @MethodSource + @DisplayName("Test primitive as wrapper class") + void testPrimitiveAsWrapperClass(PrimitiveAsWrapperClassTestParameters parameters) { + Class primitiveClass = parameters.primitiveClass(); + Class wrapperClass = parameters.wrapperClass(); + Class result = ReflectionUtils.primitiveAsWrapperClass(primitiveClass); + assertThat(result).isEqualTo(wrapperClass); + } + + static Stream> testPrimitiveAsWrapperClass() { + return Stream.of( + named( + "Validate wrapper for void.class", + new PrimitiveAsWrapperClassTestParameters(void.class, Void.class)), + named( + "Validate wrapper for boolean.class", + new PrimitiveAsWrapperClassTestParameters(boolean.class, Boolean.class)), + named( + "Validate wrapper for byte.class", + new PrimitiveAsWrapperClassTestParameters(byte.class, Byte.class)), + named( + "Validate wrapper for char.class", + new PrimitiveAsWrapperClassTestParameters(char.class, Character.class)), + named( + "Validate wrapper for short.class", + new PrimitiveAsWrapperClassTestParameters(short.class, Short.class)), + named( + "Validate wrapper for int.class", + new PrimitiveAsWrapperClassTestParameters(int.class, Integer.class)), + named( + "Validate wrapper for long.class", + new PrimitiveAsWrapperClassTestParameters(long.class, Long.class)), + named( + "Validate wrapper for float.class", + new PrimitiveAsWrapperClassTestParameters(float.class, Float.class)), + named( + "Validate wrapper for double.class", + new PrimitiveAsWrapperClassTestParameters(double.class, Double.class)), + named( + "Validate wrapper for String.class", + new PrimitiveAsWrapperClassTestParameters(String.class, String.class))); + } + @ParameterizedTest @MethodSource @DisplayName("Test wrapper as primitive class") From bed415d6120e5e523535584eefae07eb7932c71e Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Fri, 4 Aug 2023 20:32:51 +0100 Subject: [PATCH 06/27] testLoad Signed-off-by: Jeromy Cannon --- .../api/test/resource/ResourceLoaderTest.java | 28 +++++++++++++++++++ .../src/test/resources/resource.txt | 1 + 2 files changed, 29 insertions(+) create mode 100644 fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java create mode 100644 fullstack-base-api/src/test/resources/resource.txt diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java new file mode 100644 index 000000000..5525193ad --- /dev/null +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java @@ -0,0 +1,28 @@ +package com.hedera.fullstack.base.api.test.resource; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.hedera.fullstack.base.api.resource.ResourceLoader; +import java.io.IOException; +import java.nio.file.Path; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class ResourceLoaderTest { + @Test + @DisplayName("Verify load works as expected") + void testLoad() throws IOException { + ResourceLoader resourceLoader = new ResourceLoader<>(ResourceLoaderTest.class); + Path resourcePath = resourceLoader.load("resource.txt"); + assertThat(resourcePath) + .exists() + .isRegularFile() + .hasFileName("resource.txt") + .isWritable() + .isReadable() + .isExecutable(); + } +} diff --git a/fullstack-base-api/src/test/resources/resource.txt b/fullstack-base-api/src/test/resources/resource.txt new file mode 100644 index 000000000..2125dcd86 --- /dev/null +++ b/fullstack-base-api/src/test/resources/resource.txt @@ -0,0 +1 @@ +This is some text for testing purposes. \ No newline at end of file From 26aadf4d013388e009ece9d3799d7a55b88ca965 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Fri, 4 Aug 2023 20:38:34 +0100 Subject: [PATCH 07/27] testLoadIOException Signed-off-by: Jeromy Cannon --- .../api/test/resource/ResourceLoaderTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java index 5525193ad..80c7f7206 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/resource/ResourceLoaderTest.java @@ -1,6 +1,23 @@ +/* + * 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.base.api.test.resource; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.hedera.fullstack.base.api.resource.ResourceLoader; import java.io.IOException; @@ -25,4 +42,11 @@ void testLoad() throws IOException { .isReadable() .isExecutable(); } + + @Test + @DisplayName("Verify load fails when called with a non-existent file") + void testLoadIOException() { + ResourceLoader resourceLoader = new ResourceLoader<>(ResourceLoaderTest.class); + assertThatThrownBy(() -> resourceLoader.load("not-resource.txt")).isInstanceOf(IOException.class); + } } From aaf2d8ff06a73bfc850be3d47eb436774aa5869b Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 14:47:07 +0100 Subject: [PATCH 08/27] test load directory with no modules Signed-off-by: Jeromy Cannon --- fullstack-bom/build.gradle.kts | 2 +- fullstack-service-locator/build.gradle.kts | 8 +++++++- .../locator/test/api/ArtifactLoaderTest.java | 20 +++++++++++++++++++ .../src/test/java/module-info.java | 1 + .../src/test/resources/no-modules/.gitkeep | 0 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 fullstack-service-locator/src/test/resources/no-modules/.gitkeep diff --git a/fullstack-bom/build.gradle.kts b/fullstack-bom/build.gradle.kts index 40abf5408..b0d3c4478 100644 --- a/fullstack-bom/build.gradle.kts +++ b/fullstack-bom/build.gradle.kts @@ -41,7 +41,7 @@ dependencies.constraints { api("org.slf4j:slf4j-api:2.0.7") api("org.slf4j:slf4j-nop:2.0.7") api("org.slf4j:slf4j-simple:2.0.7") - api("com.jcovalent.junit:jcovalent-junit-logging:0.2.0") + api("com.jcovalent.junit:jcovalent-junit-logging:0.3.0") api("io.github.classgraph:classgraph:4.8.161") for (p in rootProject.childProjects) { diff --git a/fullstack-service-locator/build.gradle.kts b/fullstack-service-locator/build.gradle.kts index 292fb0dca..23b53b3e5 100644 --- a/fullstack-service-locator/build.gradle.kts +++ b/fullstack-service-locator/build.gradle.kts @@ -19,4 +19,10 @@ plugins { id("com.hedera.fullstack.maven-publish") } -dependencies { api(platform(project(":fullstack-bom"))) } +dependencies { + // Bill of Materials + implementation(platform(project(":fullstack-bom"))) + javaModuleDependencies { + testImplementation(gav("com.jcovalent.junit.logging")) + } +} diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java index 2edde67f6..98457ff2a 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java @@ -22,15 +22,22 @@ import com.hedera.fullstack.service.locator.api.ArtifactLoader; import com.hedera.fullstack.service.locator.api.ServiceLocator; import com.hedera.fullstack.service.locator.test.mock.MockSlf4jLocator; +import com.jcovalent.junit.logging.JCovalentLoggingSupport; +import com.jcovalent.junit.logging.LogEntryBuilder; +import com.jcovalent.junit.logging.LoggingOutput; +import com.jcovalent.junit.logging.assertj.LoggingOutputAssert; import java.io.IOException; import java.net.URLClassLoader; import java.nio.file.Path; +import java.util.List; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.slf4j.event.Level; import org.slf4j.spi.SLF4JServiceProvider; @DisplayName("Artifact Loader") +@JCovalentLoggingSupport class ArtifactLoaderTest { private static final ResourceLoader RESOURCE_LOADER = @@ -71,4 +78,17 @@ void logbackDynamicServiceLoading() { .extracting(Class::getName) .isEqualTo("ch.qos.logback.classic.spi.LogbackServiceProvider"); } + + @Test + @DisplayName("Logback: Artifacts dynamically loaded with an empty directory") + void logbackDynamicServiceLoadingEmptyDirectory(final LoggingOutput loggingOutput) { + final ArtifactLoader artifactLoader = ArtifactLoader.from(Path.of("no-modules")); + assertThat(artifactLoader).isNotNull(); + LoggingOutputAssert.assertThat(loggingOutput) + .hasAtLeastOneEntry(List.of( + LogEntryBuilder.builder() + .level(Level.DEBUG) + .message("No module path entries found, skipping module layer creation") + .build())); + } } diff --git a/fullstack-service-locator/src/test/java/module-info.java b/fullstack-service-locator/src/test/java/module-info.java index 4c33a9a33..6ca6b4241 100644 --- a/fullstack-service-locator/src/test/java/module-info.java +++ b/fullstack-service-locator/src/test/java/module-info.java @@ -15,6 +15,7 @@ requires com.hedera.fullstack.base.api; requires com.hedera.fullstack.service.locator; + requires com.jcovalent.junit.logging; requires org.assertj.core; requires org.junit.jupiter.api; requires org.slf4j; diff --git a/fullstack-service-locator/src/test/resources/no-modules/.gitkeep b/fullstack-service-locator/src/test/resources/no-modules/.gitkeep new file mode 100644 index 000000000..e69de29bb From 199355b881373a7a1eb2d0380ddc12af4bc352c0 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 14:53:26 +0100 Subject: [PATCH 09/27] logbackDynamicServiceRecursiveFolderLoading Signed-off-by: Jeromy Cannon --- .../locator/test/api/ArtifactLoaderTest.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java index 98457ff2a..a789450a0 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java @@ -66,17 +66,7 @@ void logbackDynamicLoading() { @DisplayName("Logback: Artifacts dynamically loaded can be used by Service Loader") void logbackDynamicServiceLoading() { final ArtifactLoader artifactLoader = ArtifactLoader.from(JAR_PATH); - assertThat(artifactLoader).isNotNull(); - - final ServiceLocator serviceLocator = MockSlf4jLocator.create(artifactLoader); - assertThat(serviceLocator).isNotNull(); - - final SLF4JServiceProvider serviceProvider = serviceLocator.findFirst().orElseThrow(); - assertThat(serviceProvider) - .isNotNull() - .extracting(Object::getClass) - .extracting(Class::getName) - .isEqualTo("ch.qos.logback.classic.spi.LogbackServiceProvider"); + assertServiceLocatorLoadedCorrectly(artifactLoader); } @Test @@ -91,4 +81,26 @@ void logbackDynamicServiceLoadingEmptyDirectory(final LoggingOutput loggingOutpu .message("No module path entries found, skipping module layer creation") .build())); } + + @Test + @DisplayName("Logback: Artifacts dynamically recursive folder loaded can be used by Service Loader") + void logbackDynamicServiceRecursiveFolderLoading() { + final ArtifactLoader artifactLoader = ArtifactLoader.from(true, Path.of(".")); + assertServiceLocatorLoadedCorrectly(artifactLoader); + } + + private void assertServiceLocatorLoadedCorrectly(ArtifactLoader artifactLoader) { + assertThat(artifactLoader).isNotNull(); + + final ServiceLocator serviceLocator = MockSlf4jLocator.create(artifactLoader); + assertThat(serviceLocator).isNotNull(); + + final SLF4JServiceProvider serviceProvider = serviceLocator.findFirst().orElseThrow(); + assertThat(serviceProvider) + .isNotNull() + .extracting(Object::getClass) + .extracting(Class::getName) + .isEqualTo("ch.qos.logback.classic.spi.LogbackServiceProvider"); + } + } From 39704b9dda935eb8ee63532d6876b4b03dc71ec6 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 15:06:00 +0100 Subject: [PATCH 10/27] logbackDynamicServiceLoadingWithNoPaths Signed-off-by: Jeromy Cannon --- .../locator/test/api/ArtifactLoaderTest.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java index a789450a0..8ed831d11 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java @@ -17,6 +17,7 @@ package com.hedera.fullstack.service.locator.test.api; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.hedera.fullstack.base.api.resource.ResourceLoader; import com.hedera.fullstack.service.locator.api.ArtifactLoader; @@ -75,11 +76,10 @@ void logbackDynamicServiceLoadingEmptyDirectory(final LoggingOutput loggingOutpu final ArtifactLoader artifactLoader = ArtifactLoader.from(Path.of("no-modules")); assertThat(artifactLoader).isNotNull(); LoggingOutputAssert.assertThat(loggingOutput) - .hasAtLeastOneEntry(List.of( - LogEntryBuilder.builder() - .level(Level.DEBUG) - .message("No module path entries found, skipping module layer creation") - .build())); + .hasAtLeastOneEntry(List.of(LogEntryBuilder.builder() + .level(Level.DEBUG) + .message("No module path entries found, skipping module layer creation") + .build())); } @Test @@ -103,4 +103,10 @@ private void assertServiceLocatorLoadedCorrectly(ArtifactLoader artifactLoader) .isEqualTo("ch.qos.logback.classic.spi.LogbackServiceProvider"); } + @Test + @DisplayName("Logback: Artifacts load fails with no paths") + void logbackDynamicServiceLoadingWithNoPaths(final LoggingOutput loggingOutput) { + Path[] emptyPaths = new Path[0]; + assertThatThrownBy(() -> ArtifactLoader.from(emptyPaths)).isInstanceOf(IllegalArgumentException.class); + } } From be45381a1a64579bc0335cf67fae40599c0dcac1 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 15:06:21 +0100 Subject: [PATCH 11/27] spotlessApply Signed-off-by: Jeromy Cannon --- fullstack-service-locator/build.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fullstack-service-locator/build.gradle.kts b/fullstack-service-locator/build.gradle.kts index 23b53b3e5..0916ecbcd 100644 --- a/fullstack-service-locator/build.gradle.kts +++ b/fullstack-service-locator/build.gradle.kts @@ -22,7 +22,5 @@ plugins { dependencies { // Bill of Materials implementation(platform(project(":fullstack-bom"))) - javaModuleDependencies { - testImplementation(gav("com.jcovalent.junit.logging")) - } + javaModuleDependencies { testImplementation(gav("com.jcovalent.junit.logging")) } } From 284c2954d08adb56b152fab9aac9dc10b5fe1325 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 15:09:17 +0100 Subject: [PATCH 12/27] call with empty parent to get more coverage Signed-off-by: Jeromy Cannon --- .../fullstack/service/locator/test/api/ArtifactLoaderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java index 8ed831d11..779419d6c 100644 --- a/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java +++ b/fullstack-service-locator/src/test/java/com/hedera/fullstack/service/locator/test/api/ArtifactLoaderTest.java @@ -107,6 +107,6 @@ private void assertServiceLocatorLoadedCorrectly(ArtifactLoader artifactLoader) @DisplayName("Logback: Artifacts load fails with no paths") void logbackDynamicServiceLoadingWithNoPaths(final LoggingOutput loggingOutput) { Path[] emptyPaths = new Path[0]; - assertThatThrownBy(() -> ArtifactLoader.from(emptyPaths)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> ArtifactLoader.from(null, emptyPaths)).isInstanceOf(IllegalArgumentException.class); } } From 65ce21c1a2671e23cbfa7f107b1c7486212cab45 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 15:51:20 +0100 Subject: [PATCH 13/27] coverage for a jar with no manifest and no module descriptor Signed-off-by: Jeromy Cannon --- .../src/test/resources/modules/text.jar | Bin 0 -> 480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fullstack-service-locator/src/test/resources/modules/text.jar diff --git a/fullstack-service-locator/src/test/resources/modules/text.jar b/fullstack-service-locator/src/test/resources/modules/text.jar new file mode 100644 index 0000000000000000000000000000000000000000..80f65eb440500fefaffcd822bef48a2942225626 GIT binary patch literal 480 zcmWIWW@h1H;9y{2P_1JR2U2jr!JxoUl3G!sS5i?D8p6xKp2l)91%^v2xEUB(zA-W| zu!sP41bDN9jDUjxps6B2Q#nvfy#tgN2AUcl@9XI79~_~t7mw9~VxUE679=N#CZ{JP zC4BJp3H!hw))COaG(mz{T|k=gqm}~O$M*&TtTN6{O$&S`^l3W0X40WCT%wH!B;+5GEkp4y1*F Ik;A|M03x$({Qv*} literal 0 HcmV?d00001 From 94d2bc6c445ff1f1f5d218cee3e5e497c29d1ff9 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 15:59:42 +0100 Subject: [PATCH 14/27] test key value pair equals and hash code, fix equals comparison Signed-off-by: Jeromy Cannon --- .../base/api/collections/KeyValuePair.java | 2 +- .../test/collections/KeyValuePairTest.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/collections/KeyValuePairTest.java diff --git a/fullstack-base-api/src/main/java/com/hedera/fullstack/base/api/collections/KeyValuePair.java b/fullstack-base-api/src/main/java/com/hedera/fullstack/base/api/collections/KeyValuePair.java index 53f49f261..e49f7d010 100644 --- a/fullstack-base-api/src/main/java/com/hedera/fullstack/base/api/collections/KeyValuePair.java +++ b/fullstack-base-api/src/main/java/com/hedera/fullstack/base/api/collections/KeyValuePair.java @@ -47,7 +47,7 @@ public static KeyValuePair of(final K key, final V value) { public boolean equals(final Object o) { if (this == o) return true; if (!(o instanceof KeyValuePair that)) return false; - return Objects.equals(key, that.key); + return Objects.equals(key, that.key) && Objects.equals(value, that.value); } @Override diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/collections/KeyValuePairTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/collections/KeyValuePairTest.java new file mode 100644 index 000000000..73dc610d3 --- /dev/null +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/collections/KeyValuePairTest.java @@ -0,0 +1,34 @@ +/* + * 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.base.api.test.collections; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.hedera.fullstack.base.api.collections.KeyValuePair; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class KeyValuePairTest { + @Test + @DisplayName("Test KeyValuePair") + void testKeyValuePair() { + KeyValuePair kvp1 = new KeyValuePair<>("key", "value"); + KeyValuePair kvp1v2 = new KeyValuePair<>("key", "value2"); + assertThat(kvp1).isNotEqualTo(kvp1v2); + assertThat(kvp1.hashCode()).isEqualTo(kvp1v2.hashCode()); + } +} From f187743230addb0bcf6bfbe9399b6bd135b7551a Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:20 -0500 Subject: [PATCH 15/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index 394cbb216..cbee212ec 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -78,7 +78,7 @@ static Stream> testPrimitiveAsWrapp @ParameterizedTest @MethodSource @DisplayName("Test wrapper as primitive class") - void testWrapperAsPrimitiveClass(WrapperAsPrimitiveClassTestParameters parameters) { + void testWrapperAsPrimitiveClass(Class primitiveClass, Class wrapperClass) { Class wrapperClass = parameters.wrapperClass(); Class primitiveClass = parameters.primitiveClass(); Class result = ReflectionUtils.wrapperAsPrimitiveClass(wrapperClass); From 3c62ada2cb0b6a27a3e65b829260b807996c99c4 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:27 -0500 Subject: [PATCH 16/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index cbee212ec..5f4a58329 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -76,7 +76,7 @@ static Stream> testPrimitiveAsWrapp } @ParameterizedTest - @MethodSource + @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test wrapper as primitive class") void testWrapperAsPrimitiveClass(Class primitiveClass, Class wrapperClass) { Class wrapperClass = parameters.wrapperClass(); From 1b73fc01d5c1062352388f56307037c7aa9d486a Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:33 -0500 Subject: [PATCH 17/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index 5f4a58329..c49647f59 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -75,7 +75,7 @@ static Stream> testPrimitiveAsWrapp new PrimitiveAsWrapperClassTestParameters(String.class, String.class))); } - @ParameterizedTest + @ParameterizedTest(name = "Validate primitive for {1}") @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test wrapper as primitive class") void testWrapperAsPrimitiveClass(Class primitiveClass, Class wrapperClass) { From cb9921ff1bbf0e9647ba3c08bcc444834eb75ef1 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:38 -0500 Subject: [PATCH 18/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index c49647f59..c6ed9af9d 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -79,8 +79,6 @@ static Stream> testPrimitiveAsWrapp @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test wrapper as primitive class") void testWrapperAsPrimitiveClass(Class primitiveClass, Class wrapperClass) { - Class wrapperClass = parameters.wrapperClass(); - Class primitiveClass = parameters.primitiveClass(); Class result = ReflectionUtils.wrapperAsPrimitiveClass(wrapperClass); assertThat(result).isEqualTo(primitiveClass); } From 4c2d0d73eb4b1c05e0e6109ad3947a93de655ac4 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:45 -0500 Subject: [PATCH 19/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../api/test/reflect/ReflectionUtilsTest.java | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index c6ed9af9d..aa8011f9a 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -83,37 +83,4 @@ void testWrapperAsPrimitiveClass(Class primitiveClass, Class wrapperClass) assertThat(result).isEqualTo(primitiveClass); } - static Stream> testWrapperAsPrimitiveClass() { - return Stream.of( - named( - "Validate primitive for Void.class", - new WrapperAsPrimitiveClassTestParameters(Void.class, void.class)), - named( - "Validate primitive for Boolean.class", - new WrapperAsPrimitiveClassTestParameters(Boolean.class, boolean.class)), - named( - "Validate primitive for Byte.class", - new WrapperAsPrimitiveClassTestParameters(Byte.class, byte.class)), - named( - "Validate primitive for Character.class", - new WrapperAsPrimitiveClassTestParameters(Character.class, char.class)), - named( - "Validate primitive for Short.class", - new WrapperAsPrimitiveClassTestParameters(Short.class, short.class)), - named( - "Validate primitive for Integer.class", - new WrapperAsPrimitiveClassTestParameters(Integer.class, int.class)), - named( - "Validate primitive for Long.class", - new WrapperAsPrimitiveClassTestParameters(Long.class, long.class)), - named( - "Validate primitive for Float.class", - new WrapperAsPrimitiveClassTestParameters(Float.class, float.class)), - named( - "Validate primitive for Double.class", - new WrapperAsPrimitiveClassTestParameters(Double.class, double.class)), - named( - "Validate primitive for String.class", - new WrapperAsPrimitiveClassTestParameters(String.class, String.class))); - } } From 026cac8b36239dec0b00e4ab69974f2ac456086f Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:52 -0500 Subject: [PATCH 20/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index aa8011f9a..b6286c179 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -32,7 +32,7 @@ private record WrapperAsPrimitiveClassTestParameters(Class wrapperClass, Clas private record PrimitiveAsWrapperClassTestParameters(Class primitiveClass, Class wrapperClass) {} @ParameterizedTest - @MethodSource + @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test primitive as wrapper class") void testPrimitiveAsWrapperClass(PrimitiveAsWrapperClassTestParameters parameters) { Class primitiveClass = parameters.primitiveClass(); From 09b3808526c8f897d7191c800231a2f33aaf507a Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:39:58 -0500 Subject: [PATCH 21/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../base/api/test/reflect/ReflectionUtilsTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index b6286c179..f4597eb4a 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -41,11 +41,9 @@ void testPrimitiveAsWrapperClass(PrimitiveAsWrapperClassTestParameters parameter assertThat(result).isEqualTo(wrapperClass); } - static Stream> testPrimitiveAsWrapperClass() { + static Stream primitiveAndWrapperSupplier() { return Stream.of( - named( - "Validate wrapper for void.class", - new PrimitiveAsWrapperClassTestParameters(void.class, Void.class)), + arguments(named("void.class", void.class), named("Void.class", Void.class)), named( "Validate wrapper for boolean.class", new PrimitiveAsWrapperClassTestParameters(boolean.class, Boolean.class)), From 1aa284b7d00f9df0321123bacf5ddea06e13a6b6 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:40:04 -0500 Subject: [PATCH 22/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index f4597eb4a..3f763baa9 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -31,7 +31,7 @@ private record WrapperAsPrimitiveClassTestParameters(Class wrapperClass, Clas private record PrimitiveAsWrapperClassTestParameters(Class primitiveClass, Class wrapperClass) {} - @ParameterizedTest + @ParameterizedTest(name = "Validate wrapper for {0}") @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test primitive as wrapper class") void testPrimitiveAsWrapperClass(PrimitiveAsWrapperClassTestParameters parameters) { From 00fb85aec6c6c7d40e3eb93462698db0100c7751 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:40:11 -0500 Subject: [PATCH 23/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index 3f763baa9..2e2a2bb77 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -34,7 +34,7 @@ private record PrimitiveAsWrapperClassTestParameters(Class primitiveClass, Cl @ParameterizedTest(name = "Validate wrapper for {0}") @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test primitive as wrapper class") - void testPrimitiveAsWrapperClass(PrimitiveAsWrapperClassTestParameters parameters) { + void testPrimitiveAsWrapperClass(Class primitiveClass, Class wrapperClass) { Class primitiveClass = parameters.primitiveClass(); Class wrapperClass = parameters.wrapperClass(); Class result = ReflectionUtils.primitiveAsWrapperClass(primitiveClass); From 7f607a3cfbf52ef806f97c2283f9917622cdee71 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 11:40:16 -0500 Subject: [PATCH 24/27] Update fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- .../fullstack/base/api/test/reflect/ReflectionUtilsTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index 2e2a2bb77..f85cef0b7 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -35,8 +35,6 @@ private record PrimitiveAsWrapperClassTestParameters(Class primitiveClass, Cl @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test primitive as wrapper class") void testPrimitiveAsWrapperClass(Class primitiveClass, Class wrapperClass) { - Class primitiveClass = parameters.primitiveClass(); - Class wrapperClass = parameters.wrapperClass(); Class result = ReflectionUtils.primitiveAsWrapperClass(primitiveClass); assertThat(result).isEqualTo(wrapperClass); } From 6573c11f7b9b6fecdb4bdd3e09de732513774814 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 17:51:14 +0100 Subject: [PATCH 25/27] updated based on PR feedback Signed-off-by: Jeromy Cannon --- .../api/test/reflect/ReflectionUtilsTest.java | 52 ++++++------------- 1 file changed, 15 insertions(+), 37 deletions(-) diff --git a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java index f85cef0b7..ee82a5a30 100644 --- a/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java +++ b/fullstack-base-api/src/test/java/com/hedera/fullstack/base/api/test/reflect/ReflectionUtilsTest.java @@ -18,18 +18,29 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Named.named; +import static org.junit.jupiter.params.provider.Arguments.arguments; import com.hedera.fullstack.base.api.reflect.ReflectionUtils; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Named; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; public class ReflectionUtilsTest { - private record WrapperAsPrimitiveClassTestParameters(Class wrapperClass, Class primitiveClass) {} - - private record PrimitiveAsWrapperClassTestParameters(Class primitiveClass, Class wrapperClass) {} + static Stream primitiveAndWrapperSupplier() { + return Stream.of( + arguments(named("void.class", void.class), named("Void.class", Void.class)), + arguments(named("boolean.class", boolean.class), named("Boolean.class", Boolean.class)), + arguments(named("byte.class", byte.class), named("Byte.class", Byte.class)), + arguments(named("char.class", char.class), named("Character.class", Character.class)), + arguments(named("short.class", short.class), named("Short.class", Short.class)), + arguments(named("int.class", int.class), named("Integer.class", Integer.class)), + arguments(named("long.class", long.class), named("Long.class", Long.class)), + arguments(named("float.class", float.class), named("Float.class", Float.class)), + arguments(named("double.class", double.class), named("Double.class", Double.class)), + arguments(named("String.class", String.class), named("String.class", String.class))); + } @ParameterizedTest(name = "Validate wrapper for {0}") @MethodSource("primitiveAndWrapperSupplier") @@ -39,38 +50,6 @@ void testPrimitiveAsWrapperClass(Class primitiveClass, Class wrapperClass) assertThat(result).isEqualTo(wrapperClass); } - static Stream primitiveAndWrapperSupplier() { - return Stream.of( - arguments(named("void.class", void.class), named("Void.class", Void.class)), - named( - "Validate wrapper for boolean.class", - new PrimitiveAsWrapperClassTestParameters(boolean.class, Boolean.class)), - named( - "Validate wrapper for byte.class", - new PrimitiveAsWrapperClassTestParameters(byte.class, Byte.class)), - named( - "Validate wrapper for char.class", - new PrimitiveAsWrapperClassTestParameters(char.class, Character.class)), - named( - "Validate wrapper for short.class", - new PrimitiveAsWrapperClassTestParameters(short.class, Short.class)), - named( - "Validate wrapper for int.class", - new PrimitiveAsWrapperClassTestParameters(int.class, Integer.class)), - named( - "Validate wrapper for long.class", - new PrimitiveAsWrapperClassTestParameters(long.class, Long.class)), - named( - "Validate wrapper for float.class", - new PrimitiveAsWrapperClassTestParameters(float.class, Float.class)), - named( - "Validate wrapper for double.class", - new PrimitiveAsWrapperClassTestParameters(double.class, Double.class)), - named( - "Validate wrapper for String.class", - new PrimitiveAsWrapperClassTestParameters(String.class, String.class))); - } - @ParameterizedTest(name = "Validate primitive for {1}") @MethodSource("primitiveAndWrapperSupplier") @DisplayName("Test wrapper as primitive class") @@ -78,5 +57,4 @@ void testWrapperAsPrimitiveClass(Class primitiveClass, Class wrapperClass) Class result = ReflectionUtils.wrapperAsPrimitiveClass(wrapperClass); assertThat(result).isEqualTo(primitiveClass); } - } From ecf9bb020d39c1f9aaf38f40ea7c481babf68ddc Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 18:48:02 +0100 Subject: [PATCH 26/27] removed testImplementation(gav("com.jcovalent.junit.logging")) Signed-off-by: Jeromy Cannon --- fullstack-service-locator/build.gradle.kts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/fullstack-service-locator/build.gradle.kts b/fullstack-service-locator/build.gradle.kts index 0916ecbcd..7f72e99dc 100644 --- a/fullstack-service-locator/build.gradle.kts +++ b/fullstack-service-locator/build.gradle.kts @@ -19,8 +19,4 @@ plugins { id("com.hedera.fullstack.maven-publish") } -dependencies { - // Bill of Materials - implementation(platform(project(":fullstack-bom"))) - javaModuleDependencies { testImplementation(gav("com.jcovalent.junit.logging")) } -} +dependencies { implementation(platform(project(":fullstack-bom"))) } From 943607d146b75c45eb7459eeaf11b8ef2038fb71 Mon Sep 17 00:00:00 2001 From: Jeromy Cannon Date: Mon, 7 Aug 2023 12:53:30 -0500 Subject: [PATCH 27/27] Update fullstack-service-locator/build.gradle.kts Co-authored-by: Nathan Klick Signed-off-by: Jeromy Cannon --- fullstack-service-locator/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fullstack-service-locator/build.gradle.kts b/fullstack-service-locator/build.gradle.kts index 7f72e99dc..292fb0dca 100644 --- a/fullstack-service-locator/build.gradle.kts +++ b/fullstack-service-locator/build.gradle.kts @@ -19,4 +19,4 @@ plugins { id("com.hedera.fullstack.maven-publish") } -dependencies { implementation(platform(project(":fullstack-bom"))) } +dependencies { api(platform(project(":fullstack-bom"))) }