Browse Source

DATAJDBC-168 - Run integration tests with testcontainers.

Added testcontainers as dependency and configured MySql and Postrgres datasources to use it.

Original pull request: #34.
pull/36/head
sedooe 8 years ago committed by Jens Schauder
parent
commit
0fe791f2bc
  1. 14
      pom.xml
  2. 2
      run-tests-against-all-dbs.sh
  3. 41
      src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java
  4. 13
      src/test/java/org/springframework/data/jdbc/testing/PostgresDataSourceConfiguration.java
  5. 2
      src/test/resources/create-mysql.sql
  6. 53
      src/test/resources/mysql_cnf_override/mysql.cnf
  7. 7
      start-all-dbs.sh
  8. 7
      stop-all-dbs.sh

14
pom.xml

@ -183,6 +183,20 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>

2
run-tests-against-all-dbs.sh

@ -1,3 +1,3 @@
#!/bin/sh #!/bin/sh
./start-all-dbs.sh && mvn clean install -Pall-dbs && ./stop-all-dbs.sh mvn clean install -Pall-dbs

41
src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java

@ -15,15 +15,16 @@
*/ */
package org.springframework.data.jdbc.testing; package org.springframework.data.jdbc.testing;
import java.sql.SQLException;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.script.ScriptException;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.core.io.ClassPathResource; import org.testcontainers.containers.MySQLContainer;
import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.testcontainers.jdbc.ext.ScriptUtils;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
@ -32,35 +33,45 @@ import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
* *
* @author Jens Schauder * @author Jens Schauder
* @author Oliver Gierke * @author Oliver Gierke
* @author Sedat Gokcen
*/ */
@Configuration @Configuration
@Profile("mysql") @Profile("mysql")
class MySqlDataSourceConfiguration extends DataSourceConfiguration { class MySqlDataSourceConfiguration extends DataSourceConfiguration {
private static final MySQLContainer MYSQL_CONTAINER = new MySQLContainer();
static {
MYSQL_CONTAINER.withConfigurationOverride("mysql_cnf_override").withDatabaseName("test").start();
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource() * @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource()
*/ */
@Override
protected DataSource createDataSource() { protected DataSource createDataSource() {
MysqlDataSource dataSource = new MysqlDataSource(); MysqlDataSource dataSource = getCommonDataSource();
dataSource.setUrl("jdbc:mysql:///test?user=root"); dataSource.setDatabaseName(MYSQL_CONTAINER.getDatabaseName());
return dataSource; return dataSource;
} }
@PostConstruct @PostConstruct
public void initDatabase() { public void initDatabase() throws SQLException, ScriptException {
MysqlDataSource dataSource = new MysqlDataSource(); MysqlDataSource dataSource = getCommonDataSource();
dataSource.setUrl("jdbc:mysql:///?user=root"); ScriptUtils.executeSqlScript(dataSource.getConnection(), null, "DROP DATABASE test;CREATE DATABASE test;");
}
ClassPathResource createScript = new ClassPathResource("create-mysql.sql"); private MysqlDataSource getCommonDataSource() {
DatabasePopulator databasePopulator = new ResourceDatabasePopulator(createScript);
DataSourceInitializer initializer = new DataSourceInitializer(); MysqlDataSource dataSource = new MysqlDataSource();
initializer.setDatabasePopulator(databasePopulator); dataSource.setUrl(MYSQL_CONTAINER.getJdbcUrl());
initializer.setDataSource(dataSource); dataSource.setUser(MYSQL_CONTAINER.getUsername());
initializer.afterPropertiesSet(); dataSource.setPassword(MYSQL_CONTAINER.getPassword());
return dataSource;
} }
} }

13
src/test/java/org/springframework/data/jdbc/testing/PostgresDataSourceConfiguration.java

@ -21,25 +21,36 @@ import org.postgresql.ds.PGSimpleDataSource;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import org.testcontainers.containers.PostgreSQLContainer;
/** /**
* {@link DataSource} setup for PostgreSQL * {@link DataSource} setup for PostgreSQL
* *
* @author Jens Schauder * @author Jens Schauder
* @author Oliver Gierke * @author Oliver Gierke
* @author Sedat Gokcen
*/ */
@Configuration @Configuration
@Profile("postgres") @Profile("postgres")
public class PostgresDataSourceConfiguration extends DataSourceConfiguration { public class PostgresDataSourceConfiguration extends DataSourceConfiguration {
private static final PostgreSQLContainer POSTGRESQL_CONTAINER = new PostgreSQLContainer();
static {
POSTGRESQL_CONTAINER.start();
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource() * @see org.springframework.data.jdbc.testing.DataSourceConfiguration#createDataSource()
*/ */
@Override
protected DataSource createDataSource() { protected DataSource createDataSource() {
PGSimpleDataSource ds = new PGSimpleDataSource(); 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; return ds;
} }

2
src/test/resources/create-mysql.sql

@ -1,2 +0,0 @@
DROP DATABASE test;
CREATE DATABASE test;

53
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

7
start-all-dbs.sh

@ -1,7 +0,0 @@
#!/bin/sh
# postgres
pg_ctl -D /usr/local/var/postgres start
# mysql
mysql.server start

7
stop-all-dbs.sh

@ -1,7 +0,0 @@
#!/bin/sh
# postgres
pg_ctl -D /usr/local/var/postgres stop
# mysql
mysql.server stop
Loading…
Cancel
Save