diff --git a/extensions/infinispan-client/deployment/src/main/resources/dev-templates/embedded.html b/extensions/infinispan-client/deployment/src/main/resources/dev-templates/embedded.html index 3fac56e0bcfbc..5443a9930a809 100644 --- a/extensions/infinispan-client/deployment/src/main/resources/dev-templates/embedded.html +++ b/extensions/infinispan-client/deployment/src/main/resources/dev-templates/embedded.html @@ -1,4 +1,4 @@ - + Web Console
diff --git a/extensions/scheduler/deployment/src/main/resources/dev-templates/tags/scheduleInfo.html b/extensions/scheduler/deployment/src/main/resources/dev-templates/tags/scheduleInfo.html index dd3120f2d645f..c124de5fa6d72 100644 --- a/extensions/scheduler/deployment/src/main/resources/dev-templates/tags/scheduleInfo.html +++ b/extensions/scheduler/deployment/src/main/resources/dev-templates/tags/scheduleInfo.html @@ -5,6 +5,6 @@ {/if} {#if it.delay > 0} (with delay {it.delay} {it.delayUnit.toString.toLowerCase}) -{#else if !schedule.delayed.empty} +{#else if !it.delayed.empty} (delayed for {it.delayed}) {/if} \ No newline at end of file diff --git a/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java b/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java index 70a017c41c5dc..15acf01d772b7 100644 --- a/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java +++ b/extensions/vertx-http/deployment/src/main/java/io/quarkus/vertx/http/deployment/devmode/console/DevConsoleProcessor.java @@ -464,7 +464,7 @@ private Engine buildEngine(List devTemplatePaths, // Escape some characters for HTML templates builder.addResultMapper(new HtmlEscaper()); - builder.strictRendering(false) + builder.strictRendering(true) .addValueResolver(new ReflectionValueResolver()) .addValueResolver(new JsonObjectValueResolver()) .addValueResolver(new MultiMapValueResolver()) diff --git a/extensions/vertx-http/deployment/src/main/resources/dev-templates/index.html b/extensions/vertx-http/deployment/src/main/resources/dev-templates/index.html index 676fe54069c72..97ace11515e0b 100644 --- a/extensions/vertx-http/deployment/src/main/resources/dev-templates/index.html +++ b/extensions/vertx-http/deployment/src/main/resources/dev-templates/index.html @@ -24,7 +24,7 @@ {#actionableExtension it/} {/each} - {#if nonActionableExtensions.size() > 0} + {#if nonActionableExtensions}
{#each nonActionableExtensions} diff --git a/extensions/vertx-http/deployment/src/main/resources/dev-templates/io.quarkus.quarkus-vertx-http/config.html b/extensions/vertx-http/deployment/src/main/resources/dev-templates/io.quarkus.quarkus-vertx-http/config.html index 366de87aa28a9..483b8c6faf9ac 100644 --- a/extensions/vertx-http/deployment/src/main/resources/dev-templates/io.quarkus.quarkus-vertx-http/config.html +++ b/extensions/vertx-http/deployment/src/main/resources/dev-templates/io.quarkus.quarkus-vertx-http/config.html @@ -146,9 +146,7 @@
{/if} - {#if item.description.fmtJavadoc && item.description.fmtJavadoc != 'NOT_FOUND'} - {item.description.fmtJavadoc} - {/if} + {item.description.fmtJavadoc??} {/for} diff --git a/extensions/vertx-http/deployment/src/main/resources/dev-templates/main.html b/extensions/vertx-http/deployment/src/main/resources/dev-templates/main.html index 2ebb33ce421a2..f6fe33e4e5663 100644 --- a/extensions/vertx-http/deployment/src/main/resources/dev-templates/main.html +++ b/extensions/vertx-http/deployment/src/main/resources/dev-templates/main.html @@ -14,7 +14,7 @@ @@ -22,7 +22,7 @@ - {#if currentExtensionName && currentExtensionName != 'Eclipse Vert.x - HTTP'} + {#if currentExtensionName?? && currentExtensionName != 'Eclipse Vert.x - HTTP'} {currentExtensionName} › {/if} {#insert title/} @@ -36,7 +36,7 @@ <img src="{devRootAppend}/resources/images/quarkus_icon_rgb_reverse.svg" width="40" height="30" class="d-inline-block align-middle" alt="Quarkus"/> <span id="navbar-title" class="align-middle">Dev UI</span> </a> - {#if currentExtensionName} + {#if currentExtensionName??} <span id="navbar-subtitle" class="navbar-nav"> <span class="navbar-item"> {#if currentExtensionName == 'Eclipse Vert.x - HTTP'} @@ -53,11 +53,11 @@ </nav> <!-- Content section / Tiles --> - <div class="container{#if fluid}-fluid{/if} main-container"> + <div class="container{#if fluid??}-fluid{/if} main-container"> - {#if flash['message']} - <div class="alert alert-{flash['message']['class']} show fade" role="alert" data-timer="{flash['displayTime']}"> - {flash['message']['text']} + {#if flash.message??} + <div class="alert alert-{flash.message.class} show fade" role="alert" data-timer="{flash.displayTime}"> + {flash.message.text} <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> @@ -82,7 +82,7 @@ </a> </div> <div class="col-md-auto px-0"> - {#include logmanagerNav}{/include} + {#include logmanagerNav /} </div> <div class="col"> <a id="devUiFooterResizeButton" class="btn devUiFooterButton float-right showOnOpenFooter"> @@ -102,8 +102,8 @@ </div> </div> - {#include logmanagerModals}{/include} - {#include testsModals}{/include} + {#include logmanagerModals /} + {#include testsModals /} <script src="{devRootAppend}/resources/js/logstream.js"></script> <script src="{devRootAppend}/resources/js/tests.js"></script> diff --git a/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/actionableExtension.html b/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/actionableExtension.html index 82f2240cc5fde..901e71e148324 100644 --- a/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/actionableExtension.html +++ b/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/actionableExtension.html @@ -3,24 +3,24 @@ <div class="card-header bg-primary text-light guide-padding-right"> <div class="row"> <div class="col-md-10"> - {it['name']} + {it.name} </div> <div class="col-md-1"> - {#if it['metadata'] && it['metadata']['guide']} - <a href="{it['metadata']['guide']}" class="text-light float-right" title="Guide"><i class="fa fa-book"></i></a> + {#if it.metadata.guide??} + <a href="{it.metadata.guide}" class="text-light float-right" title="Guide"><i class="fa fa-book"></i></a> {/if} </div> </div> </div> <div class="card-body"> <p class="card-text"> - {#if it['metadata'] && it['metadata']['status'] == 'experimental'} + {#if it.metadata.status?? == 'experimental'} <span class="float-right badge badge-warning">EXPERIMENTAL</span> {/if} - <span class="card-subtitle mb-2 text-muted">{it['description']}</span> + <span class="card-subtitle mb-2 text-muted">{it.description}</span> <br/> - {#if it['_dev']} - {it['_dev'].raw} + {#if it._dev??} + {it._dev.raw} {/if} </p> </div> diff --git a/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/nonActionableExtension.html b/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/nonActionableExtension.html index b6f90b92513a5..a583ca0fdfb49 100644 --- a/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/nonActionableExtension.html +++ b/extensions/vertx-http/deployment/src/main/resources/dev-templates/tags/nonActionableExtension.html @@ -1,27 +1,27 @@ -{#if it['metadata'] && it['metadata']['unlisted'] != true} +{#if it.metadata?? && !it.metadata.unlisted??} <div class="col mb-4"> <div class="card h-100"> <div class="card-header guide-padding-right"> <div class="row"> <div class="col-md-10"> - {it['name']} + {it.name} </div> <div class="col-md-1"> - {#if it['metadata'] && it['metadata']['guide']} - <a href="{it['metadata']['guide']}" class="text-muted float-right" title="Guide"><i class="fa fa-book"></i></a> + {#if it.metadata.guide??} + <a href="{it.metadata.guide}" class="text-muted float-right" title="Guide"><i class="fa fa-book"></i></a> {/if} </div> </div> </div> <div class="card-body"> <p class="card-text"> - {#if it['metadata'] && it['metadata']['status'] == 'experimental'} + {#if it.metadata.status?? == 'experimental'} <span class="float-right badge badge-warning">EXPERIMENTAL</span> {/if} - <span class="card-subtitle mb-2 text-muted">{it['description']}</span> + <span class="card-subtitle mb-2 text-muted">{it.description}</span> <br/> - {#if it['_dev']} - {it['_dev'].raw} + {#if it._dev??} + {it._dev.raw} {/if} </p> </div> diff --git a/integration-tests/devmode/pom.xml b/integration-tests/devmode/pom.xml index 924511e1e5393..1e6992a7f87f2 100644 --- a/integration-tests/devmode/pom.xml +++ b/integration-tests/devmode/pom.xml @@ -13,11 +13,40 @@ <name>Quarkus - Integration Tests - Dev Mode</name> <dependencies> - <!-- test dependencies --> <dependency> <groupId>io.quarkus</groupId> - <artifactId>quarkus-resteasy-deployment</artifactId> + <artifactId>quarkus-resteasy-reactive-deployment</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-scheduler-deployment</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-grpc-deployment</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-qute-deployment</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-smallrye-reactive-messaging-deployment</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-cache-deployment</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-container-image-docker-deployment</artifactId> <scope>test</scope> </dependency> <dependency> @@ -33,7 +62,41 @@ </dependencies> <build> + <extensions> + <extension> + <groupId>kr.motd.maven</groupId> + <artifactId>os-maven-plugin</artifactId> + </extension> + </extensions> <plugins> + <plugin> + <groupId>org.xolstice.maven.plugins</groupId> + <artifactId>protobuf-maven-plugin</artifactId> + <version>0.6.1</version> + <configuration> + <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact> + <pluginId>grpc-java</pluginId> + <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact> + <protocPlugins> + <protocPlugin> + <id>quarkus-grpc-protoc-plugin</id> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-grpc-protoc-plugin</artifactId> + <version>${project.version}</version> + <mainClass>io.quarkus.grpc.protoc.plugin.MutinyGrpcGenerator</mainClass> + </protocPlugin> + </protocPlugins> + </configuration> + <executions> + <execution> + <id>test-compile</id> + <goals> + <goal>test-compile</goal> + <goal>test-compile-custom</goal> + </goals> + </execution> + </executions> + </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleArcSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleArcSmokeTest.java new file mode 100644 index 0000000000000..e6200af03b290 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleArcSmokeTest.java @@ -0,0 +1,60 @@ +package io.quarkus.test.devconsole; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; +import javax.inject.Named; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleArcSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest test = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClasses(Foo.class)); + + @Test + public void testPages() { + RestAssured + .get("q/dev/io.quarkus.quarkus-arc/beans") + .then() + .statusCode(200).body(Matchers.containsString("io.quarkus.test.devconsole.DevConsoleArcSmokeTest$Foo")); + RestAssured + .get("q/dev/io.quarkus.quarkus-arc/observers") + .then() + .statusCode(200) + .body(Matchers.containsString("io.quarkus.test.devconsole.DevConsoleArcSmokeTest$Foo#onStr")); + RestAssured + .get("q/dev/io.quarkus.quarkus-arc/events") + .then() + .statusCode(200).body(Matchers.containsString("io.quarkus.runtime.StartupEvent")); + RestAssured + .get("q/dev/io.quarkus.quarkus-arc/invocations") + .then() + .statusCode(200); + RestAssured + .get("q/dev/io.quarkus.quarkus-arc/removed-beans") + .then() + .statusCode(200).body(Matchers.containsString("org.jboss.logging.Logger")); + } + + @Named + @ApplicationScoped + public static class Foo { + + void onStr(@Observes String event) { + } + + } +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleCacheSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleCacheSmokeTest.java new file mode 100644 index 0000000000000..fba09a816b8a2 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleCacheSmokeTest.java @@ -0,0 +1,42 @@ +package io.quarkus.test.devconsole; + +import javax.inject.Singleton; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.cache.CacheResult; +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleCacheSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addClass(MyBean.class)); + + @Test + public void testCaches() { + RestAssured.get("q/dev/io.quarkus.quarkus-cache/caches") + .then() + .statusCode(200).body(Matchers.containsString("myCache")); + } + + @Singleton + public static class MyBean { + + @CacheResult(cacheName = "myCache") + String ping() { + return "foo"; + } + + } + +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleConfigSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleConfigSmokeTest.java new file mode 100644 index 0000000000000..a76ba7a3f4abf --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleConfigSmokeTest.java @@ -0,0 +1,29 @@ +package io.quarkus.test.devconsole; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleConfigSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); + + @Test + public void testConfigEditor() { + RestAssured.get("q/dev/io.quarkus.quarkus-vertx-http/config") + .then() + .statusCode(200).body(Matchers.containsString("Config Editor")); + + } +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleContainerImageSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleContainerImageSmokeTest.java new file mode 100644 index 0000000000000..b00f2a86c5fe5 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleContainerImageSmokeTest.java @@ -0,0 +1,29 @@ +package io.quarkus.test.devconsole; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleContainerImageSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)); + + @Test + public void testCaches() { + RestAssured.get("q/dev/io.quarkus.quarkus-container-image/build") + .then() + .statusCode(200).body(Matchers.containsString("Build Type")); + } + +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleGrpcSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleGrpcSmokeTest.java new file mode 100644 index 0000000000000..5ef32caa2036e --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleGrpcSmokeTest.java @@ -0,0 +1,46 @@ +package io.quarkus.test.devconsole; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.grpc.examples.helloworld.Greeter; +import io.grpc.examples.helloworld.HelloReply; +import io.grpc.examples.helloworld.HelloRequest; +import io.quarkus.grpc.GrpcService; +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; +import io.smallrye.mutiny.Uni; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleGrpcSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addPackage(Greeter.class.getPackage()) + .addClass(TestGreeter.class)) + .setCodeGenSources("proto"); + + @Test + public void testServices() { + RestAssured.get("q/dev/io.quarkus.quarkus-grpc/services") + .then() + .statusCode(200).body(Matchers.containsString("helloworld.Greeter")); + } + + @GrpcService + public static class TestGreeter implements Greeter { + + @Override + public Uni<HelloReply> sayHello(HelloRequest request) { + return Uni.createFrom().item(HelloReply.newBuilder().setMessage("Hola!").build()); + } + + } + +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleQuteSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleQuteSmokeTest.java new file mode 100644 index 0000000000000..4ba3409a830f0 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleQuteSmokeTest.java @@ -0,0 +1,32 @@ +package io.quarkus.test.devconsole; + +import org.hamcrest.Matchers; +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.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleQuteSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addAsResource(new StringAsset( + "{hello}"), + "templates/hello.txt")); + + @Test + public void testTemplates() { + RestAssured.get("q/dev/io.quarkus.quarkus-qute/templates") + .then() + .statusCode(200).body(Matchers.containsString("hello.txt")); + } + +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleReactiveMessagingSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleReactiveMessagingSmokeTest.java new file mode 100644 index 0000000000000..2eaa736753d34 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleReactiveMessagingSmokeTest.java @@ -0,0 +1,35 @@ +package io.quarkus.test.devconsole; + +import org.hamcrest.Matchers; +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.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleReactiveMessagingSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addClasses(MyProcessor.class, DummyConnector.class) + .addAsResource( + new StringAsset( + "mp.messaging.incoming.input.connector=dummy\n" + + "mp.messaging.incoming.input.values=hallo"), + "application.properties")); + + @Test + public void testProcessor() { + RestAssured.get("q/dev/io.quarkus.quarkus-smallrye-reactive-messaging/channels") + .then() + .statusCode(200).body(Matchers.containsString("io.quarkus.test.devconsole.MyProcessor#process")); + } + +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleResteastyReactiveSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleResteastyReactiveSmokeTest.java new file mode 100644 index 0000000000000..9ad1ed8c23c26 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleResteastyReactiveSmokeTest.java @@ -0,0 +1,32 @@ +package io.quarkus.test.devconsole; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleResteastyReactiveSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addClass(MyResource.class)); + + @Test + public void testTemplates() { + RestAssured.get("q/dev/io.quarkus.quarkus-resteasy-reactive/endpoints") + .then() + .statusCode(200).body(Matchers.containsString("GET /me/message")); + RestAssured.get("q/dev/io.quarkus.quarkus-resteasy-reactive/scores") + .then() + .statusCode(200).body(Matchers.containsString("GET /me/message")); + } + +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleSchedulerSmokeTest.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleSchedulerSmokeTest.java new file mode 100644 index 0000000000000..fdfae4c6dd863 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleSchedulerSmokeTest.java @@ -0,0 +1,43 @@ +package io.quarkus.test.devconsole; + +import java.util.concurrent.TimeUnit; + +import org.hamcrest.Matchers; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.scheduler.Scheduled; +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +/** + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. + */ +public class DevConsoleSchedulerSmokeTest { + + @RegisterExtension + static final QuarkusDevModeTest config = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addClass(Jobs.class)); + + @Test + public void testScheduler() { + RestAssured.get("q/dev") + .then() + .statusCode(200).body(Matchers.containsString("Schedules")); + RestAssured.get("q/dev/io.quarkus.quarkus-scheduler/schedules") + .then() + .statusCode(200).body(Matchers.containsString("Scheduler is running")); + } + + public static class Jobs { + + @Scheduled(every = "2h", delay = 2, delayUnit = TimeUnit.HOURS) + public void run() { + } + + } + +} diff --git a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/devconsole/DevConsoleSmokeIT.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleSmokeTest.java similarity index 73% rename from extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/devconsole/DevConsoleSmokeIT.java rename to integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleSmokeTest.java index 20830f3e88d0e..6dcdcc2a4d2cf 100644 --- a/extensions/vertx-http/deployment/src/test/java/io/quarkus/vertx/http/devconsole/DevConsoleSmokeIT.java +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DevConsoleSmokeTest.java @@ -1,4 +1,4 @@ -package io.quarkus.vertx.http.devconsole; +package io.quarkus.test.devconsole; import org.hamcrest.Matchers; import org.jboss.shrinkwrap.api.ShrinkWrap; @@ -10,9 +10,10 @@ import io.restassured.RestAssured; /** - * This needs to be an integration test so the pom.properties has already been created + * Note that this test cannot be placed under the relevant {@code -deployment} module because then the DEV UI processor would + * not be able to locate the template resources correctly. */ -public class DevConsoleSmokeIT { +public class DevConsoleSmokeTest { @RegisterExtension static final QuarkusDevModeTest config = new QuarkusDevModeTest() diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DummyConnector.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DummyConnector.java new file mode 100644 index 0000000000000..000b708afaccc --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/DummyConnector.java @@ -0,0 +1,22 @@ +package io.quarkus.test.devconsole; + +import javax.enterprise.context.ApplicationScoped; + +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.reactive.messaging.Message; +import org.eclipse.microprofile.reactive.messaging.spi.Connector; +import org.eclipse.microprofile.reactive.messaging.spi.IncomingConnectorFactory; +import org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder; +import org.eclipse.microprofile.reactive.streams.operators.ReactiveStreams; + +@ApplicationScoped +@Connector("dummy") +public class DummyConnector implements IncomingConnectorFactory { + + @Override + public PublisherBuilder<? extends Message<?>> getPublisherBuilder(Config config) { + String values = config.getValue("values", String.class); + return ReactiveStreams.of(values, values.toUpperCase()) + .map(Message::of); + } +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/MyProcessor.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/MyProcessor.java new file mode 100644 index 0000000000000..e6da780f8ef52 --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/MyProcessor.java @@ -0,0 +1,60 @@ +package io.quarkus.test.devconsole; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.event.Observes; +import javax.enterprise.inject.Instance; +import javax.inject.Inject; + +import org.eclipse.microprofile.reactive.messaging.Channel; +import org.eclipse.microprofile.reactive.messaging.Incoming; +import org.eclipse.microprofile.reactive.messaging.Outgoing; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import io.smallrye.reactive.messaging.annotations.Broadcast; +import io.vertx.core.http.HttpServerResponse; +import io.vertx.ext.web.Router; + +@ApplicationScoped +public class MyProcessor { + + @Inject + @Channel("processed") + Instance<Publisher<String>> channel; + + public void init(@Observes Router router) { + router.get().handler(rc -> { + HttpServerResponse response = rc.response(); + channel.get().subscribe(new Subscriber<String>() { + @Override + public void onSubscribe(Subscription subscription) { + response.putHeader("Transfer-encoding", "chunked"); + subscription.request(2); + } + + @Override + public void onNext(String s) { + response.write(s); + } + + @Override + public void onError(Throwable throwable) { + // ignore it. + } + + @Override + public void onComplete() { + response.end(); + } + }); + }); + } + + @Incoming("input") + @Outgoing("processed") + @Broadcast + public String process(String input) { + return input.toUpperCase(); + } +} diff --git a/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/MyResource.java b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/MyResource.java new file mode 100644 index 0000000000000..d372752abd26b --- /dev/null +++ b/integration-tests/devmode/src/test/java/io/quarkus/test/devconsole/MyResource.java @@ -0,0 +1,17 @@ +package io.quarkus.test.devconsole; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/me") +public class MyResource { + + @Path("message") + @GET + @Produces(MediaType.TEXT_PLAIN) + public String getMessage() { + return "hello"; + } +} diff --git a/integration-tests/devmode/src/test/proto/helloworld.proto b/integration-tests/devmode/src/test/proto/helloworld.proto new file mode 100644 index 0000000000000..fe9dd59955f1b --- /dev/null +++ b/integration-tests/devmode/src/test/proto/helloworld.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.helloworld"; +option java_outer_classname = "HelloWorldProto"; +option objc_class_prefix = "HLW"; + +package helloworld; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} \ No newline at end of file