From 8480dc6e6f296e09b2330cb8481cb0166a794efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 9 Oct 2025 22:07:52 -0600 Subject: [PATCH] Add OrientDB container implementation under org.testcontainers.orientdb --- docs/modules/databases/orientdb.md | 2 +- .../containers/OrientDBContainer.java | 3 + .../orientdb/OrientDBContainer.java | 140 ++++++++++++++++++ .../OrientDBContainerTest.java | 56 ++++--- 4 files changed, 182 insertions(+), 19 deletions(-) create mode 100644 modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java rename modules/orientdb/src/test/java/org/testcontainers/{containers => orientdb}/OrientDBContainerTest.java (58%) diff --git a/docs/modules/databases/orientdb.md b/docs/modules/databases/orientdb.md index 40a26100ae1..a1f57098d99 100644 --- a/docs/modules/databases/orientdb.md +++ b/docs/modules/databases/orientdb.md @@ -7,7 +7,7 @@ Testcontainers module for [OrientDB](https://hub.docker.com/_/orientdb/) You can start an OrientDB container instance from any Java application by using: -[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java) inside_block:container +[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java) inside_block:container ## Adding this module to your project dependencies diff --git a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java index 67c81be7e90..2a6c1710f40 100644 --- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java +++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java @@ -29,7 +29,10 @@ *
  • Database: 2424
  • *
  • Studio: 2480
  • * + * + * @deprecated use {@link org.testcontainers.orientdb.OrientDBContainer} instead. */ +@Deprecated public class OrientDBContainer extends GenericContainer { private static final Logger LOGGER = LoggerFactory.getLogger(OrientDBContainer.class); diff --git a/modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java new file mode 100644 index 00000000000..753d32951e7 --- /dev/null +++ b/modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java @@ -0,0 +1,140 @@ +package org.testcontainers.orientdb; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.NonNull; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.io.IOException; + +/** + * Testcontainers implementation for OrientDB. + *

    + * Supported image: {@code orientdb} + *

    + * Exposed ports: + *

    + */ +public class OrientDBContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("orientdb"); + + private static final String DEFAULT_USERNAME = "admin"; + + private static final String DEFAULT_PASSWORD = "admin"; + + private static final String DEFAULT_SERVER_USER = "root"; + + private static final String DEFAULT_SERVER_PASSWORD = "root"; + + private static final String DEFAULT_DATABASE_NAME = "testcontainers"; + + private static final int DEFAULT_BINARY_PORT = 2424; + + private static final int DEFAULT_HTTP_PORT = 2480; + + private String databaseName; + + private String serverPassword; + + private Transferable scriptPath; + + public OrientDBContainer(@NonNull String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public OrientDBContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + this.serverPassword = DEFAULT_SERVER_PASSWORD; + this.databaseName = DEFAULT_DATABASE_NAME; + + waitingFor(Wait.forLogMessage(".*OrientDB Studio available.*", 1)); + addExposedPorts(DEFAULT_BINARY_PORT, DEFAULT_HTTP_PORT); + } + + @Override + protected void configure() { + addEnv("ORIENTDB_ROOT_PASSWORD", serverPassword); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + try { + String createDb = String.format( + "CREATE DATABASE remote:localhost/%s %s %s plocal; CONNECT remote:localhost/%s %s %s; CREATE USER %s IDENTIFIED BY %s ROLE admin;", + this.databaseName, + DEFAULT_SERVER_USER, + this.serverPassword, + this.databaseName, + DEFAULT_SERVER_USER, + this.serverPassword, + DEFAULT_USERNAME, + DEFAULT_PASSWORD + ); + execInContainer("/orientdb/bin/console.sh", createDb); + + if (this.scriptPath != null) { + copyFileToContainer(this.scriptPath, "/opt/testcontainers/script.osql"); + String loadScript = String.format( + "CONNECT remote:localhost/%s %s %s; LOAD SCRIPT /opt/testcontainers/script.osql", + this.databaseName, + DEFAULT_SERVER_USER, + this.serverPassword + ); + execInContainer("/orientdb/bin/console.sh", loadScript); + } + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } + + public String getDatabaseName() { + return databaseName; + } + + public OrientDBContainer withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + public OrientDBContainer withServerPassword(final String serverPassword) { + this.serverPassword = serverPassword; + return self(); + } + + public OrientDBContainer withScriptPath(Transferable scriptPath) { + this.scriptPath = scriptPath; + return self(); + } + + public String getServerUrl() { + return "remote:" + getHost() + ":" + getMappedPort(2424); + } + + public String getDbUrl() { + return getServerUrl() + "/" + this.databaseName; + } + + public String getServerUser() { + return DEFAULT_SERVER_USER; + } + + public String getServerPassword() { + return this.serverPassword; + } + + public String getUsername() { + return DEFAULT_USERNAME; + } + + public String getPassword() { + return DEFAULT_PASSWORD; + } +} diff --git a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java b/modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java similarity index 58% rename from modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java rename to modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java index af6778505ec..2952b70f216 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java @@ -1,6 +1,8 @@ -package org.testcontainers.containers; +package org.testcontainers.orientdb; import com.orientechnologies.orient.core.db.ODatabaseSession; +import com.orientechnologies.orient.core.db.OrientDB; +import com.orientechnologies.orient.core.db.OrientDBConfig; import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; @@ -12,26 +14,24 @@ class OrientDBContainerTest { private static final DockerImageName ORIENTDB_IMAGE = DockerImageName.parse("orientdb:3.2.0-tp3"); @Test - void shouldReturnTheSameSession() { + void shouldInitializeWithCommands() { try ( // container { OrientDBContainer orientdb = new OrientDBContainer("orientdb:3.2.0-tp3") // } ) { orientdb.start(); - final ODatabaseSession session = orientdb.getSession(); - final ODatabaseSession session2 = orientdb.getSession(); - - assertThat(session).isSameAs(session2); - } - } - - @Test - void shouldInitializeWithCommands() { - try (OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE)) { - orientdb.start(); - - final ODatabaseSession session = orientdb.getSession(); + OrientDB orientDB = new OrientDB( + orientdb.getServerUrl(), + orientdb.getServerUser(), + orientdb.getServerPassword(), + OrientDBConfig.defaultConfig() + ); + ODatabaseSession session = orientDB.open( + orientdb.getDatabaseName(), + orientdb.getUsername(), + orientdb.getPassword() + ); session.command("CREATE CLASS Person EXTENDS V"); session.command("INSERT INTO Person set name='john'"); @@ -52,7 +52,17 @@ void shouldQueryWithGremlin() { ) { orientdb.start(); - final ODatabaseSession session = orientdb.getSession("admin", "admin"); + OrientDB orientDB = new OrientDB( + orientdb.getServerUrl(), + orientdb.getServerUser(), + orientdb.getServerPassword(), + OrientDBConfig.defaultConfig() + ); + ODatabaseSession session = orientDB.open( + orientdb.getDatabaseName(), + orientdb.getUsername(), + orientdb.getPassword() + ); session.command("CREATE CLASS Person EXTENDS V"); session.command("INSERT INTO Person set name='john'"); @@ -66,7 +76,7 @@ void shouldQueryWithGremlin() { void shouldInitializeDatabaseFromScript() { try ( OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE) - .withScriptPath("initscript.osql") + .withScriptPath(MountableFile.forClasspathResource("initscript.osql")) .withDatabaseName("persons") ) { orientdb.start(); @@ -74,7 +84,17 @@ void shouldInitializeDatabaseFromScript() { assertThat(orientdb.getDbUrl()) .isEqualTo("remote:" + orientdb.getHost() + ":" + orientdb.getMappedPort(2424) + "/persons"); - final ODatabaseSession session = orientdb.getSession(); + OrientDB orientDB = new OrientDB( + orientdb.getServerUrl(), + orientdb.getServerUser(), + orientdb.getServerPassword(), + OrientDBConfig.defaultConfig() + ); + ODatabaseSession session = orientDB.open( + orientdb.getDatabaseName(), + orientdb.getUsername(), + orientdb.getPassword() + ); assertThat(session.query("SELECT FROM Person").stream()).hasSize(4); }