diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..6a86fe6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,38 @@ + + + 4.0.0 + + de.rpr + testcontainers-infinispan + 1.0.0-SNAPSHOT + + + 1.8 + 1.8 + UTF-8 + UTF-8 + + + 1.4.3 + + 9.1.3.Final + + + + + org.testcontainers + testcontainers + ${testcontainers.version} + + + org.infinispan + infinispan-client-hotrod + ${infinispan.version} + test + + + + + \ No newline at end of file diff --git a/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainer.java b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainer.java new file mode 100644 index 0000000..4259127 --- /dev/null +++ b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainer.java @@ -0,0 +1,8 @@ +package de.rpr.testcontainers.infinispan; + +import org.junit.rules.TestRule; +import org.testcontainers.containers.Container; + +public interface InfinispanContainer> extends Container, TestRule { + +} diff --git a/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerBuilder.java b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerBuilder.java new file mode 100644 index 0000000..ad6e152 --- /dev/null +++ b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerBuilder.java @@ -0,0 +1,8 @@ +package de.rpr.testcontainers.infinispan; + +public interface InfinispanContainerBuilder { + + InfinispanContainerExposedPortsBuilder expose(); + + InfinispanContainer build(); +} diff --git a/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerExposedPortsBuilder.java b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerExposedPortsBuilder.java new file mode 100644 index 0000000..798304a --- /dev/null +++ b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerExposedPortsBuilder.java @@ -0,0 +1,13 @@ +package de.rpr.testcontainers.infinispan; + +public interface InfinispanContainerExposedPortsBuilder { + + InfinispanContainerBuilder hotrod(); + + InfinispanContainerBuilder hotrod(int port); + + InfinispanContainerBuilder rest(); + + InfinispanContainerBuilder rest(int port); + +} diff --git a/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerFactory.java b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerFactory.java new file mode 100644 index 0000000..715deaa --- /dev/null +++ b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerFactory.java @@ -0,0 +1,97 @@ +package de.rpr.testcontainers.infinispan; + +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.LogMessageWaitStrategy; + +import java.io.File; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +public class InfinispanContainerFactory + extends GenericContainer + implements InfinispanContainer, InfinispanContainerExposedPortsBuilder, InfinispanContainerBuilder, + InfinispanContainerStandaloneBuilder { + + private static final String IMAGE_NAME = "jboss/infinispan-server:"; + + @Override + public InfinispanContainerBuilder configurationFile(final String classPathResourceName) { + URL resourceUrl = this.getClass().getClassLoader().getResource(classPathResourceName); + if (resourceUrl == null) { + throw new IllegalArgumentException("Cannot read configuration resource"); + } + return withFileSystemBind(new File(resourceUrl.getFile()).getAbsolutePath(), + "/opt/jboss/infinispan-server/standalone/configuration/standalone.xml", + BindMode.READ_ONLY); + } + + @Override + public InfinispanContainerBuilder and() { + return this; + } + + private enum Protocol { + HOTROD(11222), + REST(8080); + + private final int defaultPort; + + Protocol(final int defaultPort) { + this.defaultPort = defaultPort; + } + } + + private final Map exposedPorts = new HashMap<>(); + + private InfinispanContainerFactory(final String dockerImageName) { + super(dockerImageName); + } + + public static InfinispanContainerStandaloneBuilder standalone() { + return standalone("9.1.3.Final"); + } + + public static InfinispanContainerStandaloneBuilder standalone(final String version) { + InfinispanContainer container = new InfinispanContainerFactory(IMAGE_NAME + version); + container.withCommand("standalone"); + return (InfinispanContainerStandaloneBuilder) container; + } + + @Override + public InfinispanContainerExposedPortsBuilder expose() { + return this; + } + + @Override + public InfinispanContainerBuilder hotrod() { + return hotrod(Protocol.HOTROD.defaultPort); + } + + @Override + public InfinispanContainerBuilder hotrod(final int port) { + return exposePort(Protocol.HOTROD, port); + } + + @Override + public InfinispanContainerBuilder rest() { + return rest(Protocol.REST.defaultPort); + } + + @Override + public InfinispanContainerBuilder rest(final int port) { + return exposePort(Protocol.REST, port); + } + + private InfinispanContainerFactory exposePort(final Protocol service, final int port) { + exposedPorts.put(service, port); + return this; + } + + @Override + public InfinispanContainer build() { + return waitingFor(new LogMessageWaitStrategy().withRegEx(".*HotRodServer listening.*\\s")); + } + +} diff --git a/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerStandaloneBuilder.java b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerStandaloneBuilder.java new file mode 100644 index 0000000..3004feb --- /dev/null +++ b/src/main/java/de/rpr/testcontainers/infinispan/InfinispanContainerStandaloneBuilder.java @@ -0,0 +1,9 @@ +package de.rpr.testcontainers.infinispan; + +public interface InfinispanContainerStandaloneBuilder { + + InfinispanContainerBuilder configurationFile(String classPathResourceName); + + InfinispanContainerBuilder and(); + +} diff --git a/src/main/resources/infinispan-standalone.xml b/src/main/resources/infinispan-standalone.xml new file mode 100644 index 0000000..a06ac37 --- /dev/null +++ b/src/main/resources/infinispan-standalone.xml @@ -0,0 +1,286 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE + h2 + + sa + sa + + + + + org.h2.jdbcx.JdbcDataSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/InfinispanContainerIntegrationTest.java b/src/test/java/InfinispanContainerIntegrationTest.java new file mode 100644 index 0000000..3a1c141 --- /dev/null +++ b/src/test/java/InfinispanContainerIntegrationTest.java @@ -0,0 +1,34 @@ +import de.rpr.testcontainers.infinispan.InfinispanContainer; +import de.rpr.testcontainers.infinispan.InfinispanContainerFactory; +import org.infinispan.client.hotrod.ProtocolVersion; +import org.infinispan.client.hotrod.RemoteCacheManager; +import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; +import org.junit.ClassRule; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; + +public class InfinispanContainerIntegrationTest { + + @ClassRule + public static InfinispanContainer infinispan = InfinispanContainerFactory + .standalone("9.1.3.Final") + .configurationFile("infinispan-standalone.xml") + .expose() + .hotrod() + .build(); + + @Test + public void rule_should_have_mapped_hotrod_port() { + assertNotNull(infinispan.getMappedPort(11222)); + } + + @Test + public void should_get_existing_cache() { + RemoteCacheManager cacheManager = new RemoteCacheManager(new ConfigurationBuilder() + .addServers(infinispan.getContainerIpAddress() + ":" + infinispan.getMappedPort(11222)) + .version(ProtocolVersion.PROTOCOL_VERSION_26) + .build()); + assertNotNull(cacheManager.getCache("testCache")); + } +}