From e86bd375b4046b96675eda4f2f39cc8284c39bd5 Mon Sep 17 00:00:00 2001 From: Stuart Douglas Date: Tue, 9 Apr 2019 11:44:41 +1000 Subject: [PATCH] Fixes #1928, if boot fails do not attempt to run other tests --- .../test/junit/QuarkusTestExtension.java | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java b/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java index da172a28f523c..ab1f056e30b51 100644 --- a/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java +++ b/test-framework/junit5/src/main/java/io/quarkus/test/junit/QuarkusTestExtension.java @@ -46,12 +46,12 @@ import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.TestInstanceFactory; import org.junit.jupiter.api.extension.TestInstanceFactoryContext; -import org.junit.jupiter.api.extension.TestInstancePostProcessor; import org.junit.jupiter.api.extension.TestInstantiationException; import org.junit.platform.commons.JUnitException; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; +import org.opentest4j.TestAbortedException; import io.quarkus.bootstrap.BootstrapClassLoaderFactory; import io.quarkus.bootstrap.BootstrapException; @@ -74,10 +74,11 @@ import io.quarkus.test.common.http.TestHTTPResourceManager; public class QuarkusTestExtension - implements BeforeEachCallback, AfterEachCallback, TestInstanceFactory { + implements BeforeEachCallback, AfterEachCallback, TestInstanceFactory, BeforeAllCallback { private URLClassLoader appCl; private ClassLoader originalCl; + private static boolean failedBoot; private ExtensionState doJavaStart(ExtensionContext context, TestResourceManager testResourceManager) { @@ -271,6 +272,13 @@ public void beforeEach(ExtensionContext context) throws Exception { @Override public Object createTestInstance(TestInstanceFactoryContext factoryContext, ExtensionContext extensionContext) throws TestInstantiationException { + if (failedBoot) { + try { + return extensionContext.getRequiredTestClass().newInstance(); + } catch (Exception e) { + throw new TestInstantiationException("Boot failed", e); + } + } ExtensionContext root = extensionContext.getRoot(); ExtensionContext.Store store = root.getStore(ExtensionContext.Namespace.GLOBAL); ExtensionState state = store.get(ExtensionState.class.getName(), ExtensionState.class); @@ -278,20 +286,27 @@ public Object createTestInstance(TestInstanceFactoryContext factoryContext, Exte boolean substrateTest = extensionContext.getRequiredTestClass().isAnnotationPresent(SubstrateTest.class); if (state == null) { TestResourceManager testResourceManager = new TestResourceManager(extensionContext.getRequiredTestClass()); - testResourceManager.start(); - - if (substrateTest) { - NativeImageLauncher launcher = new NativeImageLauncher(extensionContext.getRequiredTestClass()); - try { - launcher.start(); - } catch (IOException e) { - throw new JUnitException("Quarkus native image start failed, original cause: " + e); + try { + testResourceManager.start(); + + if (substrateTest) { + NativeImageLauncher launcher = new NativeImageLauncher(extensionContext.getRequiredTestClass()); + try { + launcher.start(); + } catch (IOException e) { + throw new JUnitException("Quarkus native image start failed, original cause: " + e); + } + state = new ExtensionState(testResourceManager, launcher, true); + } else { + state = doJavaStart(extensionContext, testResourceManager); } - state = new ExtensionState(testResourceManager, launcher, true); - } else { - state = doJavaStart(extensionContext, testResourceManager); + store.put(ExtensionState.class.getName(), state); + + } catch (RuntimeException e) { + testResourceManager.stop(); + failedBoot = true; + throw e; } - store.put(ExtensionState.class.getName(), state); } else { if (substrateTest != state.isSubstrate()) { throw new RuntimeException( @@ -318,6 +333,13 @@ private static ClassLoader setCCL(ClassLoader cl) { return original; } + @Override + public void beforeAll(ExtensionContext context) throws Exception { + if (failedBoot) { + throw new TestAbortedException("Not running test as boot failed"); + } + } + class ExtensionState implements ExtensionContext.Store.CloseableResource { private final TestResourceManager testResourceManager;