From 9855e320e1e512d3cc3843977df165d43b5153fd Mon Sep 17 00:00:00 2001 From: sedooe Date: Thu, 1 Feb 2018 12:15:25 +0300 Subject: [PATCH] DATAJDBC-168 - Run integration tests with testcontainers. --- pom.xml | 14 +++++ run-tests-against-all-dbs.sh | 2 +- .../testing/MySqlDataSourceConfiguration.java | 41 ++++++++------ .../PostgresDataSourceConfiguration.java | 13 ++++- src/test/resources/create-mysql.sql | 2 - .../resources/mysql_cnf_override/mysql.cnf | 53 +++++++++++++++++++ start-all-dbs.sh | 7 --- stop-all-dbs.sh | 7 --- 8 files changed, 106 insertions(+), 33 deletions(-) delete mode 100644 src/test/resources/create-mysql.sql create mode 100644 src/test/resources/mysql_cnf_override/mysql.cnf delete mode 100755 start-all-dbs.sh delete mode 100755 stop-all-dbs.sh diff --git a/pom.xml b/pom.xml index 2d68144a47..32ea3ff805 100644 --- a/pom.xml +++ b/pom.xml @@ -183,6 +183,20 @@ test + + org.testcontainers + mysql + 1.5.1 + test + + + + org.testcontainers + postgresql + 1.5.1 + test + + diff --git a/run-tests-against-all-dbs.sh b/run-tests-against-all-dbs.sh index 9ef6389c1c..1fb700b4d1 100755 --- a/run-tests-against-all-dbs.sh +++ b/run-tests-against-all-dbs.sh @@ -1,3 +1,3 @@ #!/bin/sh -./start-all-dbs.sh && mvn clean install -Pall-dbs && ./stop-all-dbs.sh +mvn clean install -Pall-dbs diff --git a/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java b/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java index 2fad9d1b12..6c74213a5a 100644 --- a/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java +++ b/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java @@ -15,15 +15,16 @@ */ package org.springframework.data.jdbc.testing; +import java.sql.SQLException; + import javax.annotation.PostConstruct; +import javax.script.ScriptException; import javax.sql.DataSource; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; -import org.springframework.core.io.ClassPathResource; -import org.springframework.jdbc.datasource.init.DataSourceInitializer; -import org.springframework.jdbc.datasource.init.DatabasePopulator; -import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.jdbc.ext.ScriptUtils; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; @@ -32,35 +33,45 @@ * * @author Jens Schauder * @author Oliver Gierke + * @author Sedat Gokcen */ @Configuration @Profile("mysql") class MySqlDataSourceConfiguration extends DataSourceConfiguration { + private static final MySQLContainer MYSQL_CONTAINER = new MySQLContainer(); + + static { + MYSQL_CONTAINER.withConfigurationOverride("mysql_cnf_override").withDatabaseName("test").start(); + } + /* * (non-Javadoc) * @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource() */ + @Override protected DataSource createDataSource() { - MysqlDataSource dataSource = new MysqlDataSource(); - dataSource.setUrl("jdbc:mysql:///test?user=root"); + MysqlDataSource dataSource = getCommonDataSource(); + dataSource.setDatabaseName(MYSQL_CONTAINER.getDatabaseName()); return dataSource; } @PostConstruct - public void initDatabase() { + public void initDatabase() throws SQLException, ScriptException { - MysqlDataSource dataSource = new MysqlDataSource(); - dataSource.setUrl("jdbc:mysql:///?user=root"); + MysqlDataSource dataSource = getCommonDataSource(); + ScriptUtils.executeSqlScript(dataSource.getConnection(), null, "DROP DATABASE test;CREATE DATABASE test;"); + } - ClassPathResource createScript = new ClassPathResource("create-mysql.sql"); - DatabasePopulator databasePopulator = new ResourceDatabasePopulator(createScript); + private MysqlDataSource getCommonDataSource() { - DataSourceInitializer initializer = new DataSourceInitializer(); - initializer.setDatabasePopulator(databasePopulator); - initializer.setDataSource(dataSource); - initializer.afterPropertiesSet(); + MysqlDataSource dataSource = new MysqlDataSource(); + dataSource.setUrl(MYSQL_CONTAINER.getJdbcUrl()); + dataSource.setUser(MYSQL_CONTAINER.getUsername()); + dataSource.setPassword(MYSQL_CONTAINER.getPassword()); + + return dataSource; } } diff --git a/src/test/java/org/springframework/data/jdbc/testing/PostgresDataSourceConfiguration.java b/src/test/java/org/springframework/data/jdbc/testing/PostgresDataSourceConfiguration.java index 3443f076b7..803033ab04 100644 --- a/src/test/java/org/springframework/data/jdbc/testing/PostgresDataSourceConfiguration.java +++ b/src/test/java/org/springframework/data/jdbc/testing/PostgresDataSourceConfiguration.java @@ -21,25 +21,36 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.testcontainers.containers.PostgreSQLContainer; /** * {@link DataSource} setup for PostgreSQL * * @author Jens Schauder * @author Oliver Gierke + * @author Sedat Gokcen */ @Configuration @Profile("postgres") public class PostgresDataSourceConfiguration extends DataSourceConfiguration { + private static final PostgreSQLContainer POSTGRESQL_CONTAINER = new PostgreSQLContainer(); + + static { + POSTGRESQL_CONTAINER.start(); + } + /* * (non-Javadoc) * @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource() */ + @Override protected DataSource createDataSource() { PGSimpleDataSource ds = new PGSimpleDataSource(); - ds.setUrl("jdbc:postgresql:///postgres"); + ds.setUrl(POSTGRESQL_CONTAINER.getJdbcUrl()); + ds.setUser(POSTGRESQL_CONTAINER.getUsername()); + ds.setPassword(POSTGRESQL_CONTAINER.getPassword()); return ds; } diff --git a/src/test/resources/create-mysql.sql b/src/test/resources/create-mysql.sql deleted file mode 100644 index f1afbb0e10..0000000000 --- a/src/test/resources/create-mysql.sql +++ /dev/null @@ -1,2 +0,0 @@ -DROP DATABASE test; -CREATE DATABASE test; diff --git a/src/test/resources/mysql_cnf_override/mysql.cnf b/src/test/resources/mysql_cnf_override/mysql.cnf new file mode 100644 index 0000000000..44b3039c44 --- /dev/null +++ b/src/test/resources/mysql_cnf_override/mysql.cnf @@ -0,0 +1,53 @@ +[mysqld] + +# the only change we make, other params with the comments all together are the default ones. +lower_case_table_names = 1 + +user = mysql +datadir = /var/lib/mysql +port = 3306 +#socket = /tmp/mysql.sock +skip-external-locking +key_buffer_size = 16K +max_allowed_packet = 1M +table_open_cache = 4 +sort_buffer_size = 64K +read_buffer_size = 256K +read_rnd_buffer_size = 256K +net_buffer_length = 2K +skip-host-cache +skip-name-resolve + +# Don't listen on a TCP/IP port at all. This can be a security enhancement, +# if all processes that need to connect to mysqld run on the same host. +# All interaction with mysqld must be made via Unix sockets or named pipes. +# Note that using this option without enabling named pipes on Windows +# (using the "enable-named-pipe" option) will render mysqld useless! +# +#skip-networking +#server-id = 1 + +# Uncomment the following if you want to log updates +#log-bin=mysql-bin + +# binary logging format - mixed recommended +#binlog_format=mixed + +# Causes updates to non-transactional engines using statement format to be +# written directly to binary log. Before using this option make sure that +# there are no dependencies between transactional and non-transactional +# tables such as in the statement INSERT INTO t_myisam SELECT * FROM +# t_innodb; otherwise, slaves may diverge from the master. +#binlog_direct_non_transactional_updates=TRUE + +# Uncomment the following if you are using InnoDB tables +innodb_data_file_path = ibdata1:10M:autoextend +# You can set .._buffer_pool_size up to 50 - 80 % +# of RAM but beware of setting memory usage too high +innodb_buffer_pool_size = 16M +#innodb_additional_mem_pool_size = 2M +# Set .._log_file_size to 25 % of buffer pool size +innodb_log_file_size = 5M +innodb_log_buffer_size = 8M +innodb_flush_log_at_trx_commit = 1 +innodb_lock_wait_timeout = 50 \ No newline at end of file diff --git a/start-all-dbs.sh b/start-all-dbs.sh deleted file mode 100755 index 69ef5d777e..0000000000 --- a/start-all-dbs.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -# postgres -pg_ctl -D /usr/local/var/postgres start - -# mysql -mysql.server start diff --git a/stop-all-dbs.sh b/stop-all-dbs.sh deleted file mode 100755 index 402d21c35d..0000000000 --- a/stop-all-dbs.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -# postgres -pg_ctl -D /usr/local/var/postgres stop - -# mysql -mysql.server stop