From f66644cb35799535bf8d646804c5fe121a92a33d Mon Sep 17 00:00:00 2001 From: JiriOndrusek Date: Wed, 2 Oct 2024 11:56:38 +0200 Subject: [PATCH] Fixes #6576 - test coverage for smb producer --- integration-tests/smb/pom.xml | 39 +++++++ .../quarkus/component/smb/it/SmbResource.java | 74 +++++++++++++ .../quarkus/component/smb/it/SmbRoute.java | 58 +++++++++- .../quarkus/component/smb/it/SmbTest.java | 101 ++++++++++++++++++ 4 files changed, 271 insertions(+), 1 deletion(-) diff --git a/integration-tests/smb/pom.xml b/integration-tests/smb/pom.xml index 0148dcc9771d..3fb3c53768ca 100644 --- a/integration-tests/smb/pom.xml +++ b/integration-tests/smb/pom.xml @@ -39,6 +39,10 @@ io.quarkus quarkus-resteasy + + org.apache.camel.quarkus + camel-quarkus-direct + org.apache.camel.quarkus camel-quarkus-mock @@ -71,12 +75,34 @@ quarkus-junit4-mock test + + org.awaitility + awaitility + test + + + org.assertj + assertj-core + test + org.apache.camel.quarkus camel-quarkus-integration-test-support test + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + @@ -115,6 +141,19 @@ + + org.apache.camel.quarkus + camel-quarkus-direct-deployment + ${project.version} + pom + test + + + * + * + + + org.apache.camel.quarkus camel-quarkus-mock-deployment diff --git a/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbResource.java b/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbResource.java index a4a01cdaafbc..241534698c42 100644 --- a/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbResource.java +++ b/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbResource.java @@ -16,11 +16,26 @@ */ package org.apache.camel.quarkus.component.smb.it; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import com.hierynomus.smbj.share.File; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import jakarta.ws.rs.QueryParam; +import org.apache.camel.ConsumerTemplate; import org.apache.camel.EndpointInject; +import org.apache.camel.Exchange; +import org.apache.camel.ProducerTemplate; import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.component.smb.SmbConstants; +import org.eclipse.microprofile.config.inject.ConfigProperty; @Path("/smb") @ApplicationScoped @@ -29,6 +44,65 @@ public class SmbResource { @EndpointInject("mock:result") private MockEndpoint mock; + @ConfigProperty(name = "smb.host") + String host; + + @ConfigProperty(name = "smb.port") + String port; + + @ConfigProperty(name = "smb.username") + String username; + + @ConfigProperty(name = "smb.password") + String password; + + @ConfigProperty(name = "smb.share") + String share; + + @Inject + ConsumerTemplate consumer; + + @Inject + ProducerTemplate producer; + + @Inject + @Named("smbReceivedMsgs") + List> receivedContents; + + @POST + @Path("/send/{fileName}") + public void send(String content, + @PathParam("fileName") String fileName, + @QueryParam("fileExist") String fileExist) throws Exception { + if (fileExist == null || fileExist.isEmpty()) { + producer.sendBodyAndHeader("direct:send", content, Exchange.FILE_NAME, fileName); + } else { + producer.sendBodyAndHeaders("direct:send", content, Map.of(SmbConstants.SMB_FILE_EXISTS, fileExist, + Exchange.FILE_NAME, fileName)); + } + } + + @POST + @Path("/receive") + public String receive(String fileName) throws Exception { + + String uri = String.format("smb:%s:%s/%s?username=%s&password=%s&searchPattern=%s&path=/", host, port, share, + username, password, fileName); + var shareFile = consumer.receiveBody(uri, File.class); + return new String(shareFile.getInputStream().readAllBytes(), "UTF-8"); + } + + @POST + @Path("/receivedMsgs") + public String receivedMsgs() throws Exception { + + return receivedContents.stream().map(m -> m.entrySet() + .stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) // Format each entry as "key=value" + .collect(Collectors.joining(","))) + .collect(Collectors.joining(";")); + } + @GET @Path("/validate") public void validateSmbResults() throws Exception { diff --git a/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbRoute.java b/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbRoute.java index 251c778daad1..a101b0b80979 100644 --- a/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbRoute.java +++ b/integration-tests/smb/src/main/java/org/apache/camel/quarkus/component/smb/it/SmbRoute.java @@ -16,13 +16,69 @@ */ package org.apache.camel.quarkus.component.smb.it; +import java.io.InputStream; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +import com.hierynomus.smbj.share.File; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.inject.Singleton; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.smb.SmbConstants; +import org.eclipse.microprofile.config.inject.ConfigProperty; +@ApplicationScoped public class SmbRoute extends RouteBuilder { + @ConfigProperty(name = "smb.host") + String host; + + @ConfigProperty(name = "smb.port") + String port; + + @ConfigProperty(name = "smb.username") + String username; + + @ConfigProperty(name = "smb.password") + String password; + + @ConfigProperty(name = "smb.share") + String share; + + @Inject + @Named("smbReceivedMsgs") + List> receivedContents; + @Override public void configure() throws Exception { - from("smb:{{smb.host}}:{{smb.port}}/{{smb.share}}?username={{smb.username}}&password={{smb.password}}&path=/&repeatCount=1") + from("smb:{{smb.host}}:{{smb.port}}/{{smb.share}}?username={{smb.username}}&password={{smb.password}}&path=/&repeatCount=1&searchPattern=*.txt") .to("mock:result"); + + from("direct:send") + .toF("smb:%s:%s/%s?username=%s&password=%s&path=/", host, port, share, username, password); + + from("smb:{{smb.host}}:{{smb.port}}/{{smb.share}}?username={{smb.username}}&password={{smb.password}}&path=/&searchPattern=*.tx1") + .process(e -> { + receivedContents.add(Map.of( + "path", e.getIn().getBody(File.class).getPath(), + "content", new String(e.getIn().getBody(InputStream.class).readAllBytes(), "UTF-8"), + SmbConstants.SMB_FILE_PATH, e.getIn().getHeader(SmbConstants.SMB_FILE_PATH, String.class), + SmbConstants.SMB_UNC_PATH, e.getIn().getHeader(SmbConstants.SMB_UNC_PATH, String.class))); + }); + } + + static class Producers { + + @Singleton + @Produces + @Named("smbReceivedMsgs") + List> smbReceivedMsgs() { + return new CopyOnWriteArrayList<>(); + } } + } diff --git a/integration-tests/smb/src/test/java/org/apache/camel/quarkus/component/smb/it/SmbTest.java b/integration-tests/smb/src/test/java/org/apache/camel/quarkus/component/smb/it/SmbTest.java index 2d6d1bf0bc18..7e060c672654 100644 --- a/integration-tests/smb/src/test/java/org/apache/camel/quarkus/component/smb/it/SmbTest.java +++ b/integration-tests/smb/src/test/java/org/apache/camel/quarkus/component/smb/it/SmbTest.java @@ -16,11 +16,19 @@ */ package org.apache.camel.quarkus.component.smb.it; +import java.util.Set; +import java.util.concurrent.TimeUnit; + import io.quarkus.test.common.QuarkusTestResource; import io.quarkus.test.junit.QuarkusTest; import io.restassured.RestAssured; +import org.apache.camel.component.smb.SmbConstants; +import org.hamcrest.Matchers; import org.apache.camel.quarkus.test.DisabledIfFipsMode; import org.junit.jupiter.api.Test; +import org.testcontainers.shaded.org.awaitility.Awaitility; + +import static org.assertj.core.api.Assertions.assertThat; @QuarkusTest @QuarkusTestResource(SmbTestResource.class) @@ -33,4 +41,97 @@ public void testSmbResultsValidation() { .then() .statusCode(204); } + + @Test + public void testSendReceive() { + + RestAssured.given() + .body("Hello") + .post("/smb/send/test.doc") + .then() + .statusCode(204); + + RestAssured.given() + .body("test.doc") + .post("/smb/receive") + .then() + .statusCode(200) + .body(Matchers.equalTo("Hello")); + } + + @Test + public void testFileExistsOverride() { + + RestAssured.given() + .body("Hello1") + .post("/smb/send/testOverride.doc") + .then() + .statusCode(204); + + RestAssured.given() + .body("Hello2") + .queryParam("fileExist", "Override") + .post("/smb/send/testOverride.doc") + .then() + .statusCode(204); + + RestAssured.given() + .body("testOverride.doc") + .post("/smb/receive") + .then() + .statusCode(200) + .body(Matchers.equalTo("Hello2")); + } + + @Test + public void testFileExistsAppend() { + + RestAssured.given() + .body("Hello1") + .post("/smb/send/testAppend.doc") + .then() + .statusCode(204); + + RestAssured.given() + .body("Hello2") + .queryParam("fileExist", "Append") + .post("/smb/send/testAppend.doc") + .then() + .statusCode(204); + + RestAssured.given() + .body("testAppend.doc") + .post("/smb/receive") + .then() + .statusCode(200) + .body(Matchers.equalTo("Hello1Hello2")); + } + + @Test + public void testHeadersAndAutoConvertToInputStream() { + + RestAssured.given() + .body("Hello1") + .post("/smb/send/msg1.tx1") + .then() + .statusCode(204); + + Awaitility.await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> { + String body = RestAssured.given() + .post("/smb/receivedMsgs") + .then() + .statusCode(200) + .extract().asString(); + + Set set = Set.of(body.split(",")); + + assertThat(set) + .contains("path=msg1.tx1") + .contains("content=Hello1") + .contains(SmbConstants.SMB_FILE_PATH + "=msg1.tx1") + .contains(SmbConstants.SMB_UNC_PATH + "=\\\\localhost\\data-rw\\msg1.tx1"); + }); + + } + }