All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.quarkus.devui.deployment.menu.ContinuousTestingProcessor Maven / Gradle / Ivy

package io.quarkus.devui.deployment.menu;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Optional;

import com.fasterxml.jackson.databind.ObjectMapper;

import io.quarkus.arc.deployment.BeanContainerBuildItem;
import io.quarkus.deployment.IsDevelopment;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.deployment.dev.testing.TestRunResults;
import io.quarkus.deployment.dev.testing.TestSupport;
import io.quarkus.dev.console.DevConsoleManager;
import io.quarkus.dev.spi.DevModeType;
import io.quarkus.devui.deployment.InternalPageBuildItem;
import io.quarkus.devui.runtime.continuoustesting.ContinuousTestingJsonRPCService;
import io.quarkus.devui.runtime.continuoustesting.ContinuousTestingRecorder;
import io.quarkus.devui.spi.JsonRPCProvidersBuildItem;
import io.quarkus.devui.spi.page.Page;

/**
 * This creates Continuous Testing Page
 */
public class ContinuousTestingProcessor {

    @Record(ExecutionTime.RUNTIME_INIT)
    @BuildStep(onlyIf = IsDevelopment.class)
    public void continuousTestingState(
            ContinuousTestingRecorder recorder,
            LaunchModeBuildItem launchModeBuildItem,
            ShutdownContextBuildItem shutdownContextBuildItem,
            BeanContainerBuildItem beanContainer) throws IOException {

        DevModeType devModeType = launchModeBuildItem.getDevModeType().orElse(null);
        if (devModeType == null || !devModeType.isContinuousTestingSupported()) {
            return;
        }

        if (TestSupport.instance().isPresent()) {
            // Add continuous testing
            recorder.createContinuousTestingSharedStateManager(beanContainer.getValue(), shutdownContextBuildItem);
        }

    }

    @BuildStep(onlyIf = IsDevelopment.class)
    InternalPageBuildItem createContinuousTestingPages() {

        InternalPageBuildItem continuousTestingPages = new InternalPageBuildItem("Continuous Testing", 30);

        continuousTestingPages.addPage(Page.webComponentPageBuilder()
                .namespace(NAMESPACE)
                .title("Continuous Testing")
                .icon("font-awesome-solid:flask-vial")
                .componentLink("qwc-continuous-testing.js"));

        return continuousTestingPages;

    }

    @BuildStep(onlyIf = IsDevelopment.class)
    JsonRPCProvidersBuildItem createJsonRPCService(LaunchModeBuildItem launchModeBuildItem) {

        registerStartMethod(launchModeBuildItem);
        registerStopMethod(launchModeBuildItem);
        registerRunAllMethod(launchModeBuildItem);
        registerRunFailedMethod(launchModeBuildItem);
        registerToggleBrokenOnlyMethod(launchModeBuildItem);
        registerGetResultsMethod(launchModeBuildItem);

        return new JsonRPCProvidersBuildItem(NAMESPACE, ContinuousTestingJsonRPCService.class);
    }

    private boolean testsDisabled(LaunchModeBuildItem launchModeBuildItem, Optional ts) {
        return ts.isEmpty() || launchModeBuildItem.getDevModeType().orElse(null) != DevModeType.LOCAL;
    }

    private void registerStartMethod(LaunchModeBuildItem launchModeBuildItem) {
        DevConsoleManager.register(NAMESPACE + DASH + "start", ignored -> {

            try {
                Optional ts = TestSupport.instance();
                if (testsDisabled(launchModeBuildItem, ts)) {
                    return false;
                }
                TestSupport testSupport = ts.get();

                if (testSupport.isStarted()) {
                    return false; // Already running
                } else {
                    testSupport.start();
                    return true;
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    private void registerStopMethod(LaunchModeBuildItem launchModeBuildItem) {
        DevConsoleManager.register(NAMESPACE + DASH + "stop", ignored -> {

            try {
                Optional ts = TestSupport.instance();
                if (testsDisabled(launchModeBuildItem, ts)) {
                    return false;
                }
                TestSupport testSupport = ts.get();

                if (testSupport.isStarted()) {
                    testSupport.stop();
                    return true;
                } else {
                    return false; // Already running
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    private void registerRunAllMethod(LaunchModeBuildItem launchModeBuildItem) {
        DevConsoleManager.register(NAMESPACE + DASH + "runAll", ignored -> {

            try {
                Optional ts = TestSupport.instance();
                if (testsDisabled(launchModeBuildItem, ts)) {
                    return false;
                }
                TestSupport testSupport = ts.get();
                testSupport.runAllTests();
                return true;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    private void registerRunFailedMethod(LaunchModeBuildItem launchModeBuildItem) {
        DevConsoleManager.register(NAMESPACE + DASH + "runFailed", ignored -> {

            try {
                Optional ts = TestSupport.instance();
                if (testsDisabled(launchModeBuildItem, ts)) {
                    return false;
                }
                TestSupport testSupport = ts.get();
                testSupport.runFailedTests();
                return true;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    private void registerToggleBrokenOnlyMethod(LaunchModeBuildItem launchModeBuildItem) {
        DevConsoleManager.register(NAMESPACE + DASH + "toggleBrokenOnly", ignored -> {

            try {
                Optional ts = TestSupport.instance();
                if (testsDisabled(launchModeBuildItem, ts)) {
                    return false;
                }
                TestSupport testSupport = ts.get();
                return testSupport.toggleBrokenOnlyMode();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    private void registerGetResultsMethod(LaunchModeBuildItem launchModeBuildItem) {
        DevConsoleManager.register(NAMESPACE + DASH + "getResults", ignored -> {
            ObjectMapper objectMapper = new ObjectMapper(); // Remove in favior of build in.
            try {
                Optional ts = TestSupport.instance();
                if (testsDisabled(launchModeBuildItem, ts)) {
                    return null;
                }
                TestSupport testSupport = ts.get();
                TestRunResults testRunResults = testSupport.getResults();

                if (testRunResults == null) {
                    return null;
                }

                try (StringWriter sw = new StringWriter()) {
                    objectMapper.writeValue(sw, testRunResults);
                    return sw.toString();
                }

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        });
    }

    private static final String NAMESPACE = "devui-continuous-testing";
    private static final String DASH = "-";

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy