You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2020/09/07 12:49:14 UTC

[camel-quarkus] branch master updated (d461074 -> 91076b4)

This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git.


    from d461074  Schematron JVM support
     new 757529d  Dropbox native support
     new 91076b4  Replace restcountries endpoint with local service

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docs/modules/ROOT/pages/reference/components.adoc  |   4 +-
 .../ROOT/pages/reference/extensions/dropbox.adoc   |   8 +-
 docs/modules/ROOT/pages/reference/index.adoc       |   4 +-
 .../dropbox/deployment/DropboxProcessor.java       |  46 ----------
 extensions-jvm/dropbox/integration-test/pom.xml    |  95 ---------------------
 .../component/dropbox/it/DropboxResource.java      |  51 -----------
 .../quarkus/component/dropbox/it/DropboxTest.java  |  34 --------
 extensions-jvm/pom.xml                             |   1 -
 .../dropbox/deployment/pom.xml                     |   0
 .../dropbox/deployment/DropboxProcessor.java}      |  24 +++---
 {extensions-jvm => extensions}/dropbox/pom.xml     |   1 -
 .../dropbox/runtime/pom.xml                        |   0
 .../main/resources/META-INF/quarkus-extension.yaml |   3 +-
 extensions/pom.xml                                 |   1 +
 integration-tests/dropbox/README.adoc              |  12 +++
 integration-tests/{git => dropbox}/pom.xml         |  19 ++---
 .../component/dropbox/it/DropboxResource.java}     |  68 ++++++++-------
 .../quarkus/component/dropbox/it/DropboxIT.java}   |   7 +-
 .../quarkus/component/dropbox/it/DropboxTest.java} |  42 ++++-----
 .../quarkus/component/http/it/HttpResource.java    |  33 +++----
 .../camel/quarkus/component/http/it/HttpRoute.java |  43 ++++++++++
 .../http/src/main/resources/application.properties |   2 +-
 .../http/src/main/resources/jsse/truststore.jks    | Bin 0 -> 1018 bytes
 .../http/src/main/resources/restcountries/cz.json  |  81 ++++++++++++++++++
 .../camel/quarkus/component/http/it/HttpTest.java  |  20 +----
 .../component/http/it/HttpTestResource.java        |   3 +-
 integration-tests/pom.xml                          |   1 +
 pom.xml                                            |   1 +
 tooling/scripts/test-categories.yaml               |   1 +
 29 files changed, 255 insertions(+), 350 deletions(-)
 delete mode 100644 extensions-jvm/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java
 delete mode 100644 extensions-jvm/dropbox/integration-test/pom.xml
 delete mode 100644 extensions-jvm/dropbox/integration-test/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java
 delete mode 100644 extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
 rename {extensions-jvm => extensions}/dropbox/deployment/pom.xml (100%)
 copy extensions/{graphql/deployment/src/main/java/org/apache/camel/quarkus/component/graphql/deployment/GraphQLProcessor.java => dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java} (66%)
 rename {extensions-jvm => extensions}/dropbox/pom.xml (97%)
 rename {extensions-jvm => extensions}/dropbox/runtime/pom.xml (100%)
 rename {extensions-jvm => extensions}/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml (97%)
 create mode 100644 integration-tests/dropbox/README.adoc
 copy integration-tests/{git => dropbox}/pom.xml (86%)
 copy integration-tests/{google/src/main/java/org/apache/camel/quarkus/component/google/it/GoogleDriveResource.java => dropbox/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java} (50%)
 copy integration-tests/{telegram/src/test/java/org/apache/camel/quarkus/component/telegram/it/TelegramIT.java => dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxIT.java} (78%)
 copy integration-tests/{sql/src/test/java/org/apache/camel/quarkus/component/sql/it/SqlTest.java => dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java} (61%)
 create mode 100644 integration-tests/http/src/main/resources/jsse/truststore.jks
 create mode 100644 integration-tests/http/src/main/resources/restcountries/cz.json


[camel-quarkus] 02/02: Replace restcountries endpoint with local service

Posted by pp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 91076b40ed7fa4684c9d00e5e092eb79fec1eb93
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Sep 7 12:13:06 2020 +0100

    Replace restcountries endpoint with local service
    
    Fixes #1538
---
 .../quarkus/component/http/it/HttpResource.java    |  33 +++++----
 .../camel/quarkus/component/http/it/HttpRoute.java |  43 +++++++++++
 .../http/src/main/resources/application.properties |   2 +-
 .../http/src/main/resources/jsse/truststore.jks    | Bin 0 -> 1018 bytes
 .../http/src/main/resources/restcountries/cz.json  |  81 +++++++++++++++++++++
 .../camel/quarkus/component/http/it/HttpTest.java  |  20 +----
 .../component/http/it/HttpTestResource.java        |   3 +-
 pom.xml                                            |   1 +
 8 files changed, 148 insertions(+), 35 deletions(-)

diff --git a/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java
index a35d590..17ec0ce 100644
--- a/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java
+++ b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpResource.java
@@ -50,7 +50,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String get(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("ahc:http://localhost:" + port + "/service/get?bridgeEndpoint=true")
+                .toF("ahc:http://localhost:%d/service/get?bridgeEndpoint=true", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -58,9 +58,10 @@ public class HttpResource {
     @Path("/ahc/get-https")
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String getHttps() {
+    public String getHttps(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("ahc:https://restcountries.com/v2/alpha/cz?bridgeEndpoint=true")
+                .toF("ahc:https://localhost:%d/countries/cz?bridgeEndpoint=true&sslContextParameters=#sslContextParameters",
+                        port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -71,7 +72,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String post(@QueryParam("test-port") int port, String message) {
         return producerTemplate
-                .to("ahc://http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true")
+                .toF("ahc://http://localhost:%d/service/toUpper?bridgeEndpoint=true", port)
                 .withBody(message)
                 .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
                 .withHeader(Exchange.HTTP_METHOD, "POST")
@@ -107,7 +108,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String httpGet(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("http://localhost:" + port + "/service/get?bridgeEndpoint=true")
+                .toF("http://localhost:%d/service/get?bridgeEndpoint=true", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -115,9 +116,9 @@ public class HttpResource {
     @Path("/http/get-https")
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String httpGetHttps() {
+    public String httpGetHttps(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("https://restcountries.com/v2/alpha/cz?bridgeEndpoint=true")
+                .toF("https://localhost:%d/countries/cz?bridgeEndpoint=true&sslContextParameters=#sslContextParameters", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -128,7 +129,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String httpPost(@QueryParam("test-port") int port, String message) {
         return producerTemplate
-                .to("http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true")
+                .toF("http://localhost:%d/service/toUpper?bridgeEndpoint=true", port)
                 .withBody(message)
                 .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
                 .withHeader(Exchange.HTTP_METHOD, "POST")
@@ -146,7 +147,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String nettyHttpGet(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("netty-http:http://localhost:" + port + "/service/get?bridgeEndpoint=true")
+                .toF("netty-http:http://localhost:%d/service/get?bridgeEndpoint=true", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -154,9 +155,9 @@ public class HttpResource {
     @Path("/netty-http/get-https")
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String nettyHttpGetHttps() {
+    public String nettyHttpGetHttps(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("netty-http:https://restcountries.com/v2/alpha/cz?ssl=true&passphrase=changeit&keyStoreResource=classpath:jsse/keystore.p12&trustStoreResource=file:{{javax.net.ssl.trustStore}}")
+                .toF("netty-http:https://localhost:%d/countries/cz?sslContextParameters=#sslContextParameters", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -167,7 +168,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String hettyHttpPost(@QueryParam("test-port") int port, String message) {
         return producerTemplate
-                .to("netty-http://http://localhost:" + port + "/service/toUpper?bridgeEndpoint=true")
+                .toF("netty-http:http://localhost:%d/service/toUpper?bridgeEndpoint=true", port)
                 .withBody(message)
                 .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
                 .withHeader(Exchange.HTTP_METHOD, "POST")
@@ -185,7 +186,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String vertxHttpGet(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("vertx-http:http://localhost:" + port + "/service/get")
+                .toF("vertx-http:http://localhost:%d/service/get", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -193,9 +194,9 @@ public class HttpResource {
     @Path("/vertx-http/get-https")
     @GET
     @Produces(MediaType.TEXT_PLAIN)
-    public String vertxHttpHttps() {
+    public String vertxHttpHttps(@QueryParam("test-port") int port) {
         return producerTemplate
-                .to("vertx-http:https://restcountries.com/v2/alpha/cz")
+                .toF("vertx-http:https://localhost:%d/countries/cz?sslContextParameters=#sslContextParameters", port)
                 .withHeader(Exchange.HTTP_METHOD, "GET")
                 .request(String.class);
     }
@@ -206,7 +207,7 @@ public class HttpResource {
     @Produces(MediaType.TEXT_PLAIN)
     public String vertxHttpPost(@QueryParam("test-port") int port, String message) {
         return producerTemplate
-                .to("vertx-http:http://localhost:" + port + "/service/toUpper")
+                .toF("vertx-http:http://localhost:%d/service/toUpper", port)
                 .withBody(message)
                 .withHeader(Exchange.CONTENT_TYPE, MediaType.TEXT_PLAIN)
                 .withHeader(Exchange.HTTP_METHOD, "POST")
diff --git a/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java
index 46f5028..c083687 100644
--- a/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java
+++ b/integration-tests/http/src/main/java/org/apache/camel/quarkus/component/http/it/HttpRoute.java
@@ -16,7 +16,17 @@
  */
 package org.apache.camel.quarkus.component.http.it;
 
+import java.io.InputStream;
+
+import javax.inject.Named;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.support.jsse.KeyManagersParameters;
+import org.apache.camel.support.jsse.KeyStoreParameters;
+import org.apache.camel.support.jsse.SSLContextParameters;
+import org.apache.camel.support.jsse.TrustManagersParameters;
 
 public class HttpRoute extends RouteBuilder {
     @Override
@@ -24,7 +34,40 @@ public class HttpRoute extends RouteBuilder {
         from("netty-http:http://0.0.0.0:{{camel.netty-http.test-port}}/test/server/hello")
                 .transform().constant("Netty Hello World");
 
+        from("netty-http:http://0.0.0.0:{{camel.netty-http.https-test-port}}/countries/cz?ssl=true&sslContextParameters=#sslContextParameters")
+                .process(new Processor() {
+                    @Override
+                    public void process(Exchange exchange) throws Exception {
+                        InputStream stream = HttpRoute.class.getResourceAsStream("/restcountries/cz.json");
+                        String json = exchange.getContext().getTypeConverter().convertTo(String.class, stream);
+                        exchange.getMessage().setBody(json);
+                    }
+                });
+
         from("direct:ahcWsIn")
                 .toD("ahc-ws:localhost:${header.test-port}/ahc-ws/greeting");
     }
+
+    @Named
+    public SSLContextParameters sslContextParameters() {
+        KeyStoreParameters keystoreParameters = new KeyStoreParameters();
+        keystoreParameters.setResource("/jsse/keystore.p12");
+        keystoreParameters.setPassword("changeit");
+
+        KeyStoreParameters truststoreParameters = new KeyStoreParameters();
+        truststoreParameters.setResource("/jsse/truststore.jks");
+        truststoreParameters.setPassword("changeit");
+
+        TrustManagersParameters trustManagersParameters = new TrustManagersParameters();
+        trustManagersParameters.setKeyStore(truststoreParameters);
+        SSLContextParameters sslContextParameters = new SSLContextParameters();
+        sslContextParameters.setTrustManagers(trustManagersParameters);
+
+        KeyManagersParameters keyManagersParameters = new KeyManagersParameters();
+        keyManagersParameters.setKeyPassword("changeit");
+        keyManagersParameters.setKeyStore(keystoreParameters);
+        sslContextParameters.setKeyManagers(keyManagersParameters);
+
+        return sslContextParameters;
+    }
 }
diff --git a/integration-tests/http/src/main/resources/application.properties b/integration-tests/http/src/main/resources/application.properties
index 0892e7c..82a564a 100644
--- a/integration-tests/http/src/main/resources/application.properties
+++ b/integration-tests/http/src/main/resources/application.properties
@@ -18,4 +18,4 @@
 #
 # Quarkus
 #
-quarkus.native.additional-build-args = -H:IncludeResources=jsse/keystore.p12
+quarkus.native.additional-build-args = -H:IncludeResources=jsse/.*,-H:IncludeResources=restcountries/cz.json
diff --git a/integration-tests/http/src/main/resources/jsse/truststore.jks b/integration-tests/http/src/main/resources/jsse/truststore.jks
new file mode 100644
index 0000000..9624503
Binary files /dev/null and b/integration-tests/http/src/main/resources/jsse/truststore.jks differ
diff --git a/integration-tests/http/src/main/resources/restcountries/cz.json b/integration-tests/http/src/main/resources/restcountries/cz.json
new file mode 100644
index 0000000..87701b1
--- /dev/null
+++ b/integration-tests/http/src/main/resources/restcountries/cz.json
@@ -0,0 +1,81 @@
+{
+  "name": "Czech Republic",
+  "topLevelDomain": [
+    ".cz"
+  ],
+  "alpha2Code": "CZ",
+  "alpha3Code": "CZE",
+  "callingCodes": [
+    "420"
+  ],
+  "capital": "Prague",
+  "altSpellings": [
+    "CZ",
+    "Česká republika",
+    "Česko"
+  ],
+  "region": "Europe",
+  "subregion": "Eastern Europe",
+  "population": 10558524,
+  "latlng": [
+    49.75,
+    15.5
+  ],
+  "demonym": "Czech",
+  "area": 78865.0,
+  "gini": 26.0,
+  "timezones": [
+    "UTC+01:00"
+  ],
+  "borders": [
+    "AUT",
+    "DEU",
+    "POL",
+    "SVK"
+  ],
+  "nativeName": "Česká republika",
+  "numericCode": "203",
+  "currencies": [
+    {
+      "code": "CZK",
+      "name": "Czech koruna",
+      "symbol": "Kč"
+    }
+  ],
+  "languages": [
+    {
+      "iso639_1": "cs",
+      "iso639_2": "ces",
+      "name": "Czech",
+      "nativeName": "čeština"
+    },
+    {
+      "iso639_1": "sk",
+      "iso639_2": "slk",
+      "name": "Slovak",
+      "nativeName": "slovenčina"
+    }
+  ],
+  "translations": {
+    "de": "Tschechische Republik",
+    "es": "República Checa",
+    "fr": "République tchèque",
+    "ja": "チェコ",
+    "it": "Repubblica Ceca",
+    "br": "República Tcheca",
+    "pt": "República Checa",
+    "nl": "Tsjechië",
+    "hr": "Češka",
+    "fa": "جمهوری چک"
+  },
+  "flag": "https://restcountries.eu/data/cze.svg",
+  "regionalBlocs": [
+    {
+      "acronym": "EU",
+      "name": "European Union",
+      "otherAcronyms": [],
+      "otherNames": []
+    }
+  ],
+  "cioc": "CZE"
+}
diff --git a/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java
index c794889..82b9d67 100644
--- a/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java
+++ b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.quarkus.component.http.it;
 import io.quarkus.test.common.QuarkusTestResource;
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
-import org.apache.camel.quarkus.test.TrustStoreResource;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
@@ -29,7 +28,6 @@ import static org.hamcrest.Matchers.is;
 
 @QuarkusTest
 @QuarkusTestResource(HttpTestResource.class)
-@QuarkusTestResource(TrustStoreResource.class)
 class HttpTest {
     @ParameterizedTest
     @ValueSource(strings = { "ahc", "http", "netty-http", "vertx-http" })
@@ -55,25 +53,14 @@ class HttpTest {
     @ParameterizedTest
     @ValueSource(strings = { "ahc", "http", "netty-http", "vertx-http" })
     public void httpsProducer(String component) {
-        RestAssured
-                .given()
-                .when()
-                .get("/test/client/{component}/get-https", component)
-                .then()
-                .body(containsString("Czech Republic"));
-    }
+        final int port = Integer.getInteger("camel.netty-http.https-test-port");
 
-    @Test
-    public void restcountries() throws Exception {
         RestAssured
                 .given()
-                .baseUri("https://restcountries.com")
-                .port(443)
+                .queryParam("test-port", port)
                 .when()
-                .accept("application/json")
-                .get("/v2/alpha/cz")
+                .get("/test/client/{component}/get-https", component)
                 .then()
-                .statusCode(200)
                 .body(containsString("Czech Republic"));
     }
 
@@ -101,5 +88,4 @@ class HttpTest {
                 .then()
                 .body(is("Hello " + body));
     }
-
 }
diff --git a/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java
index c1a0daf..c60b157 100644
--- a/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java
+++ b/integration-tests/http/src/test/java/org/apache/camel/quarkus/component/http/it/HttpTestResource.java
@@ -25,7 +25,8 @@ import org.apache.camel.quarkus.test.AvailablePortFinder;
 public class HttpTestResource implements QuarkusTestResourceLifecycleManager {
     @Override
     public Map<String, String> start() {
-        return AvailablePortFinder.reserveNetworkPorts(Objects::toString, "camel.netty-http.test-port");
+        return AvailablePortFinder.reserveNetworkPorts(Objects::toString, "camel.netty-http.test-port",
+                "camel.netty-http.https-test-port");
     }
 
     @Override
diff --git a/pom.xml b/pom.xml
index d3c3be5..7996082 100644
--- a/pom.xml
+++ b/pom.xml
@@ -378,6 +378,7 @@
                             <exclude>**/*.ftl</exclude>
                             <exclude>**/*.graphql</exclude>
                             <exclude>**/*.ics</exclude>
+                            <exclude>**/*.jks</exclude>
                             <exclude>**/*.lock</exclude>
                             <exclude>**/*.mp3</exclude>
                             <exclude>**/*.mp4</exclude>


[camel-quarkus] 01/02: Dropbox native support

Posted by pp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ppalaga pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 757529d29bf329c256612e07b111241010ffcac7
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Sep 7 07:44:40 2020 +0100

    Dropbox native support
    
    Fixes #1577
---
 docs/modules/ROOT/pages/reference/components.adoc  |   4 +-
 .../ROOT/pages/reference/extensions/dropbox.adoc   |   8 +-
 docs/modules/ROOT/pages/reference/index.adoc       |   4 +-
 .../component/dropbox/it/DropboxResource.java      |  51 ----------
 extensions-jvm/pom.xml                             |   1 -
 .../dropbox/deployment/pom.xml                     |   0
 .../dropbox/deployment/DropboxProcessor.java       |  31 ++++---
 {extensions-jvm => extensions}/dropbox/pom.xml     |   1 -
 .../dropbox/runtime/pom.xml                        |   0
 .../main/resources/META-INF/quarkus-extension.yaml |   3 +-
 extensions/pom.xml                                 |   1 +
 integration-tests/dropbox/README.adoc              |  12 +++
 .../dropbox}/pom.xml                               |  62 ++++++++++---
 .../component/dropbox/it/DropboxResource.java      | 103 +++++++++++++++++++++
 .../quarkus/component/dropbox/it/DropboxIT.java    |  19 ++--
 .../quarkus/component/dropbox/it/DropboxTest.java  |  36 ++++++-
 integration-tests/pom.xml                          |   1 +
 tooling/scripts/test-categories.yaml               |   1 +
 18 files changed, 232 insertions(+), 106 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/components.adoc b/docs/modules/ROOT/pages/reference/components.adoc
index eace763..b030c34 100644
--- a/docs/modules/ROOT/pages/reference/components.adoc
+++ b/docs/modules/ROOT/pages/reference/components.adoc
@@ -280,8 +280,8 @@ Stable | 1.0.0 | Map between Java beans using the Dozer mapping library.
 | xref:reference/extensions/drill.adoc[Drill] | [.camel-element-artifact]##camel-quarkus-drill## | [.camel-element-JVM]##JVM## +
 Preview | 1.1.0 | Perform queries against an Apache Drill cluster.
 
-| xref:reference/extensions/dropbox.adoc[Dropbox] | [.camel-element-artifact]##camel-quarkus-dropbox## | [.camel-element-JVM]##JVM## +
-Preview | 1.1.0 | Upload, download and manage files, folders, groups, collaborations, etc on Dropbox.
+| xref:reference/extensions/dropbox.adoc[Dropbox] | [.camel-element-artifact]##camel-quarkus-dropbox## | [.camel-element-Native]##Native## +
+Stable | 1.1.0 | Upload, download and manage files, folders, groups, collaborations, etc on Dropbox.
 
 | xref:reference/extensions/ehcache.adoc[Ehcache] | [.camel-element-artifact]##camel-quarkus-ehcache## | [.camel-element-JVM]##JVM## +
 Preview | 1.1.0 | Perform caching operations using Ehcache.
diff --git a/docs/modules/ROOT/pages/reference/extensions/dropbox.adoc b/docs/modules/ROOT/pages/reference/extensions/dropbox.adoc
index 0256dfb..36a6f10 100644
--- a/docs/modules/ROOT/pages/reference/extensions/dropbox.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/dropbox.adoc
@@ -6,7 +6,7 @@
 :page-aliases: extensions/dropbox.adoc
 
 [.badges]
-[.badge-key]##Since Camel Quarkus##[.badge-version]##1.1.0## [.badge-key]##JVM##[.badge-supported]##supported## [.badge-key]##Native##[.badge-unsupported]##unsupported##
+[.badge-key]##Since Camel Quarkus##[.badge-version]##1.1.0## [.badge-key]##JVM##[.badge-supported]##supported## [.badge-key]##Native##[.badge-supported]##supported##
 
 Upload, download and manage files, folders, groups, collaborations, etc on Dropbox.
 
@@ -27,3 +27,9 @@ Please refer to the above link for usage and configuration details.
 ----
 
 Check the xref:user-guide/index.adoc[User guide] for more information about writing Camel Quarkus applications.
+
+== SSL in native mode
+
+This extension auto-enables SSL support in native mode. Hence you do not need to add
+`quarkus.ssl.native=true` to your `application.properties` yourself. See also
+https://quarkus.io/guides/native-and-ssl[Quarkus SSL guide].
diff --git a/docs/modules/ROOT/pages/reference/index.adoc b/docs/modules/ROOT/pages/reference/index.adoc
index 6881fd5..cb4b585 100644
--- a/docs/modules/ROOT/pages/reference/index.adoc
+++ b/docs/modules/ROOT/pages/reference/index.adoc
@@ -287,8 +287,8 @@ Stable | 1.0.0 | Map between Java beans using the Dozer mapping library.
 |  xref:reference/extensions/drill.adoc[Drill]  | camel-quarkus-drill | [.camel-element-JVM]##JVM## +
 Preview | 1.1.0 | Perform queries against an Apache Drill cluster.
 
-|  xref:reference/extensions/dropbox.adoc[Dropbox]  | camel-quarkus-dropbox | [.camel-element-JVM]##JVM## +
-Preview | 1.1.0 | Upload, download and manage files, folders, groups, collaborations, etc on Dropbox.
+|  xref:reference/extensions/dropbox.adoc[Dropbox]  | camel-quarkus-dropbox | [.camel-element-Native]##Native## +
+Stable | 1.1.0 | Upload, download and manage files, folders, groups, collaborations, etc on Dropbox.
 
 |  xref:reference/extensions/ehcache.adoc[Ehcache]  | camel-quarkus-ehcache | [.camel-element-JVM]##JVM## +
 Preview | 1.1.0 | Perform caching operations using Ehcache.
diff --git a/extensions-jvm/dropbox/integration-test/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java b/extensions-jvm/dropbox/integration-test/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java
deleted file mode 100644
index e0db93d..0000000
--- a/extensions-jvm/dropbox/integration-test/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.dropbox.it;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.camel.CamelContext;
-import org.jboss.logging.Logger;
-
-@Path("/dropbox")
-@ApplicationScoped
-public class DropboxResource {
-
-    private static final Logger LOG = Logger.getLogger(DropboxResource.class);
-
-    private static final String COMPONENT_DROPBOX = "dropbox";
-    @Inject
-    CamelContext context;
-
-    @Path("/load/component/dropbox")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Response loadComponentDropbox() throws Exception {
-        /* This is an autogenerated test */
-        if (context.getComponent(COMPONENT_DROPBOX) != null) {
-            return Response.ok().build();
-        }
-        LOG.warnf("Could not load [%s] from the Camel context", COMPONENT_DROPBOX);
-        return Response.status(500, COMPONENT_DROPBOX + " could not be loaded from the Camel context").build();
-    }
-}
diff --git a/extensions-jvm/pom.xml b/extensions-jvm/pom.xml
index ba8d5de..f8852af 100644
--- a/extensions-jvm/pom.xml
+++ b/extensions-jvm/pom.xml
@@ -64,7 +64,6 @@
         <module>djl</module>
         <module>dns</module>
         <module>drill</module>
-        <module>dropbox</module>
         <module>ehcache</module>
         <module>elsql</module>
         <module>etcd</module>
diff --git a/extensions-jvm/dropbox/deployment/pom.xml b/extensions/dropbox/deployment/pom.xml
similarity index 100%
rename from extensions-jvm/dropbox/deployment/pom.xml
rename to extensions/dropbox/deployment/pom.xml
diff --git a/extensions-jvm/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java b/extensions/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java
similarity index 58%
rename from extensions-jvm/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java
rename to extensions/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java
index 2a5a7b6..745ed30 100644
--- a/extensions-jvm/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java
+++ b/extensions/dropbox/deployment/src/main/java/org/apache/camel/quarkus/component/dropbox/deployment/DropboxProcessor.java
@@ -17,16 +17,13 @@
 package org.apache.camel.quarkus.component.dropbox.deployment;
 
 import io.quarkus.deployment.annotations.BuildStep;
-import io.quarkus.deployment.annotations.ExecutionTime;
-import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.ExtensionSslNativeSupportBuildItem;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
-import io.quarkus.deployment.pkg.steps.NativeBuild;
-import org.apache.camel.quarkus.core.JvmOnlyRecorder;
-import org.jboss.logging.Logger;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
 
 class DropboxProcessor {
 
-    private static final Logger LOG = Logger.getLogger(DropboxProcessor.class);
     private static final String FEATURE = "camel-dropbox";
 
     @BuildStep
@@ -34,13 +31,19 @@ class DropboxProcessor {
         return new FeatureBuildItem(FEATURE);
     }
 
-    /**
-     * Remove this once this extension starts supporting the native mode.
-     */
-    @BuildStep(onlyIf = NativeBuild.class)
-    @Record(value = ExecutionTime.RUNTIME_INIT)
-    void warnJvmInNative(JvmOnlyRecorder recorder) {
-        JvmOnlyRecorder.warnJvmInNative(LOG, FEATURE); // warn at build time
-        recorder.warnJvmInNative(FEATURE); // warn at runtime
+    @BuildStep
+    ExtensionSslNativeSupportBuildItem activateSslNativeSupport() {
+        return new ExtensionSslNativeSupportBuildItem(FEATURE);
+    }
+
+    @BuildStep
+    RuntimeInitializedClassBuildItem runtimeInitializedClasses() {
+        return new RuntimeInitializedClassBuildItem("com.dropbox.core.http.SSLConfig");
+    }
+
+    @BuildStep
+    NativeImageResourceBuildItem nativeImageResources() {
+        // Required by com.dropbox.core.http.SSLConfig
+        return new NativeImageResourceBuildItem("com/dropbox/core/trusted-certs.raw", "com/dropbox/core/sdk-version.txt");
     }
 }
diff --git a/extensions-jvm/dropbox/pom.xml b/extensions/dropbox/pom.xml
similarity index 97%
rename from extensions-jvm/dropbox/pom.xml
rename to extensions/dropbox/pom.xml
index 20cf3b6..144a8d5 100644
--- a/extensions-jvm/dropbox/pom.xml
+++ b/extensions/dropbox/pom.xml
@@ -35,6 +35,5 @@
     <modules>
         <module>deployment</module>
         <module>runtime</module>
-        <module>integration-test</module>
     </modules>
 </project>
diff --git a/extensions-jvm/dropbox/runtime/pom.xml b/extensions/dropbox/runtime/pom.xml
similarity index 100%
rename from extensions-jvm/dropbox/runtime/pom.xml
rename to extensions/dropbox/runtime/pom.xml
diff --git a/extensions-jvm/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml
similarity index 97%
rename from extensions-jvm/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml
rename to extensions/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml
index 86854d4..040c009 100644
--- a/extensions-jvm/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml
+++ b/extensions/dropbox/runtime/src/main/resources/META-INF/quarkus-extension.yaml
@@ -24,9 +24,8 @@
 name: "Camel Dropbox"
 description: "Upload, download and manage files, folders, groups, collaborations, etc on Dropbox"
 metadata:
-  unlisted: true
   guide: "https://camel.apache.org/camel-quarkus/latest/reference/extensions/dropbox.html"
   categories:
   - "integration"
   status:
-  - "preview"
+  - "stable"
diff --git a/extensions/pom.xml b/extensions/pom.xml
index db5b167..9cb288c 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -88,6 +88,7 @@
         <module>debezium-sqlserver</module>
         <module>direct</module>
         <module>dozer</module>
+        <module>dropbox</module>
         <module>elasticsearch-rest</module>
         <module>endpointdsl</module>
         <module>exec</module>
diff --git a/integration-tests/dropbox/README.adoc b/integration-tests/dropbox/README.adoc
new file mode 100644
index 0000000..25cfaca
--- /dev/null
+++ b/integration-tests/dropbox/README.adoc
@@ -0,0 +1,12 @@
+== Camel Quarkus Dropbox Integration Tests
+
+To run the Dropbox integration tests, you need a valid Dropbox https://www.dropbox.com/developers[developer account]. Then from
+the developer console, create a new app and make a note of the access token.
+
+Then set the following environment variables. Note that `DROPBOX_CLIENT_IDENTIFIER` should be set to the name of your Dropbox app:
+
+[source,shell]
+----
+export DROPBOX_ACCESS_TOKEN=your-access-token
+export DROPBOX_CLIENT_IDENTIFIER=your-client-identifier
+----
diff --git a/extensions-jvm/dropbox/integration-test/pom.xml b/integration-tests/dropbox/pom.xml
similarity index 61%
rename from extensions-jvm/dropbox/integration-test/pom.xml
rename to integration-tests/dropbox/pom.xml
index eee158a..464f892 100644
--- a/extensions-jvm/dropbox/integration-test/pom.xml
+++ b/integration-tests/dropbox/pom.xml
@@ -23,25 +23,14 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.camel.quarkus</groupId>
-        <artifactId>camel-quarkus-build-parent-it</artifactId>
+        <artifactId>camel-quarkus-integration-tests</artifactId>
         <version>1.1.0-SNAPSHOT</version>
-        <relativePath>../../../poms/build-parent-it/pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-dropbox-integration-test</artifactId>
-    <name>Camel Quarkus :: Dropbox :: Integration Test</name>
+    <artifactId>camel-quarkus-integration-test-dropbox</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Dropbox</name>
     <description>Integration tests for Camel Quarkus Dropbox extension</description>
 
-    <properties>
-        <!-- mvnd, a.k.a. Maven Daemon: https://github.com/mvndaemon/mvnd -->
-        <!-- The following rule tells mvnd to build the listed deployment modules before this module. -->
-        <!-- This is important because mvnd builds modules in parallel by default. The deployment modules are not -->
-        <!-- explicit dependencies of this module in the Maven sense, although they are required by the Quarkus Maven plugin. -->
-        <!-- Please update the rule whenever you change the dependencies of this module by running -->
-        <!--     mvn process-resources -Pformat    from the root directory -->
-        <mvnd.builder.rule>camel-quarkus-dropbox-deployment,camel-quarkus-support-policy-deployment</mvnd.builder.rule>
-    </properties>
-
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -75,6 +64,21 @@
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <!-- The following dependencies guarantee that this module is built after them. You can update them by runing `mvn process-resources -Pformat -N` from the source tree root directory -->
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-dropbox-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 
     <build>
@@ -92,4 +96,34 @@
             </plugin>
         </plugins>
     </build>
+
+    <profiles>
+        <profile>
+            <id>native</id>
+            <activation>
+                <property>
+                    <name>native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.package.type>native</quarkus.package.type>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-failsafe-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <goal>integration-test</goal>
+                                    <goal>verify</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
diff --git a/integration-tests/dropbox/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java b/integration-tests/dropbox/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java
new file mode 100644
index 0000000..c2d504d
--- /dev/null
+++ b/integration-tests/dropbox/src/main/java/org/apache/camel/quarkus/component/dropbox/it/DropboxResource.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.dropbox.it;
+
+import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import com.dropbox.core.v2.files.DownloadErrorException;
+import org.apache.camel.CamelExecutionException;
+import org.apache.camel.ProducerTemplate;
+
+import static org.apache.camel.component.dropbox.util.DropboxConstants.HEADER_PUT_FILE_NAME;
+
+@Path("/dropbox")
+public class DropboxResource {
+
+    public static final String REMOTE_PATH = "/camel/quarkus/";
+    public static final String FILE_NAME = "test.txt";
+    public static final String FILE_CONTENT = "Hello Camel Quarkus DropBox";
+
+    @Inject
+    ProducerTemplate producerTemplate;
+
+    @Path("/create")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response createFile() throws Exception {
+        java.nio.file.Path path = Files.write(Paths.get("target", FILE_NAME), FILE_CONTENT.getBytes(StandardCharsets.UTF_8));
+        String result = producerTemplate.requestBodyAndHeader(
+                "dropbox://put?uploadMode=add&accessToken={{DROPBOX_ACCESS_TOKEN}}&clientIdentifier={{DROPBOX_CLIENT_IDENTIFIER}}&localPath="
+                        + path.toString()
+                        + "&remotePath=" + REMOTE_PATH,
+                null,
+                HEADER_PUT_FILE_NAME, FILE_NAME, String.class);
+        return Response
+                .created(new URI("https://camel.apache.org/"))
+                .entity(result)
+                .build();
+    }
+
+    @Path("/read")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Response readFile() {
+        try {
+            String content = producerTemplate.requestBody(
+                    "dropbox://get?accessToken={{DROPBOX_ACCESS_TOKEN}}&clientIdentifier={{DROPBOX_CLIENT_IDENTIFIER}}&remotePath="
+                            + REMOTE_PATH
+                            + FILE_NAME,
+                    null,
+                    String.class);
+            if (content != null) {
+                return Response.ok(content).build();
+            } else {
+                return Response.status(Response.Status.NOT_FOUND).build();
+            }
+        } catch (CamelExecutionException e) {
+            Exception exchangeException = e.getExchange().getException();
+            if (exchangeException != null && exchangeException.getCause() instanceof DownloadErrorException) {
+                return Response.status(Response.Status.NOT_FOUND).build();
+            }
+            throw e;
+        }
+    }
+
+    @Path("/delete")
+    @DELETE
+    public Response deleteFile() {
+        producerTemplate
+                .requestBody(
+                        "dropbox://del?accessToken={{DROPBOX_ACCESS_TOKEN}}&clientIdentifier={{DROPBOX_CLIENT_IDENTIFIER}}&remotePath="
+                                + REMOTE_PATH + FILE_NAME,
+                        (Object) null);
+        return Response.status(Response.Status.NO_CONTENT).build();
+    }
+}
diff --git a/extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java b/integration-tests/dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxIT.java
similarity index 70%
copy from extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
copy to integration-tests/dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxIT.java
index 802a3e6..cdc354e 100644
--- a/extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
+++ b/integration-tests/dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxIT.java
@@ -16,19 +16,12 @@
  */
 package org.apache.camel.quarkus.component.dropbox.it;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import org.junit.jupiter.api.Test;
+import io.quarkus.test.junit.NativeImageTest;
+import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
-@QuarkusTest
-class DropboxTest {
-
-    @Test
-    public void loadComponentDropbox() {
-        /* A simple autogenerated test */
-        RestAssured.get("/dropbox/load/component/dropbox")
-                .then()
-                .statusCode(200);
-    }
+@EnabledIfEnvironmentVariable(named = "DROPBOX_ACCESS_TOKEN", matches = ".+")
+@EnabledIfEnvironmentVariable(named = "DROPBOX_CLIENT_IDENTIFIER", matches = ".+")
+@NativeImageTest
+class DropboxIT extends DropboxTest {
 
 }
diff --git a/extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java b/integration-tests/dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
similarity index 50%
rename from extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
rename to integration-tests/dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
index 802a3e6..b9e4f5a 100644
--- a/extensions-jvm/dropbox/integration-test/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
+++ b/integration-tests/dropbox/src/test/java/org/apache/camel/quarkus/component/dropbox/it/DropboxTest.java
@@ -18,17 +18,43 @@ package org.apache.camel.quarkus.component.dropbox.it;
 
 import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
+import static org.hamcrest.Matchers.is;
+
+@EnabledIfEnvironmentVariable(named = "DROPBOX_ACCESS_TOKEN", matches = ".+")
+@EnabledIfEnvironmentVariable(named = "DROPBOX_CLIENT_IDENTIFIER", matches = ".+")
 @QuarkusTest
 class DropboxTest {
 
     @Test
-    public void loadComponentDropbox() {
-        /* A simple autogenerated test */
-        RestAssured.get("/dropbox/load/component/dropbox")
+    public void testDropboxComponent() {
+        // Create
+        RestAssured.given()
+                .contentType(ContentType.TEXT)
+                .post("/dropbox/create")
                 .then()
-                .statusCode(200);
-    }
+                .statusCode(201);
+
+        // Read
+        RestAssured.given()
+                .get("/dropbox/read")
+                .then()
+                .statusCode(200)
+                .body(is(DropboxResource.FILE_CONTENT));
 
+        // Delete
+        RestAssured.given()
+                .delete("/dropbox/delete")
+                .then()
+                .statusCode(204);
+
+        // Verify deletion
+        RestAssured.given()
+                .get("/dropbox/read")
+                .then()
+                .statusCode(404);
+    }
 }
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index fa41cd9..f55637b 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -81,6 +81,7 @@
         <module>dataformats-json</module>
         <module>debezium</module>
         <module>dozer</module>
+        <module>dropbox</module>
         <module>elasticsearch-rest</module>
         <module>exec</module>
         <module>fhir</module>
diff --git a/tooling/scripts/test-categories.yaml b/tooling/scripts/test-categories.yaml
index 0665ab8..b07a6b1 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -70,6 +70,7 @@ xml-json-olingo4:
   - rest-binding-mode-xml
   - xml
   - dataformats-json
+  - dropbox
   - olingo4
 dozer-ispn-social:
   - dozer