From edf16ec7dbe18f16a7e2b5685b5c4bd0d0225353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Thibaudeau?= Date: Wed, 29 May 2019 14:38:13 +0200 Subject: [PATCH] DB tests using docker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I903b9f5bcb66f6cf41bea3f487351b15a62736b3 Signed-off-by: StĂ©phane Thibaudeau --- .../docs/How to execute tests.md | 3 + .../database/tests/mariadb/MariaDBTests.java | 77 ++++++++++++++++++- .../dsl/database/tests/mysql/MySQLTests.java | 62 +++++++-------- .../database/tests/oracle/OracleTests.java | 66 +++------------- 4 files changed, 120 insertions(+), 88 deletions(-) diff --git a/models/database/plugins/org.obeonetwork.dsl.database.tests/docs/How to execute tests.md b/models/database/plugins/org.obeonetwork.dsl.database.tests/docs/How to execute tests.md index 4ec62d5c42..e7cf2412d4 100644 --- a/models/database/plugins/org.obeonetwork.dsl.database.tests/docs/How to execute tests.md +++ b/models/database/plugins/org.obeonetwork.dsl.database.tests/docs/How to execute tests.md @@ -115,6 +115,9 @@ docker run --name oracletest --shm-size=1g -p 1521:1521 -e ORACLE_PWD=oracleserv docker run --name oracletest --shm-size=1g -p 1521:1521 -e ORACLE_PWD=oracleserver -v /d/temp/oradata:/u01/app/oracle/oradata -d oracle/database:11.2.0.2-xe docker run --name oracletest --shm-size=1g -p 1521:1521 -e ORACLE_PWD=oracleserver -v temp/oradata:/u01/app/oracle/oradata -d oracle/database:11.2.0.2-xe +docker run --name oracletest --shm-size=1g -p 1521:1521 -e ORACLE_PWD=oracleserver -v oradata:/u01/app/oracle/oradata -d oracle/database:11.2.0.2-xe +docker run --name oracletest --shm-size=1g -p 1521:1521 -e ORACLE_PWD=oracleserver -v oradataxyz:/u01/app/oracle/oradata -d oracle/database:11.2.0.2-xe + ArrĂȘt : - docker stop oracletest diff --git a/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mariadb/MariaDBTests.java b/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mariadb/MariaDBTests.java index 665cf6372d..d9cde72463 100644 --- a/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mariadb/MariaDBTests.java +++ b/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mariadb/MariaDBTests.java @@ -1,7 +1,15 @@ package org.obeonetwork.dsl.database.tests.mariadb; +import static org.junit.Assert.fail; + +import java.time.Duration; +import java.time.Instant; +import java.util.Date; + +import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.obeonetwork.docker.common.DockerUtils; import org.obeonetwork.dsl.database.DataBase; import org.obeonetwork.dsl.database.reverse.DatabaseReverser; import org.obeonetwork.dsl.database.reverse.source.DataSource; @@ -11,6 +19,12 @@ import org.obeonetwork.dsl.database.tests.utils.TestUtils; import org.obeonetwork.dsl.typeslibrary.util.TypesLibraryUtil; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Ports; +import com.github.dockerjava.api.model.Ports.Binding; + import liquibase.exception.DatabaseException; public class MariaDBTests extends AbstractTests { @@ -27,11 +41,72 @@ public class MariaDBTests extends AbstractTests { private static final String MARIADB_USERNAME_DEFAULT = "test"; private static final String MARIADB_PASSWORD_DEFAULT = "test"; + + private static DockerUtils docker = null; + + private static String containerID; @BeforeClass public static void setUpBeforeClass() throws DatabaseException { + // Create and start container + docker = new DockerUtils("tcp://192.168.99.100:2376", true); + + containerID = createMariaDBContainer("mariadbtest_junit"); + docker.startContainer(containerID); + String url = String.format(JDBC_MARIADB_URL_PATTERN, MARIADB_HOST_DEFAULT, MARIADB_PORT_DEFAULT, DATABASE_NAME_DEFAULT, true); - database = TestUtils.openDatabaseConnection(url, MARIADB_USERNAME_DEFAULT, MARIADB_PASSWORD_DEFAULT); + + Instant start = Instant.now(); + boolean timeoutOccured = false; + while (database == null && timeoutOccured == false) { + System.out.println(new Date()); + + + try { + database = TestUtils.openDatabaseConnection(url, MARIADB_USERNAME_DEFAULT, MARIADB_PASSWORD_DEFAULT); + } catch (DatabaseException e) { + // Do nothing + // Database is probably not fully started yet + } + timeoutOccured = Duration.between(start, Instant.now()).toMillis() > 30000; + } + + if (database == null) { + fail("Unable to connect to database within " + 30000 + " ms"); + } + } + + @AfterClass + public static void tearDownAfterClass() throws DatabaseException { + AbstractTests.tearDownAfterClass(); + + // Stop and remove container + docker.stopContainer(containerID); + docker.removeContainer(containerID); + } + + private static String createMariaDBContainer(String containerName) { + ExposedPort tcp3306 = ExposedPort.tcp(3306); + + Ports portBindings = new Ports(); + portBindings.bind(tcp3306, Binding.bindPort(tcp3306.getPort())); + + CreateContainerResponse exec = docker.createContainerCmd("mariadb/server:10.2") + .withName(containerName) + .withImage("mariadb/server:10.2") + .withAttachStdin(Boolean.FALSE) + .withAttachStdout(Boolean.FALSE) + .withAttachStderr(Boolean.FALSE) + .withEnv("MYSQL_ROOT_PASSWORD=root", + "MYSQL_DATABASE=northwind", + "MYSQL_USER=test", + "MYSQL_PASSWORD=test") + .withExposedPorts(tcp3306) + .withHostConfig(HostConfig.newHostConfig(). + withPortBindings(portBindings) + ) + .exec(); + return exec.getId(); } @Test diff --git a/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mysql/MySQLTests.java b/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mysql/MySQLTests.java index 783b9584ab..9d3c7460cf 100644 --- a/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mysql/MySQLTests.java +++ b/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/mysql/MySQLTests.java @@ -4,11 +4,9 @@ import java.time.Duration; import java.time.Instant; -import java.util.Arrays; import java.util.Date; import java.util.List; -import org.apache.commons.lang.StringUtils; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -23,9 +21,9 @@ import org.obeonetwork.dsl.typeslibrary.util.TypesLibraryUtil; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.Image; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.api.model.Ports.Binding; @@ -60,8 +58,6 @@ public static void setupBeforeClass() throws DatabaseException { containerID = createMySQLContainer("mysqltest_junit"); docker.startContainer(containerID); - listContainers(docker.getContainers(false)); - String url = String.format(JDBC_MYSQL_URL_PATTERN, MYSQL_HOST_DEFAULT, MYSQL_PORT_DEFAULT, DATABASE_NAME_DEFAULT, true); Instant start = Instant.now(); @@ -93,35 +89,39 @@ public static void tearDownAfterClass() throws DatabaseException { docker.removeContainer(containerID); } - private static void listContainers(List containers) { - for (Container container : containers) { - System.out.println("ID=" + container.getId()); - System.out.println("Names=" + StringUtils.join(Arrays.asList(container.getNames()), ",")); - } + private static Image loadMySQLImage() { + // Check if image already exists + List images = docker.getImages("mysql:5.7"); +//docker.pullImage("mysql:5.7"); + return images.isEmpty() ? null : images.get(0); } private static String createMySQLContainer(String containerName) { - ExposedPort tcp3306 = ExposedPort.tcp(3306); - - Ports portBindings = new Ports(); - portBindings.bind(tcp3306, Binding.bindPort(tcp3306.getPort())); - - CreateContainerResponse exec = docker.createContainerCmd("mysql:5.7") - .withName(containerName) - .withImage("mysql:5.7") - .withAttachStdin(Boolean.FALSE) - .withAttachStdout(Boolean.FALSE) - .withAttachStderr(Boolean.FALSE) - .withEnv("MYSQL_ROOT_PASSWORD=root", - "MYSQL_DATABASE=northwind", - "MYSQL_USER=test", - "MYSQL_PASSWORD=test") - .withExposedPorts(tcp3306) - .withHostConfig(HostConfig.newHostConfig(). - withPortBindings(portBindings) - ) - .exec(); - return exec.getId(); + Image image = loadMySQLImage(); + if (image != null) { + ExposedPort tcp3306 = ExposedPort.tcp(3306); + + Ports portBindings = new Ports(); + portBindings.bind(tcp3306, Binding.bindPort(tcp3306.getPort())); + + CreateContainerResponse exec = docker.createContainerCmd("mysql:5.7") + .withName(containerName) + .withImage("mysql:5.7") + .withAttachStdin(Boolean.FALSE) + .withAttachStdout(Boolean.FALSE) + .withAttachStderr(Boolean.FALSE) + .withEnv("MYSQL_ROOT_PASSWORD=root", + "MYSQL_DATABASE=northwind", + "MYSQL_USER=test", + "MYSQL_PASSWORD=test") + .withExposedPorts(tcp3306) + .withHostConfig(HostConfig.newHostConfig(). + withPortBindings(portBindings) + ) + .exec(); + return exec.getId(); + } + return null; } @Test diff --git a/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/oracle/OracleTests.java b/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/oracle/OracleTests.java index 8645017d48..0eb6e8cb50 100644 --- a/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/oracle/OracleTests.java +++ b/models/database/plugins/org.obeonetwork.dsl.database.tests/src/org/obeonetwork/dsl/database/tests/oracle/OracleTests.java @@ -3,18 +3,14 @@ import static org.junit.Assert.fail; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; +import java.net.URL; import java.nio.file.Files; -import java.sql.Connection; import java.sql.SQLException; import java.time.Duration; import java.time.Instant; -import java.util.Arrays; -import java.util.Date; import java.util.List; -import org.apache.commons.lang.StringUtils; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -26,13 +22,11 @@ import org.obeonetwork.dsl.database.reverse.source.DataSourceException; import org.obeonetwork.dsl.database.reverse.utils.MultiDataBaseQueries; import org.obeonetwork.dsl.database.spec.DatabaseConstants; -import org.obeonetwork.dsl.database.tests.AbstractTests; import org.obeonetwork.dsl.database.tests.utils.TestUtils; import org.obeonetwork.dsl.typeslibrary.util.TypesLibraryUtil; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.model.Bind; -import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.Image; @@ -133,8 +127,9 @@ private static Image loadOracleImage() { if (images.isEmpty()) { // Load image try { - docker.loadImage("D:/temp/docker/oracle11G-XE/oracle-xe-docker.tar"); - } catch (FileNotFoundException e) { + //docker.loadImage("D:/temp/docker/oracle11G-XE/oracle-xe-docker.tar"); + docker.loadImage(new URL("http://update.obeo.fr/livraisonsClients/Minist%c3%a8re%20de%20la%20d%c3%a9fense/Docker/oracle/oracle-xe-docker.tar")); + } catch (IOException e) { fail("load oracle image failed : " + e.getMessage()); } images = docker.getImages("oracle/database:11.2.0.2-xe"); @@ -146,12 +141,13 @@ private static String createOracleContainer(String containerName) { Image image = loadOracleImage(); if (image != null) { - -// docker run --name oracletest --shm-size=1g -p 1521:1521 -e ORACLE_PWD=oracleserver -v temp/oradata:/u01/app/oracle/oradata -d oracle/database:11.2.0.2-xe +// docker run --name orcl --shm-size=1g -p 1521:1521 -p 8080:8080 -e ORACLE_PWD=oracleserver oracle/database:11.2.0.2-xe ExposedPort tcp1521 = ExposedPort.tcp(1521); + ExposedPort tcp8080 = ExposedPort.tcp(8080); Ports portBindings = new Ports(); portBindings.bind(tcp1521, Binding.bindPort(tcp1521.getPort())); + portBindings.bind(tcp8080, Binding.bindPort(tcp8080.getPort())); CreateContainerResponse exec = docker.createContainerCmd("oracle/database:11.2.0.2-xe") .withName(containerName) @@ -159,8 +155,7 @@ private static String createOracleContainer(String containerName) { .withAttachStdin(Boolean.FALSE) .withAttachStdout(Boolean.FALSE) .withAttachStderr(Boolean.FALSE) - .withEnv("ORACLE_PWD=oracleserver", - "ORACLE_ALLOW_REMOTE=true") + .withEnv("ORACLE_PWD=oracleserver") // .withVolumes(new Volume("oradata:/u01/app/oracle/oradata")) .withExposedPorts(tcp1521) .withHostConfig(HostConfig.newHostConfig() @@ -181,50 +176,9 @@ private static void initializeContainer() { containerID = createOracleContainer("oracletest_junit"); docker.startContainer(containerID); - listContainers(docker.getContainers(false)); - - String url = String.format(JDBC_ORACLE_URL_PATTERN, ORACLE_HOST_DEFAULT, ORACLE_PORT_DEFAULT, ORACLE_SID); - -// DataSource tempDS = new DataSource(ORACLE_SID, ORACLE_SYSTEM_USER); -// tempDS.setJdbcUrl(url); -// tempDS.setJdbcUsername(ORACLE_SYSTEM_USER); -// tempDS.setJdbcPassword(ORACLE_SYSTEM_USER_PASSWORD); -// tempDS.setVendor(DatabaseConstants.DB_ORACLE_11G); - -// Connection connection = null; - Database database = null; - Instant start = Instant.now(); - boolean timeoutOccured = false; - while (database == null && timeoutOccured == false) { - System.out.println(new Date()); -// connection = tempDS.getConnection(); - try { - database = TestUtils.openDatabaseConnectionWithDriver(url, ORACLE_SYSTEM_USER, ORACLE_SYSTEM_USER_PASSWORD, "oracle.jdbc.OracleDriver"); - } catch (DatabaseException e) { - // Do nothing but retry - System.out.println(e.getMessage()); - } - - timeoutOccured = Duration.between(start, Instant.now()).toMillis() > FIRST_CONNECTION_TIMEOUT; - } + boolean started = docker.waitUntilContainerIsStarted(containerID, FIRST_CONNECTION_TIMEOUT); - if (database == null) { - fail("Unable to connect to database within " + FIRST_CONNECTION_TIMEOUT + " ms"); - } else { - try { - database.close(); - } catch (DatabaseException e) { - // Do nothing - } - - } - } - - private static void listContainers(List containers) { - for (Container container : containers) { - System.out.println("ID=" + container.getId()); - System.out.println("Names=" + StringUtils.join(Arrays.asList(container.getNames()), ",")); - } + System.out.println("started = " + started); } @BeforeClass