diff --git a/core/deployment/src/main/java/io/quarkus/deployment/TestConfig.java b/core/deployment/src/main/java/io/quarkus/deployment/TestConfig.java index aacc479bf6ca82..3a3406eb318705 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/TestConfig.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/TestConfig.java @@ -26,7 +26,7 @@ public class TestConfig { * started from the Dev UI, and console output will not be printed. */ @ConfigItem(defaultValue = "PAUSED") - public Mode enabled; + public Mode continuousTesting; /** * Tags that should be included for continuous testing. @@ -44,6 +44,20 @@ public class TestConfig { @ConfigItem(defaultValue = "slow") public Optional> excludeTags; + /** + * Tests that should be included for continuous testing. This is a regular expression. + */ + @ConfigItem + public Optional includePattern; + + /** + * Tests that should be excluded with continuous testing. This is a regular expression. + * + * This is ignored if include-pattern has been set. + * + */ + @ConfigItem + public Optional excludePattern; /** * Disable the testing status/prompt message at the bottom of the console * and log these messages to STDOUT instead. diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java index 787f4f756f03ca..50d7f332c9837d 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java @@ -1,20 +1,7 @@ package io.quarkus.deployment.dev; -import io.quarkus.bootstrap.runner.Timing; -import io.quarkus.changeagent.ClassChangeAgent; -import io.quarkus.deployment.dev.testing.TestSupport; -import io.quarkus.deployment.dev.testing.runner.TestRunner; -import io.quarkus.deployment.util.FSWatchUtil; -import io.quarkus.deployment.util.FileUtil; -import io.quarkus.dev.spi.DevModeType; -import io.quarkus.dev.spi.HotReplacementContext; -import io.quarkus.dev.spi.HotReplacementSetup; -import org.eclipse.microprofile.config.ConfigProvider; -import org.jboss.jandex.ClassInfo; -import org.jboss.jandex.Index; -import org.jboss.jandex.IndexView; -import org.jboss.jandex.Indexer; -import org.jboss.logging.Logger; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toList; import java.io.ByteArrayInputStream; import java.io.Closeable; @@ -55,8 +42,22 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.toList; +import org.eclipse.microprofile.config.ConfigProvider; +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.Index; +import org.jboss.jandex.IndexView; +import org.jboss.jandex.Indexer; +import org.jboss.logging.Logger; + +import io.quarkus.bootstrap.runner.Timing; +import io.quarkus.changeagent.ClassChangeAgent; +import io.quarkus.deployment.dev.testing.TestSupport; +import io.quarkus.deployment.dev.testing.runner.TestRunner; +import io.quarkus.deployment.util.FSWatchUtil; +import io.quarkus.deployment.util.FileUtil; +import io.quarkus.dev.spi.DevModeType; +import io.quarkus.dev.spi.HotReplacementContext; +import io.quarkus.dev.spi.HotReplacementSetup; public class RuntimeUpdatesProcessor implements HotReplacementContext, Closeable { @@ -109,10 +110,10 @@ public class RuntimeUpdatesProcessor implements HotReplacementContext, Closeable private final TestSupport testSupport; public RuntimeUpdatesProcessor(Path applicationRoot, DevModeContext context, QuarkusCompiler compiler, - DevModeType devModeType, BiConsumer, ClassScanResult> restartCallback, - BiConsumer copyResourceNotification, - BiFunction classTransformers, - TestSupport testSupport) { + DevModeType devModeType, BiConsumer, ClassScanResult> restartCallback, + BiConsumer copyResourceNotification, + BiFunction classTransformers, + TestSupport testSupport) { this.applicationRoot = applicationRoot; this.context = context; this.compiler = compiler; @@ -452,8 +453,8 @@ ClassScanResult checkForChangedTestClasses(boolean firstScan) { * {@link RuntimeUpdatesProcessor#checkIfFileModified(Path, Map, boolean)} during the first scan. */ ClassScanResult checkForChangedClasses(QuarkusCompiler compiler, - Function cuf, boolean firstScan, - TimestampSet timestampSet) { + Function cuf, boolean firstScan, + TimestampSet timestampSet) { ClassScanResult classScanResult = new ClassScanResult(); boolean ignoreFirstScanChanges = firstScan; @@ -510,8 +511,8 @@ public Throwable getCompileProblem() { } private void checkForClassFilesChangesInModule(DevModeContext.ModuleInfo module, List moduleChangedSourceFiles, - boolean isInitialRun, ClassScanResult classScanResult, - Function cuf, TimestampSet timestampSet) { + boolean isInitialRun, ClassScanResult classScanResult, + Function cuf, TimestampSet timestampSet) { if (cuf.apply(module).getClassesPath() == null) { return; } @@ -567,8 +568,8 @@ private void checkForClassFilesChangesInModule(DevModeContext.ModuleInfo module, } private Path retrieveSourceFilePathForClassFile(Path classFilePath, List moduleChangedSourceFiles, - DevModeContext.ModuleInfo module, Function cuf, - TimestampSet timestampSet) { + DevModeContext.ModuleInfo module, Function cuf, + TimestampSet timestampSet) { Path sourceFilePath = timestampSet.classFilePathToSourceFilePath.get(classFilePath); if (sourceFilePath == null || moduleChangedSourceFiles.contains(sourceFilePath)) { sourceFilePath = compiler.findSourcePath(classFilePath, cuf.apply(module).getSourcePaths(), @@ -601,7 +602,7 @@ Set checkForFileChange() { } Set checkForFileChange(Function cuf, - TimestampSet timestampSet) { + TimestampSet timestampSet) { Set ret = new HashSet<>(); for (DevModeContext.ModuleInfo module : context.getAllModules()) { final Set moduleResources = correspondingResources.computeIfAbsent(module.getName(), @@ -705,12 +706,12 @@ Set checkForFileChange(Function includeTags, List excludeTags) { + if (testRunner == null) { + return; + } testRunner.setTags(includeTags, excludeTags); } + public void setPatterns(String include, String exclude) { + if (testRunner == null) { + return; + } + testRunner.setPatterns(include, exclude); + } + public static class RunStatus { final long lastRun; diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/JunitTestRunner.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/JunitTestRunner.java index ba395f9e6a5ba4..ecfef3b7aa5319 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/JunitTestRunner.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/JunitTestRunner.java @@ -28,6 +28,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.logging.LogRecord; +import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -83,6 +84,8 @@ public class JunitTestRunner { private final TestListener listener; private final Set includeTags; private final Set excludeTags; + private final Pattern include; + private final Pattern exclude; private volatile boolean testsRunning = false; private volatile boolean aborted; @@ -98,6 +101,8 @@ public JunitTestRunner(Builder builder) { this.testState = builder.testState; this.includeTags = new HashSet<>(builder.includeTags); this.excludeTags = new HashSet<>(builder.excludeTags); + this.include = builder.include; + this.exclude = builder.exclude; } public void runTests() { @@ -122,6 +127,11 @@ public void runTests() { } else if (!excludeTags.isEmpty()) { launchBuilder.filters(new TagFilter(true, excludeTags)); } + if (include != null) { + launchBuilder.filters(new RegexFilter(false, include)); + } else if (exclude != null) { + launchBuilder.filters(new RegexFilter(true, exclude)); + } LauncherDiscoveryRequest request = launchBuilder .build(); TestPlan testPlan = launcher.discover(request); @@ -482,6 +492,8 @@ static class Builder { private TestListener listener; private List includeTags = Collections.emptyList(); private List excludeTags = Collections.emptyList(); + private Pattern include; + private Pattern exclude; public Builder setRunId(long runId) { this.runId = runId; @@ -528,6 +540,16 @@ public Builder setTestState(TestState testState) { return this; } + public Builder setInclude(Pattern include) { + this.include = include; + return this; + } + + public Builder setExclude(Pattern exclude) { + this.exclude = exclude; + return this; + } + public JunitTestRunner build() { Objects.requireNonNull(devModeContext, "devModeContext"); Objects.requireNonNull(testClassUsages, "testClassUsages"); @@ -536,6 +558,7 @@ public JunitTestRunner build() { Objects.requireNonNull(listener, "listener"); return new JunitTestRunner(this); } + } private static class TagFilter implements PostDiscoveryFilter { @@ -565,7 +588,7 @@ public FilterResult apply(TestDescriptor testDescriptor) { return FilterResult.includedIf(exclude); } } - return FilterResult.included("not a class"); + return FilterResult.included("not a method"); } public FilterResult filterTags(AnnotatedElement clz) { @@ -587,4 +610,30 @@ public FilterResult filterTags(AnnotatedElement clz) { return FilterResult.includedIf(exclude); } } + + private static class RegexFilter implements PostDiscoveryFilter { + + final boolean exclude; + final Pattern pattern; + + private RegexFilter(boolean exclude, Pattern pattern) { + this.exclude = exclude; + this.pattern = pattern; + } + + @Override + public FilterResult apply(TestDescriptor testDescriptor) { + if (testDescriptor.getSource().isPresent()) { + if (testDescriptor.getSource().get() instanceof MethodSource) { + MethodSource methodSource = (MethodSource) testDescriptor.getSource().get(); + String name = methodSource.getJavaClass().getName(); + if (pattern.matcher(name).matches()) { + return FilterResult.includedIf(!exclude); + } + return FilterResult.includedIf(exclude); + } + } + return FilterResult.included("not a method"); + } + } } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestRunner.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestRunner.java index 95f980ec78dc0a..8638d83bffc141 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestRunner.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestRunner.java @@ -6,6 +6,7 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.regex.Pattern; import org.jboss.logging.Logger; import org.junit.platform.engine.TestExecutionResult; @@ -51,6 +52,8 @@ public class TestRunner { private volatile boolean firstRun = true; volatile List includeTags = Collections.emptyList(); volatile List excludeTags = Collections.emptyList(); + volatile Pattern include = null; + volatile Pattern exclude = null; volatile InputHandler.ConsoleStatus promptHandler; private JunitTestRunner runner; @@ -80,7 +83,6 @@ public void handleInput(int[] keys) { @Override public void promptHandler(InputHandler.ConsoleStatus promptHandler) { TestRunner.this.promptHandler = promptHandler; - promptHandler.setPrompt(DISABLED_PROMPT); } }; @@ -224,6 +226,8 @@ private void runInternal(ClassScanResult classScanResult) { .setTestApplication(testApplication) .setIncludeTags(includeTags) .setExcludeTags(excludeTags) + .setInclude(include) + .setExclude(exclude) .setListener(new JunitTestRunner.TestListener() { @Override public void runStarted(long toRun) { @@ -350,4 +354,9 @@ public void setTags(List includeTags, List excludeTags) { this.includeTags = includeTags; this.excludeTags = excludeTags; } + + public void setPatterns(String include, String exclude) { + this.include = include == null ? null : Pattern.compile(include); + this.exclude = exclude == null ? null : Pattern.compile(exclude); + } } diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestTracingProcessor.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestTracingProcessor.java index 57f8c5c0d12c25..fca405c4387a1f 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestTracingProcessor.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/testing/runner/TestTracingProcessor.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.function.BiFunction; -import io.quarkus.deployment.IsDevelopment; import org.jboss.jandex.ClassInfo; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; @@ -12,6 +11,7 @@ import io.quarkus.bootstrap.classloading.ClassPathElement; import io.quarkus.bootstrap.classloading.QuarkusClassLoader; +import io.quarkus.deployment.IsDevelopment; import io.quarkus.deployment.IsNormal; import io.quarkus.deployment.IsTest; import io.quarkus.deployment.TestConfig; @@ -42,9 +42,9 @@ LogCleanupFilterBuildItem handle() { return new LogCleanupFilterBuildItem("org.junit.platform.launcher.core.EngineDiscoveryOrchestrator", "0 containers"); } - @BuildStep(onlyIf= IsDevelopment.class) + @BuildStep(onlyIf = IsDevelopment.class) ServiceStartBuildItem setupConsole(TestConfig config) { - if (RuntimeUpdatesProcessor.INSTANCE == null || config.enabled == TestConfig.Mode.DISABLED) { + if (RuntimeUpdatesProcessor.INSTANCE == null || config.continuousTesting == TestConfig.Mode.DISABLED) { return null; } QuarkusConsole.installConsole(config); @@ -54,17 +54,19 @@ ServiceStartBuildItem setupConsole(TestConfig config) { @BuildStep(onlyIfNot = IsNormal.class) @Produce(LogHandlerBuildItem.class) ServiceStartBuildItem startTesting(TestConfig config) { - if (RuntimeUpdatesProcessor.INSTANCE == null || config.enabled == TestConfig.Mode.DISABLED) { + if (RuntimeUpdatesProcessor.INSTANCE == null || config.continuousTesting == TestConfig.Mode.DISABLED) { return null; } - if (config.enabled == TestConfig.Mode.ENABLED) { + if (config.continuousTesting == TestConfig.Mode.ENABLED) { RuntimeUpdatesProcessor.INSTANCE.getTestSupport().start(); - } else if (config.enabled == TestConfig.Mode.PAUSED) { + } else if (config.continuousTesting == TestConfig.Mode.PAUSED) { RuntimeUpdatesProcessor.INSTANCE.getTestSupport().init(); RuntimeUpdatesProcessor.INSTANCE.getTestSupport().stop(); } RuntimeUpdatesProcessor.INSTANCE.getTestSupport().setTags(config.includeTags.orElse(Collections.emptyList()), config.excludeTags.orElse(Collections.emptyList())); + RuntimeUpdatesProcessor.INSTANCE.getTestSupport().setPatterns(config.includePattern.orElse(null), + config.excludePattern.orElse(null)); return null; } diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestChangeTrackingWhenStartFailsTestCase.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestChangeTrackingWhenStartFailsTestCase.java index 6a815b7394aae6..7a1232aff57249 100644 --- a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestChangeTrackingWhenStartFailsTestCase.java +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestChangeTrackingWhenStartFailsTestCase.java @@ -4,6 +4,7 @@ import java.util.function.Supplier; import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -19,7 +20,9 @@ public class TestChangeTrackingWhenStartFailsTestCase { .setArchiveProducer(new Supplier() { @Override public JavaArchive get() { - return ShrinkWrap.create(JavaArchive.class).addClasses(HelloResource.class, StartupFailer.class); + return ShrinkWrap.create(JavaArchive.class).addClasses(HelloResource.class, StartupFailer.class).add( + new StringAsset("quarkus.test.continuous-testing=enabled\nq"), + "application.properties"); } }) .setTestArchiveProducer(new Supplier() { diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestRunnerSmokeTestCase.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestRunnerSmokeTestCase.java index a7317bce82db28..ba43132149a5e7 100644 --- a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestRunnerSmokeTestCase.java +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/TestRunnerSmokeTestCase.java @@ -4,6 +4,7 @@ import java.util.function.Supplier; import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -22,7 +23,9 @@ public class TestRunnerSmokeTestCase { .setArchiveProducer(new Supplier() { @Override public JavaArchive get() { - return ShrinkWrap.create(JavaArchive.class).addClass(HelloResource.class); + return ShrinkWrap.create(JavaArchive.class).addClass(HelloResource.class) + .add(new StringAsset("quarkus.test.continuous-testing=enabled\nq"), + "application.properties"); } }) .setTestArchiveProducer(new Supplier() { diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/BarET.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/BarET.java new file mode 100644 index 00000000000000..9991b757370fdb --- /dev/null +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/BarET.java @@ -0,0 +1,21 @@ +package io.quarkus.vertx.http.testrunner.includes; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.is; + +import org.junit.jupiter.api.Test; + +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +public class BarET { + + @Test + public void bar() { + given() + .when().get("/hello/greeting/foo") + .then() + .statusCode(200) + .body(is("hello foo")); + } +} diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/ExcludePatternTestCase.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/ExcludePatternTestCase.java new file mode 100644 index 00000000000000..40212f6a90eca2 --- /dev/null +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/ExcludePatternTestCase.java @@ -0,0 +1,73 @@ +package io.quarkus.vertx.http.testrunner.includes; + +import java.util.function.Function; +import java.util.function.Supplier; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.quarkus.vertx.http.deployment.devmode.tests.TestStatus; +import io.quarkus.vertx.http.testrunner.HelloResource; +import io.quarkus.vertx.http.testrunner.TestRunnerTestUtils; + +public class ExcludePatternTestCase { + + @RegisterExtension + static QuarkusDevModeTest test = new QuarkusDevModeTest() + .setArchiveProducer(new Supplier() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class).addClass(HelloResource.class) + .add(new StringAsset( + "quarkus.test.continuous-testing=enabled\nquarkus.test.exclude-pattern=.*BarET"), + "application.properties"); + } + }) + .setTestArchiveProducer(new Supplier() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class).addClasses(FooET.class, BarET.class); + } + }); + + @Test + public void checkTestsAreRun() throws InterruptedException { + TestStatus ts = TestRunnerTestUtils.waitForFirstRunToComplete(); + Assertions.assertEquals(1L, ts.getLastRun()); + Assertions.assertEquals(0L, ts.getTestsFailed()); + Assertions.assertEquals(1L, ts.getTestsPassed()); + Assertions.assertEquals(0L, ts.getTestsSkipped()); + Assertions.assertEquals(-1L, ts.getRunning()); + + test.modifyResourceFile("application.properties", new Function() { + @Override + public String apply(String s) { + return "quarkus.test.continuous-testing=enabled\nquarkus.test.exclude-pattern=missing"; + } + }); + ts = TestRunnerTestUtils.waitForRun(2); + Assertions.assertEquals(2L, ts.getLastRun()); + Assertions.assertEquals(0L, ts.getTestsFailed()); + Assertions.assertEquals(2L, ts.getTestsPassed()); + Assertions.assertEquals(0L, ts.getTestsSkipped()); + Assertions.assertEquals(-1L, ts.getRunning()); + + test.modifyResourceFile("application.properties", new Function() { + @Override + public String apply(String s) { + return "quarkus.test.continuous-testing=enabled\n"; + } + }); + ts = TestRunnerTestUtils.waitForRun(3); + Assertions.assertEquals(3L, ts.getLastRun()); + Assertions.assertEquals(0L, ts.getTestsFailed()); + Assertions.assertEquals(2L, ts.getTestsPassed()); + Assertions.assertEquals(0L, ts.getTestsSkipped()); + Assertions.assertEquals(-1L, ts.getRunning()); + } +} diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/FooET.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/FooET.java new file mode 100644 index 00000000000000..b9fc344b6a5863 --- /dev/null +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/FooET.java @@ -0,0 +1,21 @@ +package io.quarkus.vertx.http.testrunner.includes; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.CoreMatchers.is; + +import org.junit.jupiter.api.Test; + +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +public class FooET { + + @Test + public void foo() { + given() + .when().get("/hello/greeting/foo") + .then() + .statusCode(200) + .body(is("hello foo")); + } +} diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/IncludePatternTestCase.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/IncludePatternTestCase.java new file mode 100644 index 00000000000000..c549bad77382d5 --- /dev/null +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/includes/IncludePatternTestCase.java @@ -0,0 +1,73 @@ +package io.quarkus.vertx.http.testrunner.includes; + +import java.util.function.Function; +import java.util.function.Supplier; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.quarkus.vertx.http.deployment.devmode.tests.TestStatus; +import io.quarkus.vertx.http.testrunner.HelloResource; +import io.quarkus.vertx.http.testrunner.TestRunnerTestUtils; + +public class IncludePatternTestCase { + + @RegisterExtension + static QuarkusDevModeTest test = new QuarkusDevModeTest() + .setArchiveProducer(new Supplier() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class).addClass(HelloResource.class) + .add(new StringAsset( + "quarkus.test.continuous-testing=enabled\nquarkus.test.include-pattern=.*BarET"), + "application.properties"); + } + }) + .setTestArchiveProducer(new Supplier() { + @Override + public JavaArchive get() { + return ShrinkWrap.create(JavaArchive.class).addClasses(FooET.class, BarET.class); + } + }); + + @Test + public void checkTestsAreRun() throws InterruptedException { + TestStatus ts = TestRunnerTestUtils.waitForFirstRunToComplete(); + Assertions.assertEquals(1L, ts.getLastRun()); + Assertions.assertEquals(0L, ts.getTestsFailed()); + Assertions.assertEquals(1L, ts.getTestsPassed()); + Assertions.assertEquals(0L, ts.getTestsSkipped()); + Assertions.assertEquals(-1L, ts.getRunning()); + + test.modifyResourceFile("application.properties", new Function() { + @Override + public String apply(String s) { + return "quarkus.test.continuous-testing=enabled\nquarkus.test.include-pattern=io\\.quarkus.*"; + } + }); + ts = TestRunnerTestUtils.waitForRun(2); + Assertions.assertEquals(2L, ts.getLastRun()); + Assertions.assertEquals(0L, ts.getTestsFailed()); + Assertions.assertEquals(2L, ts.getTestsPassed()); + Assertions.assertEquals(0L, ts.getTestsSkipped()); + Assertions.assertEquals(-1L, ts.getRunning()); + + test.modifyResourceFile("application.properties", new Function() { + @Override + public String apply(String s) { + return "quarkus.test.continuous-testing=enabled\n"; + } + }); + ts = TestRunnerTestUtils.waitForRun(3); + Assertions.assertEquals(3L, ts.getLastRun()); + Assertions.assertEquals(0L, ts.getTestsFailed()); + Assertions.assertEquals(2L, ts.getTestsPassed()); + Assertions.assertEquals(0L, ts.getTestsSkipped()); + Assertions.assertEquals(-1L, ts.getRunning()); + } +} diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/ExcludeTagsTestCase.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/ExcludeTagsTestCase.java index f6823eac9f2f8d..0a6b24618bdba8 100644 --- a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/ExcludeTagsTestCase.java +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/ExcludeTagsTestCase.java @@ -23,7 +23,8 @@ public class ExcludeTagsTestCase { @Override public JavaArchive get() { return ShrinkWrap.create(JavaArchive.class).addClass(HelloResource.class) - .add(new StringAsset("quarkus.test.exclude-tags=a"), "application.properties"); + .add(new StringAsset("quarkus.test.continuous-testing=enabled\nquarkus.test.exclude-tags=a"), + "application.properties"); } }) .setTestArchiveProducer(new Supplier() { @@ -45,7 +46,7 @@ public void checkTestsAreRun() throws InterruptedException { test.modifyResourceFile("application.properties", new Function() { @Override public String apply(String s) { - return "quarkus.test.exclude-tags=c"; + return "quarkus.test.continuous-testing=enabled\nquarkus.test.exclude-tags=c"; } }); ts = TestRunnerTestUtils.waitForRun(2); @@ -58,7 +59,7 @@ public String apply(String s) { test.modifyResourceFile("application.properties", new Function() { @Override public String apply(String s) { - return ""; + return "quarkus.test.continuous-testing=enabled\n"; } }); ts = TestRunnerTestUtils.waitForRun(3); diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/IncludeTagsTestCase.java b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/IncludeTagsTestCase.java index 6e0bdf3902377d..9d2817cb2de87e 100644 --- a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/IncludeTagsTestCase.java +++ b/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/testrunner/tags/IncludeTagsTestCase.java @@ -23,7 +23,8 @@ public class IncludeTagsTestCase { @Override public JavaArchive get() { return ShrinkWrap.create(JavaArchive.class).addClass(HelloResource.class) - .add(new StringAsset("quarkus.test.include-tags=a"), "application.properties"); + .add(new StringAsset("quarkus.test.continuous-testing=enabled\nquarkus.test.include-tags=a"), + "application.properties"); } }) .setTestArchiveProducer(new Supplier() { @@ -45,7 +46,7 @@ public void checkTestsAreRun() throws InterruptedException { test.modifyResourceFile("application.properties", new Function() { @Override public String apply(String s) { - return "quarkus.test.include-tags=c"; + return "quarkus.test.continuous-testing=enabled\nquarkus.test.include-tags=c"; } }); ts = TestRunnerTestUtils.waitForRun(2); @@ -58,7 +59,7 @@ public String apply(String s) { test.modifyResourceFile("application.properties", new Function() { @Override public String apply(String s) { - return ""; + return "quarkus.test.continuous-testing=enabled\n"; } }); ts = TestRunnerTestUtils.waitForRun(3);