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);
+    }
 }

Reply via email to