This is an automated email from the ASF dual-hosted git repository.
aldettinger pushed a commit to branch 2.7.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/2.7.x by this push:
new 6662dd7 zipfile: complete test coverage #3610
6662dd7 is described below
commit 6662dd78ec4a361fc3332f1de5d8a69054924d32
Author: aldettinger <[email protected]>
AuthorDate: Thu Mar 10 15:43:33 2022 +0100
zipfile: complete test coverage #3610
---
.../ROOT/pages/reference/extensions/core.adoc | 9 ++-
.../core/runtime/src/main/doc/configuration.adoc | 9 ++-
integration-tests/compression/pom.xml | 9 ++-
.../compression/it/CompressionResource.java | 93 ++++++++++++++++++++--
.../compression/it/CompressionRouteBuilder.java | 27 +++++++
.../component/compression/it/CompressionTest.java | 16 ++++
6 files changed, 150 insertions(+), 13 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/core.adoc
b/docs/modules/ROOT/pages/reference/extensions/core.adoc
index facf0e7..436f8d4 100644
--- a/docs/modules/ROOT/pages/reference/extensions/core.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/core.adoc
@@ -63,7 +63,14 @@ Note that in native mode, some classes may need to be
registered for reflection.
needs to be
link:https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection[registered
for reflection].
==== Using dynamic type resolution in native mode
-When dynamically resolving a type from simple expressions like
`${mandatoryBodyAs(TYPE)}`, `${type:package.Enum.CONSTANT}` or `$\{body} is
TYPE`, it may be needed to register some classes for reflection manually.
+When dynamically resolving a type from simple expressions like:
+
+ * `simple("${mandatoryBodyAs(TYPE)}")`
+ * `simple("${type:package.Enum.CONSTANT}")`
+ * `from("...").split(bodyAs(TYPE.class))`
+ * `simple("$\{body} is TYPE")`
+
+It may be needed to register some classes for reflection manually.
For instance, the simple expression below is dynamically resolving the type
`java.nio.ByteBuffer` at runtime:
[source,java]
diff --git a/extensions-core/core/runtime/src/main/doc/configuration.adoc
b/extensions-core/core/runtime/src/main/doc/configuration.adoc
index 61c59e8..6882773 100644
--- a/extensions-core/core/runtime/src/main/doc/configuration.adoc
+++ b/extensions-core/core/runtime/src/main/doc/configuration.adoc
@@ -14,7 +14,14 @@ Note that in native mode, some classes may need to be
registered for reflection.
needs to be
link:https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection[registered
for reflection].
==== Using dynamic type resolution in native mode
-When dynamically resolving a type from simple expressions like
`${mandatoryBodyAs(TYPE)}`, `${type:package.Enum.CONSTANT}` or `$\{body} is
TYPE`, it may be needed to register some classes for reflection manually.
+When dynamically resolving a type from simple expressions like:
+
+ * `simple("${mandatoryBodyAs(TYPE)}")`
+ * `simple("${type:package.Enum.CONSTANT}")`
+ * `from("...").split(bodyAs(TYPE.class))`
+ * `simple("$\{body} is TYPE")`
+
+It may be needed to register some classes for reflection manually.
For instance, the simple expression below is dynamically resolving the type
`java.nio.ByteBuffer` at runtime:
[source,java]
diff --git a/integration-tests/compression/pom.xml
b/integration-tests/compression/pom.xml
index 5af737f..7ac5e35 100644
--- a/integration-tests/compression/pom.xml
+++ b/integration-tests/compression/pom.xml
@@ -48,16 +48,19 @@
<artifactId>camel-quarkus-direct</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-mock</artifactId>
+ </dependency>
+ <dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
-
- <!-- test dependencies -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
- <scope>test</scope>
</dependency>
+
+ <!-- test dependencies -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
diff --git
a/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionResource.java
b/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionResource.java
index af8ae3a..cad45c5 100644
---
a/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionResource.java
+++
b/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionResource.java
@@ -16,11 +16,21 @@
*/
package org.apache.camel.quarkus.component.compression.it;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@@ -28,7 +38,13 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import org.apache.camel.CamelContext;
+import org.apache.camel.Message;
import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
@Path("/compression")
@ApplicationScoped
@@ -37,16 +53,16 @@ public class CompressionResource {
@Inject
ProducerTemplate producerTemplate;
+ @Inject
+ CamelContext camelContext;
+
@Path("/compress/{format}")
@POST
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response zipfileCompress(@PathParam("format") String format, byte[]
message) throws Exception {
final byte[] response = producerTemplate.requestBody("direct:" +
format + "-compress", message, byte[].class);
- return Response
- .created(new URI("https://camel.apache.org/"))
- .header("content-length", response.length)
- .entity(response)
+ return Response.created(new
URI("https://camel.apache.org/")).header("content-length",
response.length).entity(response)
.build();
}
@@ -56,11 +72,72 @@ public class CompressionResource {
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response zipfileUncompress(@PathParam("format") String format,
byte[] message) throws Exception {
final byte[] response = producerTemplate.requestBody("direct:" +
format + "-uncompress", message, byte[].class);
- return Response
- .created(new URI("https://camel.apache.org/"))
- .header("content-length", response.length)
- .entity(response)
+ return Response.created(new
URI("https://camel.apache.org/")).header("content-length",
response.length).entity(response)
.build();
}
+ @Path("/zipfile/splitIteratorShouldSucceed")
+ @GET
+ public void zipFileSplitIteratorShouldSucceed() throws Exception {
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+ try (ZipOutputStream zipOutputStream = new ZipOutputStream(baos)) {
+ zipOutputStream.putNextEntry(new ZipEntry("first"));
+
zipOutputStream.write("first-entry".getBytes(StandardCharsets.UTF_8));
+ zipOutputStream.closeEntry();
+ zipOutputStream.putNextEntry(new ZipEntry("second"));
+
zipOutputStream.write("second-entry".getBytes(StandardCharsets.UTF_8));
+ zipOutputStream.closeEntry();
+ zipOutputStream.close();
+ }
+
+ MockEndpoint mockSplitIterator =
camelContext.getEndpoint("mock:zipfile-splititerator", MockEndpoint.class);
+ mockSplitIterator.expectedBodiesReceived("first-entry",
"second-entry");
+ producerTemplate.requestBody("direct:zipfile-splititerator",
baos.toByteArray());
+ mockSplitIterator.assertIsSatisfied();
+ }
+ }
+
+ @Path("/zipfile/aggregateShouldSucceed")
+ @GET
+ public void zipFileAggregateShouldSucceed() throws Exception {
+
+ File firstInputFile = null, secondInputFile = null;
+
+ try {
+ firstInputFile = File.createTempFile("cq-zipfile-it-", "-first");
+ Files.write(firstInputFile.toPath(),
Arrays.asList("first-content"), StandardCharsets.UTF_8);
+ secondInputFile = File.createTempFile("cq-zipfile-it-", "-second");
+ Files.write(secondInputFile.toPath(),
Arrays.asList("second-content"), StandardCharsets.UTF_8);
+
+ MockEndpoint mockAggregate =
camelContext.getEndpoint("mock:zipfile-aggregate", MockEndpoint.class);
+ mockAggregate.expectedMessageCount(1);
+ producerTemplate.requestBody("direct:zipfile-aggregate",
firstInputFile);
+ producerTemplate.requestBody("direct:zipfile-aggregate",
secondInputFile);
+ mockAggregate.assertIsSatisfied();
+
+ assertNotNull(mockAggregate.getReceivedExchanges());
+ assertEquals(1, mockAggregate.getReceivedExchanges().size());
+ Message producedMessage =
mockAggregate.getReceivedExchanges().get(0).getMessage();
+ assertNotNull(producedMessage);
+ byte[] producedZip = producedMessage.getBody(byte[].class);
+
+ try (ByteArrayInputStream producedZipBytes = new
ByteArrayInputStream(producedZip)) {
+ try (ZipInputStream producedZipInputStream = new
ZipInputStream(producedZipBytes)) {
+ ZipEntry firstProducedEntry =
producedZipInputStream.getNextEntry();
+ assertNotNull(firstProducedEntry);
+ assertEquals(firstInputFile.getName(),
firstProducedEntry.getName());
+ ZipEntry secondProducedEntry =
producedZipInputStream.getNextEntry();
+ assertNotNull(secondProducedEntry);
+ assertEquals(secondInputFile.getName(),
secondProducedEntry.getName());
+ }
+ }
+ } finally {
+ if (firstInputFile != null) {
+ firstInputFile.delete();
+ }
+ if (secondInputFile != null) {
+ secondInputFile.delete();
+ }
+ }
+ }
}
diff --git
a/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionRouteBuilder.java
b/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionRouteBuilder.java
index 7a81e5a..ffff6e4 100644
---
a/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionRouteBuilder.java
+++
b/integration-tests/compression/src/main/java/org/apache/camel/quarkus/component/compression/it/CompressionRouteBuilder.java
@@ -16,7 +16,12 @@
*/
package org.apache.camel.quarkus.component.compression.it;
+import java.util.Iterator;
+
+import io.quarkus.runtime.annotations.RegisterForReflection;
import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.dataformat.zipfile.ZipFileDataFormat;
+import org.apache.camel.processor.aggregate.zipfile.ZipAggregationStrategy;
public class CompressionRouteBuilder extends RouteBuilder {
@Override
@@ -40,5 +45,27 @@ public class CompressionRouteBuilder extends RouteBuilder {
.marshal().lzf();
from("direct:lzf-uncompress")
.unmarshal().lzf();
+
+ // Test routes specific to camel-quarkus-zipfile
+ ZipFileDataFormat zipFileDataformat = new ZipFileDataFormat();
+ zipFileDataformat.setUsingIterator(true);
+
+ from("direct:zipfile-splititerator")
+ .unmarshal(zipFileDataformat)
+ .split(bodyAs(Iterator.class))
+ .streaming()
+ .convertBodyTo(String.class)
+ .to("mock:zipfile-splititerator")
+ .end();
+
+ from("direct:zipfile-aggregate")
+ .aggregate(constant(true), new ZipAggregationStrategy())
+ .completionSize(constant(2))
+ .convertBodyTo(byte[].class)
+ .to("mock:zipfile-aggregate");
+ }
+
+ @RegisterForReflection(targets = { Iterator.class })
+ public class MyReflectionConfiguration {
}
}
diff --git
a/integration-tests/compression/src/test/java/org/apache/camel/quarkus/component/compression/it/CompressionTest.java
b/integration-tests/compression/src/test/java/org/apache/camel/quarkus/component/compression/it/CompressionTest.java
index 69199ae..5ededb6 100644
---
a/integration-tests/compression/src/test/java/org/apache/camel/quarkus/component/compression/it/CompressionTest.java
+++
b/integration-tests/compression/src/test/java/org/apache/camel/quarkus/component/compression/it/CompressionTest.java
@@ -23,6 +23,7 @@ import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
@@ -55,4 +56,19 @@ class CompressionTest {
Assertions.assertArrayEquals(UNCOMPRESSED, uncompressed);
}
+ @Test
+ public void zipFileSplitIteratorShouldSucceed() {
+ RestAssured.given()
+ .get("/compression/zipfile/splitIteratorShouldSucceed")
+ .then()
+ .statusCode(204);
+ }
+
+ @Test
+ public void zipFileAggregateShouldSucceed() {
+ RestAssured.given()
+ .get("/compression/zipfile/aggregateShouldSucceed")
+ .then()
+ .statusCode(204);
+ }
}