This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-spring-boot-examples.git
The following commit(s) were added to refs/heads/main by this push: new c28119c Refactor infinispan test (#81) c28119c is described below commit c28119c87ed71918a1a0f1cd1a90b0aa310ff80f Author: Marco Carletti <mcarl...@redhat.com> AuthorDate: Mon Aug 29 07:24:32 2022 +0200 Refactor infinispan test (#81) --- infinispan/README.adoc | 6 +- infinispan/pom.xml | 5 + .../example/springboot/infinispan/Application.java | 113 +++++++++++---------- .../infinispan/CamelInfinispanRoute.java | 5 + .../src/main/resources/application.properties | 6 +- .../springboot/infinispan/ApplicationTest.java | 88 ++++++++++++++++ .../example/springboot/infinispan/TestRoute.java | 15 +++ .../src/{main => test}/resources/infinispan.xml | 0 8 files changed, 184 insertions(+), 54 deletions(-) diff --git a/infinispan/README.adoc b/infinispan/README.adoc index 776b52f..25021b5 100644 --- a/infinispan/README.adoc +++ b/infinispan/README.adoc @@ -5,7 +5,7 @@ This example demonstrates how you can use Camel-Infinispan Starter component. The example is really simple: put a key/value pair in a remote cache and get the same key. This example starts an Infinispan server with Infinispan Docker Image, so it can run OOTB. -=== Build +=== Build and test You can build this example using: @@ -13,6 +13,10 @@ You can build this example using: === Run +Start Infinispan container in a separate terminal: + + $ docker run --rm -e USER=admin -e PASS=password -p 11222:11222 -v $PWD/src/test/resources:/user-config/ quay.io/infinispan/server:13.0.5.Final-1 -c /user-config/infinispan.xml + You can run this example using: $ mvn spring-boot:run diff --git a/infinispan/pom.xml b/infinispan/pom.xml index c3f61e3..ee6a717 100644 --- a/infinispan/pom.xml +++ b/infinispan/pom.xml @@ -84,6 +84,11 @@ <version>${camel-version}</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-spring-junit5</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java index be1a151..19a6993 100644 --- a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java +++ b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/Application.java @@ -16,46 +16,29 @@ */ package org.apache.camel.example.springboot.infinispan; -import java.util.Properties; -import java.util.function.Consumer; - -import com.github.dockerjava.api.command.CreateContainerCmd; -import com.github.dockerjava.api.model.ExposedPort; -import com.github.dockerjava.api.model.PortBinding; -import com.github.dockerjava.api.model.Ports; - import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent; import org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration; + import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.testcontainers.containers.BindMode; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.output.OutputFrame; -import org.testcontainers.containers.output.Slf4jLogConsumer; -import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.shaded.org.apache.commons.lang.SystemUtils; +import java.util.Properties; + // CHECKSTYLE:OFF @SpringBootApplication public class Application { - - + private static final Logger LOG = LoggerFactory.getLogger(Application.class); - - private static final String CONTAINER_IMAGE = "quay.io/infinispan/server:13.0.5.Final-1"; - private static final String CONTAINER_NAME = "infinispan"; - private static final String DEFAULT_USERNAME = "admin"; - private static final String DEFAULT_PASSWORD = "password"; - private static final int CONTAINER_PORT = 11222; - - private GenericContainer<?> container; + /** * Main method to start the application. */ @@ -63,32 +46,19 @@ public class Application { SpringApplication.run(Application.class, args); } - - @Configuration + @ConfigurationProperties(prefix = "infinispan") public class InfinispanConfiguration { - private void initContainer() { - LOG.info("start infinispan docker container"); - Consumer<CreateContainerCmd> cmd = e -> { - e.getHostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(CONTAINER_PORT), - new ExposedPort(CONTAINER_PORT))); - - }; - final Logger containerLog = LoggerFactory.getLogger("container." + CONTAINER_NAME); - final Consumer<OutputFrame> logConsumer = new Slf4jLogConsumer(containerLog); - - container = new GenericContainer<>(CONTAINER_IMAGE).withNetworkAliases(CONTAINER_NAME) - .withEnv("USER", DEFAULT_USERNAME).withEnv("PASS", DEFAULT_PASSWORD) - .withLogConsumer(logConsumer) - .withClasspathResourceMapping("infinispan.xml", "/user-config/infinispan.xml", - BindMode.READ_ONLY) - .withCommand("-c", "/user-config/infinispan.xml").withExposedPorts(CONTAINER_PORT) - .withCreateContainerCmdModifier(cmd).waitingFor(Wait.forListeningPort()) - .waitingFor(Wait.forLogMessage(".*Infinispan.*Server.*started.*", 1)); - container.start(); + private String host; + + private Integer port; - } + private String username; + + private String password; + + private String serverName; protected ConfigurationBuilder getConfiguration() { ConfigurationBuilder clientBuilder = new ConfigurationBuilder(); @@ -96,11 +66,11 @@ public class Application { clientBuilder.forceReturnValues(true); - clientBuilder.addServer().host("localhost").port(CONTAINER_PORT); + clientBuilder.addServer().host(getHost()).port(getPort()); // add security info - clientBuilder.security().authentication().username(DEFAULT_USERNAME).password(DEFAULT_PASSWORD) - .serverName("infinispan").saslMechanism("DIGEST-MD5").realm("default"); + clientBuilder.security().authentication().username(getUsername()).password(getPassword()) + .serverName(getServerName()).saslMechanism("DIGEST-MD5").realm("default"); if (SystemUtils.IS_OS_MAC) { Properties properties = new Properties(); properties.put("infinispan.client.hotrod.client_intelligence", "BASIC"); @@ -112,11 +82,10 @@ public class Application { @Bean(name = "infinispanRemoteComponent") public InfinispanRemoteComponent infinispanRemoteComponent() { - initContainer(); InfinispanRemoteConfiguration infinispanRemoteConfiguration = new InfinispanRemoteConfiguration(); - infinispanRemoteConfiguration.setHosts("localhost" + ":" + CONTAINER_PORT); - infinispanRemoteConfiguration.setUsername(DEFAULT_USERNAME); - infinispanRemoteConfiguration.setPassword(DEFAULT_PASSWORD); + infinispanRemoteConfiguration.setHosts(getHost() + ":" + getPort()); + infinispanRemoteConfiguration.setUsername(getUsername()); + infinispanRemoteConfiguration.setPassword(getPassword()); RemoteCacheManager cacheContainer = new RemoteCacheManager(getConfiguration().build()); infinispanRemoteConfiguration.setCacheContainer(cacheContainer); @@ -125,6 +94,46 @@ public class Application { component.setConfiguration(infinispanRemoteConfiguration); return component; } + + public String getHost() { + return host; + } + + public void setHost(final String host) { + this.host = host; + } + + public Integer getPort() { + return port; + } + + public void setPort(final Integer port) { + this.port = port; + } + + public String getUsername() { + return username; + } + + public void setUsername(final String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(final String password) { + this.password = password; + } + + public String getServerName() { + return serverName; + } + + public void setServerName(final String serverName) { + this.serverName = serverName; + } } } diff --git a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java index b4c82c5..04cb79b 100644 --- a/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java +++ b/infinispan/src/main/java/org/apache/camel/example/springboot/infinispan/CamelInfinispanRoute.java @@ -19,6 +19,7 @@ package org.apache.camel.example.springboot.infinispan; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.infinispan.InfinispanConstants; import org.apache.camel.component.infinispan.InfinispanOperation; + import org.springframework.stereotype.Component; /** @@ -29,7 +30,11 @@ public class CamelInfinispanRoute extends RouteBuilder { @Override public void configure() throws Exception { + from("timer://foo?period=10000&repeatCount=1") + .to("direct:put-cache"); + + from("direct:put-cache") .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT) .setHeader(InfinispanConstants.KEY).constant("1") .setHeader(InfinispanConstants.VALUE).constant("test") diff --git a/infinispan/src/main/resources/application.properties b/infinispan/src/main/resources/application.properties index e7198c6..b5bdda2 100644 --- a/infinispan/src/main/resources/application.properties +++ b/infinispan/src/main/resources/application.properties @@ -17,5 +17,9 @@ camel.springboot.name=Infinispan camel.springboot.main-run-controller=true -camel.component.infinispan.hosts=localhost:11222 +infinispan.host=localhost +infinispan.port=11222 +infinispan.username=admin +infinispan.password=password +infinispan.server-name=infinispan diff --git a/infinispan/src/test/java/org/apache/camel/example/springboot/infinispan/ApplicationTest.java b/infinispan/src/test/java/org/apache/camel/example/springboot/infinispan/ApplicationTest.java new file mode 100644 index 0000000..321f129 --- /dev/null +++ b/infinispan/src/test/java/org/apache/camel/example/springboot/infinispan/ApplicationTest.java @@ -0,0 +1,88 @@ +package org.apache.camel.example.springboot.infinispan; + +import org.apache.camel.CamelContext; +import org.apache.camel.ProducerTemplate; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.spring.junit5.CamelSpringBootTest; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.output.OutputFrame; +import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.containers.wait.strategy.Wait; + +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.PortBinding; +import com.github.dockerjava.api.model.Ports; + +import java.util.function.Consumer; + +@CamelSpringBootTest +@SpringBootTest(classes = Application.class) +final class ApplicationTest { + + private static final Logger LOG = LoggerFactory.getLogger(ApplicationTest.class); + + private static final String CONTAINER_IMAGE = "quay.io/infinispan/server:13.0.5.Final-1"; + + private static GenericContainer<?> container; + + @Autowired + private ProducerTemplate producerTemplate; + + @Autowired + private CamelContext camelContext; + + private static String host = "localhost"; + + private static Integer port = 11222; + + private static String name = "infinispan"; + + private static String username = "admin"; + + private static String password = "password"; + + private ApplicationTest() { + } + + @BeforeAll + public static void initContainer() { + LOG.info("start infinispan docker container"); + final Consumer<CreateContainerCmd> cmd = e -> { + e.getHostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(port), + new ExposedPort(port))); + + }; + final Logger containerLog = LoggerFactory.getLogger("container." + name); + final Consumer<OutputFrame> logConsumer = new Slf4jLogConsumer(containerLog); + + container = new GenericContainer<>(CONTAINER_IMAGE).withNetworkAliases(name) + .withEnv("USER", username).withEnv("PASS", password) + .withLogConsumer(logConsumer) + .withClasspathResourceMapping("infinispan.xml", "/user-config/infinispan.xml", + BindMode.READ_ONLY) + .withCommand("-c", "/user-config/infinispan.xml").withExposedPorts(port) + .withCreateContainerCmdModifier(cmd).waitingFor(Wait.forListeningPort()) + .waitingFor(Wait.forLogMessage(".*Infinispan.*Server.*started.*", 1)); + container.start(); + } + + @Test + public void shouldPopulateCache() throws Exception { + final MockEndpoint mock = camelContext.getEndpoint("mock:result", MockEndpoint.class); + mock.expectedMessageCount(1); + producerTemplate.sendBody("direct:test", null); + mock.assertIsSatisfied(); + Assertions.assertEquals("test", mock.getExchanges().get(0).getIn().getBody(String.class)); + } +} diff --git a/infinispan/src/test/java/org/apache/camel/example/springboot/infinispan/TestRoute.java b/infinispan/src/test/java/org/apache/camel/example/springboot/infinispan/TestRoute.java new file mode 100644 index 0000000..7b55cbc --- /dev/null +++ b/infinispan/src/test/java/org/apache/camel/example/springboot/infinispan/TestRoute.java @@ -0,0 +1,15 @@ +package org.apache.camel.example.springboot.infinispan; + +import org.apache.camel.builder.RouteBuilder; + +import org.springframework.stereotype.Component; + +@Component +public class TestRoute extends RouteBuilder { + @Override + public void configure() throws Exception { + from("direct:test") + .to("direct:put-cache") + .to("mock:result"); + } +} diff --git a/infinispan/src/main/resources/infinispan.xml b/infinispan/src/test/resources/infinispan.xml similarity index 100% rename from infinispan/src/main/resources/infinispan.xml rename to infinispan/src/test/resources/infinispan.xml