From ed306d451419d2c49904109edc59ffe33a5f0577 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Attila=20M=C3=A9sz=C3=A1ros?= Date: Fri, 24 Mar 2023 15:26:59 +0100 Subject: [PATCH] feat: annotation on method (#47) --- README.md | 2 +- .../jenvtest/junit/EnableKubeAPIServer.java | 2 +- .../junit/KubeAPIServerExtension.java | 73 ++++++++++++++----- ...st.java => JUnitExtensionOnClassTest.java} | 2 +- .../jenvtest/JUnitExtensionOnMethodTest.java | 17 +++++ 5 files changed, 73 insertions(+), 23 deletions(-) rename samples/src/test/java/io/javaoperatorsdk/jenvtest/{JUnitExtensionTest.java => JUnitExtensionOnClassTest.java} (89%) create mode 100644 samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnMethodTest.java diff --git a/README.md b/README.md index 60f88fe..45bcea7 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Include dependency: ### In Unit Tests See sample unit -test [here](https://github.com/java-operator-sdk/jenvtest/blob/main/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionTest.java#L10-L10) +test [here](https://github.com/java-operator-sdk/jenvtest/blob/6fadd8cb07ea0a61410175abf1f6ec495bf6a20f/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnClassTest.java) ```java diff --git a/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/EnableKubeAPIServer.java b/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/EnableKubeAPIServer.java index ee523c7..d1c44b3 100644 --- a/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/EnableKubeAPIServer.java +++ b/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/EnableKubeAPIServer.java @@ -9,7 +9,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; @ExtendWith(KubeAPIServerExtension.class) -@Target({TYPE, ANNOTATION_TYPE}) +@Target({TYPE, METHOD, ANNOTATION_TYPE}) @Retention(RUNTIME) public @interface EnableKubeAPIServer { diff --git a/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/KubeAPIServerExtension.java b/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/KubeAPIServerExtension.java index c714b29..9575752 100644 --- a/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/KubeAPIServerExtension.java +++ b/core/src/main/java/io/javaoperatorsdk/jenvtest/junit/KubeAPIServerExtension.java @@ -2,55 +2,88 @@ import java.lang.reflect.AnnotatedElement; import java.util.Arrays; +import java.util.Optional; import java.util.stream.Collectors; -import org.junit.jupiter.api.extension.AfterAllCallback; -import org.junit.jupiter.api.extension.BeforeAllCallback; -import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.javaoperatorsdk.jenvtest.JenvtestException; import io.javaoperatorsdk.jenvtest.KubeAPIServer; +import io.javaoperatorsdk.jenvtest.KubeAPIServerConfig; import io.javaoperatorsdk.jenvtest.KubeAPIServerConfigBuilder; import static io.javaoperatorsdk.jenvtest.junit.EnableKubeAPIServer.NOT_SET; -public class KubeAPIServerExtension implements BeforeAllCallback, AfterAllCallback { +public class KubeAPIServerExtension + implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback { private static final Logger log = LoggerFactory.getLogger(KubeAPIServerExtension.class); private KubeAPIServer kubeApiServer; @Override - public void beforeAll(ExtensionContext extensionContext) throws Exception { - String targetVersion = extensionContext.getElement().map(this::annotatedElementToVersion) - .orElse(null); + public void beforeAll(ExtensionContext extensionContext) { + startIfAnnotationPresent(extensionContext); + } + + @Override + public void afterAll(ExtensionContext extensionContext) { + stopIfAnnotationPresent(extensionContext); + } + @Override + public void beforeEach(ExtensionContext extensionContext) { + startIfAnnotationPresent(extensionContext); + } + + @Override + public void afterEach(ExtensionContext extensionContext) { + stopIfAnnotationPresent(extensionContext); + } + + private void startIfAnnotationPresent(ExtensionContext extensionContext) { + extensionContext.getElement().ifPresent(ae -> { + var annotation = getExtensionAnnotationInstance(ae); + annotation.ifPresent(a -> startApiServer(extensionContext, a)); + }); + } + + private void startApiServer(ExtensionContext context, EnableKubeAPIServer annotation) { + kubeApiServer = new KubeAPIServer(annotationToConfig(annotation)); + kubeApiServer.start(); + } + + + private void stopIfAnnotationPresent(ExtensionContext extensionContext) { + extensionContext.getElement().ifPresent(ae -> { + var annotation = getExtensionAnnotationInstance(ae); + annotation.ifPresent(a -> kubeApiServer.stop()); + }); + } + + private KubeAPIServerConfig annotationToConfig(EnableKubeAPIServer annotation) { var builder = KubeAPIServerConfigBuilder.anAPIServerConfig(); - if (targetVersion != null) { - log.debug("Using api version: {}", targetVersion); - builder.withApiServerVersion(targetVersion); + var version = annotation.kubeAPIVersion(); + if (!NOT_SET.equals(version)) { + builder.withApiServerVersion(version); } - kubeApiServer = new KubeAPIServer(builder.build()); - kubeApiServer.start(); + return builder.build(); } - private String annotatedElementToVersion(AnnotatedElement ae) { + private Optional getExtensionAnnotationInstance(AnnotatedElement ae) { var annotations = Arrays.stream(ae.getAnnotations()) .filter(a -> a.annotationType().isAssignableFrom(EnableKubeAPIServer.class)) .collect(Collectors.toList()); if (annotations.size() > 1) { throw new JenvtestException( "Only one instance of @EnableKubeAPIServer annotation is allowed"); + } else if (annotations.isEmpty()) { + return Optional.empty(); + } else { + return Optional.of((EnableKubeAPIServer) annotations.get(0)); } - EnableKubeAPIServer target = (EnableKubeAPIServer) annotations.get(0); - var version = target.kubeAPIVersion(); - return NOT_SET.equals(version) ? null : version; } - @Override - public void afterAll(ExtensionContext extensionContext) throws Exception { - kubeApiServer.stop(); - } } diff --git a/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionTest.java b/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnClassTest.java similarity index 89% rename from samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionTest.java rename to samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnClassTest.java index d881b3c..ef2f777 100644 --- a/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionTest.java +++ b/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnClassTest.java @@ -7,7 +7,7 @@ import static io.javaoperatorsdk.jenvtest.TestUtils.simpleTest; @EnableKubeAPIServer -class JUnitExtensionTest { +class JUnitExtensionOnClassTest { @Test void testCommunication() { diff --git a/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnMethodTest.java b/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnMethodTest.java new file mode 100644 index 0000000..a4feb14 --- /dev/null +++ b/samples/src/test/java/io/javaoperatorsdk/jenvtest/JUnitExtensionOnMethodTest.java @@ -0,0 +1,17 @@ +package io.javaoperatorsdk.jenvtest; + +import org.junit.jupiter.api.Test; + +import io.javaoperatorsdk.jenvtest.junit.EnableKubeAPIServer; + +import static io.javaoperatorsdk.jenvtest.TestUtils.simpleTest; + +class JUnitExtensionOnMethodTest { + + @Test + @EnableKubeAPIServer + void testCommunication() { + simpleTest(); + } + +}