diff --git a/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThan.java b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThan.java index cadcf25cc682f..08df50491c50b 100644 --- a/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThan.java +++ b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThan.java @@ -8,13 +8,13 @@ import org.junit.jupiter.api.extension.ExtendWith; /** - * Used to signal that a test class should be disabled if the version of GraalVM used to build the native binary + * Used to signal that a test class or method should be disabled if the version of GraalVM used to build the native binary * under test was older than the supplied version. * * This annotation should only be used on a test classes annotated with {@link NativeImageTest} or - * {@link QuarkusIntegrationTest} + * {@link QuarkusIntegrationTest}. If it is used on other test classes, it will have no effect. */ -@Target({ ElementType.TYPE }) +@Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @ExtendWith(DisableIfBuiltWithGraalVMOlderThanCondition.class) public @interface DisableIfBuiltWithGraalVMOlderThan { diff --git a/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThanCondition.java b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThanCondition.java index f38a5fcb3cd0a..89e3f530d9c64 100644 --- a/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThanCondition.java +++ b/test-framework/junit5/src/main/java/io/quarkus/test/junit/DisableIfBuiltWithGraalVMOlderThanCondition.java @@ -3,9 +3,14 @@ import static io.quarkus.test.junit.IntegrationTestUtil.readQuarkusArtifactProperties; import static org.junit.platform.commons.util.AnnotationUtils.findAnnotation; +import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.util.Optional; import java.util.Properties; +import java.util.Set; import org.junit.jupiter.api.extension.ConditionEvaluationResult; import org.junit.jupiter.api.extension.ExecutionCondition; @@ -13,6 +18,11 @@ public class DisableIfBuiltWithGraalVMOlderThanCondition implements ExecutionCondition { + private static final String QUARKUS_INTEGRATION_TEST_NAME = QuarkusIntegrationTest.class.getName(); + private static final String NATIVE_IMAGE_TEST_NAME = NativeImageTest.class.getName(); + private static final Set SUPPORTED_INTEGRATION_TESTS = Collections + .unmodifiableSet(new HashSet<>(Arrays.asList(QUARKUS_INTEGRATION_TEST_NAME, NATIVE_IMAGE_TEST_NAME))); + @Override public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { Optional element = context.getElement(); @@ -21,6 +31,9 @@ public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext con if (!optional.isPresent()) { return ConditionEvaluationResult.enabled("@DisableIfBuiltWithGraalVMOlderThan was not found"); } + if (!isIntegrationTest(context.getRequiredTestClass())) { + return ConditionEvaluationResult.enabled("@DisableIfBuiltWithGraalVMOlderThan was added to an unsupported test"); + } DisableIfBuiltWithGraalVMOlderThan.GraalVMVersion annotationValue = optional.get().value(); Properties quarkusArtifactProperties = readQuarkusArtifactProperties(context); @@ -39,4 +52,19 @@ public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext con .disabled("Unable to determine the GraalVM version with which the native binary was built"); } } + + private boolean isIntegrationTest(Class testClass) { + do { + Annotation[] annotations = testClass.getAnnotations(); + for (Annotation annotation : annotations) { + Class annotationType = annotation.annotationType(); + String annotationTypeName = annotationType.getName(); + if (SUPPORTED_INTEGRATION_TESTS.contains(annotationTypeName)) { + return true; + } + } + testClass = testClass.getSuperclass(); + } while (testClass != Object.class); + return false; + } }