Search in sources :

Example 1 with RestorableSystemProperties

use of io.quarkus.test.common.RestorableSystemProperties in project quarkus by quarkusio.

the class QuarkusTestExtension method doJavaStart.

private ExtensionState doJavaStart(ExtensionContext context, Class<? extends QuarkusTestProfile> profile) throws Throwable {
    TracingHandler.quarkusStarting();
    hangDetectionExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {

        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r, "Quarkus hang detection timer thread");
        }
    });
    String time = "10m";
    // config is not established yet
    // we can only read from system properties
    String sysPropString = System.getProperty(QUARKUS_TEST_HANG_DETECTION_TIMEOUT);
    if (sysPropString != null) {
        time = sysPropString;
    }
    hangTimeout = new DurationConverter().convert(time);
    hangTaskKey = hangDetectionExecutor.schedule(hangDetectionTask, hangTimeout.toMillis(), TimeUnit.MILLISECONDS);
    quarkusTestProfile = profile;
    Class<?> requiredTestClass = context.getRequiredTestClass();
    Closeable testResourceManager = null;
    try {
        final LinkedBlockingDeque<Runnable> shutdownTasks = new LinkedBlockingDeque<>();
        PrepareResult result = createAugmentor(context, profile, shutdownTasks);
        AugmentAction augmentAction = result.augmentAction;
        QuarkusTestProfile profileInstance = result.profileInstance;
        testHttpEndpointProviders = TestHttpEndpointProvider.load();
        StartupAction startupAction = augmentAction.createInitialRuntimeApplication();
        Thread.currentThread().setContextClassLoader(startupAction.getClassLoader());
        populateDeepCloneField(startupAction);
        // must be done after the TCCL has been set
        testResourceManager = (Closeable) startupAction.getClassLoader().loadClass(TestResourceManager.class.getName()).getConstructor(Class.class, Class.class, List.class, boolean.class, Map.class, Optional.class).newInstance(requiredTestClass, profile != null ? profile : null, getAdditionalTestResources(profileInstance, startupAction.getClassLoader()), profileInstance != null && profileInstance.disableGlobalTestResources(), startupAction.getDevServicesProperties(), Optional.empty());
        testResourceManager.getClass().getMethod("init", String.class).invoke(testResourceManager, profile != null ? profile.getName() : null);
        Map<String, String> properties = (Map<String, String>) testResourceManager.getClass().getMethod("start").invoke(testResourceManager);
        startupAction.overrideConfig(properties);
        hasPerTestResources = (boolean) testResourceManager.getClass().getMethod("hasPerTestResources").invoke(testResourceManager);
        populateCallbacks(startupAction.getClassLoader());
        populateTestMethodInvokers(startupAction.getClassLoader());
        if (profileInstance == null || !profileInstance.runMainMethod()) {
            runningQuarkusApplication = startupAction.run(profileInstance == null ? new String[0] : profileInstance.commandLineParameters());
        } else {
            Class<?> lifecycleManager = Class.forName(ApplicationLifecycleManager.class.getName(), true, startupAction.getClassLoader());
            lifecycleManager.getDeclaredMethod("setDefaultExitCodeHandler", Consumer.class).invoke(null, (Consumer<Integer>) integer -> {
            });
            runningQuarkusApplication = startupAction.runMainClass(profileInstance.commandLineParameters());
        }
        String patternString = runningQuarkusApplication.getConfigValue("quarkus.test.class-clone-pattern", String.class).orElse("java\\..*");
        clonePattern = Pattern.compile(patternString);
        TracingHandler.quarkusStarted();
        if (hangTaskKey != null) {
            hangTaskKey.cancel(false);
            hangTimeout = runningQuarkusApplication.getConfigValue(QUARKUS_TEST_HANG_DETECTION_TIMEOUT, Duration.class).orElse(Duration.of(10, ChronoUnit.MINUTES));
            hangTaskKey = hangDetectionExecutor.schedule(hangDetectionTask, hangTimeout.toMillis(), TimeUnit.MILLISECONDS);
        }
        ConfigProviderResolver.setInstance(new RunningAppConfigResolver(runningQuarkusApplication));
        RestorableSystemProperties restorableSystemProperties = RestorableSystemProperties.setProperties(Collections.singletonMap("test.url", TestHTTPResourceManager.getUri(runningQuarkusApplication)));
        Closeable tm = testResourceManager;
        Closeable shutdownTask = new Closeable() {

            @Override
            public void close() throws IOException {
                TracingHandler.quarkusStopping();
                try {
                    runningQuarkusApplication.close();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    TracingHandler.quarkusStopped();
                    try {
                        while (!shutdownTasks.isEmpty()) {
                            shutdownTasks.pop().run();
                        }
                    } finally {
                        try {
                            tm.close();
                        } finally {
                            restorableSystemProperties.close();
                            GroovyCacheCleaner.clearGroovyCache();
                            shutdownHangDetection();
                        }
                    }
                    try {
                        TestClassIndexer.removeIndex(requiredTestClass);
                    } catch (Exception ignored) {
                    }
                }
            }
        };
        ExtensionState state = new ExtensionState(testResourceManager, shutdownTask);
        return state;
    } catch (Throwable e) {
        if (!InitialConfigurator.DELAYED_HANDLER.isActivated()) {
            activateLogging();
        }
        try {
            if (testResourceManager != null) {
                testResourceManager.close();
            }
        } catch (Exception ex) {
            e.addSuppressed(ex);
        }
        throw e;
    } finally {
        if (originalCl != null) {
            Thread.currentThread().setContextClassLoader(originalCl);
        }
    }
}
Also used : ApplicationLifecycleManager(io.quarkus.runtime.ApplicationLifecycleManager) RestAssuredURLManager(io.quarkus.test.common.RestAssuredURLManager) FieldInfo(org.jboss.jandex.FieldInfo) ApplicationLifecycleManager(io.quarkus.runtime.ApplicationLifecycleManager) ThreadInfo(java.lang.management.ThreadInfo) TestClassPredicateBuildItem(io.quarkus.deployment.builditem.TestClassPredicateBuildItem) Duration(java.time.Duration) Map(java.util.Map) AugmentAction(io.quarkus.bootstrap.app.AugmentAction) QuarkusTestAfterEachCallback(io.quarkus.test.junit.callback.QuarkusTestAfterEachCallback) InitialConfigurator(io.quarkus.bootstrap.logging.InitialConfigurator) Path(java.nio.file.Path) DurationConverter(io.quarkus.runtime.configuration.DurationConverter) TestAbortedException(org.opentest4j.TestAbortedException) TestHttpEndpointProvider(io.quarkus.runtime.test.TestHttpEndpointProvider) Set(java.util.Set) QuarkusClassLoader(io.quarkus.bootstrap.classloading.QuarkusClassLoader) Executors(java.util.concurrent.Executors) StartupAction(io.quarkus.bootstrap.app.StartupAction) InvocationTargetException(java.lang.reflect.InvocationTargetException) ReflectiveInvocationContext(org.junit.jupiter.api.extension.ReflectiveInvocationContext) BuildStep(io.quarkus.builder.BuildStep) TestClassBeanBuildItem(io.quarkus.deployment.builditem.TestClassBeanBuildItem) AnnotationInstance(org.jboss.jandex.AnnotationInstance) QuarkusTestMethodContext(io.quarkus.test.junit.callback.QuarkusTestMethodContext) PropertyTestUtil(io.quarkus.test.common.PropertyTestUtil) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ExtensionContext(org.junit.jupiter.api.extension.ExtensionContext) Constructor(java.lang.reflect.Constructor) Supplier(java.util.function.Supplier) Nested(org.junit.jupiter.api.Nested) RestorableSystemProperties(io.quarkus.test.common.RestorableSystemProperties) ArrayList(java.util.ArrayList) BuildChainBuilder(io.quarkus.builder.BuildChainBuilder) Parameter(java.lang.reflect.Parameter) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ManagementFactory(java.lang.management.ManagementFactory) IntegrationTestUtil.getAdditionalTestResources(io.quarkus.test.junit.IntegrationTestUtil.getAdditionalTestResources) ParameterResolutionException(org.junit.jupiter.api.extension.ParameterResolutionException) IOException(java.io.IOException) ParameterContext(org.junit.jupiter.api.extension.ParameterContext) ChronoUnit(java.time.temporal.ChronoUnit) BeforeAllCallback(org.junit.jupiter.api.extension.BeforeAllCallback) LinkedBlockingDeque(java.util.concurrent.LinkedBlockingDeque) BeforeEachCallback(org.junit.jupiter.api.extension.BeforeEachCallback) TestResourceManager(io.quarkus.test.common.TestResourceManager) TestHTTPResourceManager(io.quarkus.test.common.http.TestHTTPResourceManager) QuarkusTestContext(io.quarkus.test.junit.callback.QuarkusTestContext) TestHTTPEndpoint(io.quarkus.test.common.http.TestHTTPEndpoint) ScheduledFuture(java.util.concurrent.ScheduledFuture) QuarkusTestBeforeEachCallback(io.quarkus.test.junit.callback.QuarkusTestBeforeEachCallback) QuarkusTestBeforeClassCallback(io.quarkus.test.junit.callback.QuarkusTestBeforeClassCallback) ClassInfo(org.jboss.jandex.ClassInfo) DeepClone(io.quarkus.test.junit.internal.DeepClone) ConfigProviderResolver(org.eclipse.microprofile.config.spi.ConfigProviderResolver) AfterEachCallback(org.junit.jupiter.api.extension.AfterEachCallback) Locale(java.util.Locale) AnnotationTarget(org.jboss.jandex.AnnotationTarget) ThreadFactory(java.util.concurrent.ThreadFactory) Method(java.lang.reflect.Method) GroovyCacheCleaner(io.quarkus.test.common.GroovyCacheCleaner) Predicate(java.util.function.Predicate) ServiceLoader(java.util.ServiceLoader) TestInfo(org.junit.jupiter.api.TestInfo) Objects(java.util.Objects) List(java.util.List) TestBuildChainCustomizerProducer(io.quarkus.test.junit.buildchain.TestBuildChainCustomizerProducer) BuildContext(io.quarkus.builder.BuildContext) Optional(java.util.Optional) Pattern(java.util.regex.Pattern) TestScopeManager(io.quarkus.test.common.TestScopeManager) PathTestHelper(io.quarkus.test.common.PathTestHelper) TestClassIndexer(io.quarkus.test.common.TestClassIndexer) RunningQuarkusApplication(io.quarkus.bootstrap.app.RunningQuarkusApplication) TestAnnotationBuildItem(io.quarkus.deployment.builditem.TestAnnotationBuildItem) Logger(org.jboss.logging.Logger) Type(org.jboss.jandex.Type) TracingHandler(io.quarkus.dev.testing.TracingHandler) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) LaunchMode(io.quarkus.runtime.LaunchMode) HashMap(java.util.HashMap) IntegrationTestUtil.activateLogging(io.quarkus.test.junit.IntegrationTestUtil.activateLogging) Function(java.util.function.Function) QuarkusTestAfterAllCallback(io.quarkus.test.junit.callback.QuarkusTestAfterAllCallback) QuarkusTestAfterConstructCallback(io.quarkus.test.junit.callback.QuarkusTestAfterConstructCallback) RejectedExecutionException(java.util.concurrent.RejectedExecutionException) TestMethodInvoker(io.quarkus.test.TestMethodInvoker) ApplicationClassPredicateBuildItem(io.quarkus.deployment.builditem.ApplicationClassPredicateBuildItem) Index(org.jboss.jandex.Index) ClassPathElement(io.quarkus.bootstrap.classloading.ClassPathElement) InvocationInterceptor(org.junit.jupiter.api.extension.InvocationInterceptor) TestInstantiationException(org.junit.jupiter.api.extension.TestInstantiationException) SerializationWithXStreamFallbackDeepClone(io.quarkus.test.junit.internal.SerializationWithXStreamFallbackDeepClone) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) AbstractMap(java.util.AbstractMap) ConditionEvaluationResult(org.junit.jupiter.api.extension.ConditionEvaluationResult) ExecutionCondition(org.junit.jupiter.api.extension.ExecutionCondition) AfterAllCallback(org.junit.jupiter.api.extension.AfterAllCallback) ExceptionReporting(io.quarkus.dev.testing.ExceptionReporting) Closeable(java.io.Closeable) ProfileManager(io.quarkus.runtime.configuration.ProfileManager) Collections(java.util.Collections) ParameterResolver(org.junit.jupiter.api.extension.ParameterResolver) ThreadFactory(java.util.concurrent.ThreadFactory) LinkedBlockingDeque(java.util.concurrent.LinkedBlockingDeque) Closeable(java.io.Closeable) Consumer(java.util.function.Consumer) DurationConverter(io.quarkus.runtime.configuration.DurationConverter) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ArrayList(java.util.ArrayList) List(java.util.List) AugmentAction(io.quarkus.bootstrap.app.AugmentAction) StartupAction(io.quarkus.bootstrap.app.StartupAction) Optional(java.util.Optional) TestAbortedException(org.opentest4j.TestAbortedException) InvocationTargetException(java.lang.reflect.InvocationTargetException) ParameterResolutionException(org.junit.jupiter.api.extension.ParameterResolutionException) IOException(java.io.IOException) RejectedExecutionException(java.util.concurrent.RejectedExecutionException) TestInstantiationException(org.junit.jupiter.api.extension.TestInstantiationException) RestorableSystemProperties(io.quarkus.test.common.RestorableSystemProperties) Map(java.util.Map) HashMap(java.util.HashMap) AbstractMap(java.util.AbstractMap) TestResourceManager(io.quarkus.test.common.TestResourceManager)

Aggregations

AugmentAction (io.quarkus.bootstrap.app.AugmentAction)1 RunningQuarkusApplication (io.quarkus.bootstrap.app.RunningQuarkusApplication)1 StartupAction (io.quarkus.bootstrap.app.StartupAction)1 ClassPathElement (io.quarkus.bootstrap.classloading.ClassPathElement)1 QuarkusClassLoader (io.quarkus.bootstrap.classloading.QuarkusClassLoader)1 InitialConfigurator (io.quarkus.bootstrap.logging.InitialConfigurator)1 BuildChainBuilder (io.quarkus.builder.BuildChainBuilder)1 BuildContext (io.quarkus.builder.BuildContext)1 BuildStep (io.quarkus.builder.BuildStep)1 ApplicationClassPredicateBuildItem (io.quarkus.deployment.builditem.ApplicationClassPredicateBuildItem)1 TestAnnotationBuildItem (io.quarkus.deployment.builditem.TestAnnotationBuildItem)1 TestClassBeanBuildItem (io.quarkus.deployment.builditem.TestClassBeanBuildItem)1 TestClassPredicateBuildItem (io.quarkus.deployment.builditem.TestClassPredicateBuildItem)1 ExceptionReporting (io.quarkus.dev.testing.ExceptionReporting)1 TracingHandler (io.quarkus.dev.testing.TracingHandler)1 ApplicationLifecycleManager (io.quarkus.runtime.ApplicationLifecycleManager)1 LaunchMode (io.quarkus.runtime.LaunchMode)1 DurationConverter (io.quarkus.runtime.configuration.DurationConverter)1 ProfileManager (io.quarkus.runtime.configuration.ProfileManager)1 TestHttpEndpointProvider (io.quarkus.runtime.test.TestHttpEndpointProvider)1