diff --git a/gradle/dependency-management.gradle b/gradle/dependency-management.gradle index 87332705..08dc7990 100644 --- a/gradle/dependency-management.gradle +++ b/gradle/dependency-management.gradle @@ -5,6 +5,7 @@ dependencyManagement { mavenBom 'org.springframework:spring-framework-bom:5.0.4.RELEASE' mavenBom 'org.springframework.data:spring-data-releasetrain:Kay-SR4' mavenBom 'org.springframework.security:spring-security-bom:5.0.2.RELEASE' + mavenBom 'org.testcontainers:testcontainers-bom:1.7.1' } dependencies { @@ -13,14 +14,6 @@ dependencyManagement { entry 'hazelcast-client' } - dependencySet(group: 'org.testcontainers', version: '1.6.0') { - entry 'mariadb' - entry 'mssqlserver' - entry 'mysql' - entry 'postgresql' - entry 'testcontainers' - } - dependency 'com.h2database:h2:1.4.196' dependency 'com.microsoft.sqlserver:mssql-jdbc:6.2.2.jre8' dependency 'edu.umd.cs.mtc:multithreadedtc:1.01' diff --git a/samples/boot/findbyusername/src/integration-test/java/sample/FindByUsernameTests.java b/samples/boot/findbyusername/src/integration-test/java/sample/FindByUsernameTests.java index 0fa27dea..1fca0f90 100644 --- a/samples/boot/findbyusername/src/integration-test/java/sample/FindByUsernameTests.java +++ b/samples/boot/findbyusername/src/integration-test/java/sample/FindByUsernameTests.java @@ -17,8 +17,9 @@ package sample; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; -import org.junit.ClassRule; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver; @@ -49,12 +50,21 @@ import org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDr @ContextConfiguration(initializers = FindByUsernameTests.Initializer.class) public class FindByUsernameTests { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @Autowired private MockMvc mockMvc; @@ -93,8 +103,8 @@ public class FindByUsernameTests { public void initialize( ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues - .of("spring.redis.host=" + redisContainer.getContainerIpAddress(), - "spring.redis.port=" + redisContainer.getFirstMappedPort()) + .of("spring.redis.host=" + container.getContainerIpAddress(), + "spring.redis.port=" + container.getFirstMappedPort()) .applyTo(configurableApplicationContext.getEnvironment()); } diff --git a/samples/boot/redis-json/src/integration-test/java/sample/HttpRedisJsonTest.java b/samples/boot/redis-json/src/integration-test/java/sample/HttpRedisJsonTest.java index 8777add5..045d4fdb 100644 --- a/samples/boot/redis-json/src/integration-test/java/sample/HttpRedisJsonTest.java +++ b/samples/boot/redis-json/src/integration-test/java/sample/HttpRedisJsonTest.java @@ -19,8 +19,9 @@ package sample; import java.util.List; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; -import org.junit.ClassRule; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver; @@ -53,12 +54,21 @@ import static org.assertj.core.api.Assertions.assertThat; @ContextConfiguration(initializers = HttpRedisJsonTest.Initializer.class) public class HttpRedisJsonTest { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @Autowired private MockMvc mockMvc; @@ -117,8 +127,8 @@ public class HttpRedisJsonTest { public void initialize( ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues - .of("spring.redis.host=" + redisContainer.getContainerIpAddress(), - "spring.redis.port=" + redisContainer.getFirstMappedPort()) + .of("spring.redis.host=" + container.getContainerIpAddress(), + "spring.redis.port=" + container.getFirstMappedPort()) .applyTo(configurableApplicationContext.getEnvironment()); } diff --git a/samples/boot/redis-json/src/integration-test/java/sample/RedisSerializerTest.java b/samples/boot/redis-json/src/integration-test/java/sample/RedisSerializerTest.java index c3c691d8..fac6cd25 100644 --- a/samples/boot/redis-json/src/integration-test/java/sample/RedisSerializerTest.java +++ b/samples/boot/redis-json/src/integration-test/java/sample/RedisSerializerTest.java @@ -16,7 +16,8 @@ package sample; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.testcontainers.containers.GenericContainer; @@ -42,12 +43,21 @@ import static org.assertj.core.api.Assertions.assertThat; @ContextConfiguration(initializers = RedisSerializerTest.Initializer.class) public class RedisSerializerTest { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @SpringSessionRedisOperations private RedisTemplate sessionRedisTemplate; @@ -66,8 +76,8 @@ public class RedisSerializerTest { public void initialize( ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues - .of("spring.redis.host=" + redisContainer.getContainerIpAddress(), - "spring.redis.port=" + redisContainer.getFirstMappedPort()) + .of("spring.redis.host=" + container.getContainerIpAddress(), + "spring.redis.port=" + container.getFirstMappedPort()) .applyTo(configurableApplicationContext.getEnvironment()); } diff --git a/samples/boot/redis/src/integration-test/java/sample/BootTests.java b/samples/boot/redis/src/integration-test/java/sample/BootTests.java index 4505be39..1ac64ce0 100644 --- a/samples/boot/redis/src/integration-test/java/sample/BootTests.java +++ b/samples/boot/redis/src/integration-test/java/sample/BootTests.java @@ -17,8 +17,9 @@ package sample; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; -import org.junit.ClassRule; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver; @@ -48,12 +49,21 @@ import org.springframework.test.web.servlet.htmlunit.webdriver.MockMvcHtmlUnitDr @ContextConfiguration(initializers = BootTests.Initializer.class) public class BootTests { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @Autowired private MockMvc mockMvc; @@ -99,8 +109,8 @@ public class BootTests { public void initialize( ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues - .of("spring.redis.host=" + redisContainer.getContainerIpAddress(), - "spring.redis.port=" + redisContainer.getFirstMappedPort()) + .of("spring.redis.host=" + container.getContainerIpAddress(), + "spring.redis.port=" + container.getFirstMappedPort()) .applyTo(configurableApplicationContext.getEnvironment()); } diff --git a/samples/boot/webflux/src/integration-test/java/sample/AttributeTests.java b/samples/boot/webflux/src/integration-test/java/sample/AttributeTests.java index 71a49993..d785136e 100644 --- a/samples/boot/webflux/src/integration-test/java/sample/AttributeTests.java +++ b/samples/boot/webflux/src/integration-test/java/sample/AttributeTests.java @@ -19,8 +19,9 @@ package sample; import java.util.List; import org.junit.After; +import org.junit.AfterClass; import org.junit.Before; -import org.junit.ClassRule; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.WebDriver; @@ -49,12 +50,21 @@ import static org.assertj.core.api.Assertions.assertThat; @ContextConfiguration(initializers = AttributeTests.Initializer.class) public class AttributeTests { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @LocalServerPort private int port; @@ -106,8 +116,8 @@ public class AttributeTests { public void initialize( ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues - .of("spring.redis.host=" + redisContainer.getContainerIpAddress(), - "spring.redis.port=" + redisContainer.getFirstMappedPort()) + .of("spring.redis.host=" + container.getContainerIpAddress(), + "spring.redis.port=" + container.getFirstMappedPort()) .applyTo(configurableApplicationContext.getEnvironment()); } diff --git a/samples/boot/websocket/src/test/java/sample/ApplicationTests.java b/samples/boot/websocket/src/test/java/sample/ApplicationTests.java index 903cef7e..d4a92e1a 100644 --- a/samples/boot/websocket/src/test/java/sample/ApplicationTests.java +++ b/samples/boot/websocket/src/test/java/sample/ApplicationTests.java @@ -20,7 +20,8 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.testcontainers.containers.GenericContainer; @@ -55,12 +56,21 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; @ContextConfiguration(initializers = ApplicationTests.Initializer.class) public class ApplicationTests { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @Value("${local.server.port}") private String port; @@ -88,8 +98,8 @@ public class ApplicationTests { public void initialize( ConfigurableApplicationContext configurableApplicationContext) { TestPropertyValues - .of("spring.redis.host=" + redisContainer.getContainerIpAddress(), - "spring.redis.port=" + redisContainer.getFirstMappedPort()) + .of("spring.redis.host=" + container.getContainerIpAddress(), + "spring.redis.port=" + container.getFirstMappedPort()) .applyTo(configurableApplicationContext.getEnvironment()); } diff --git a/samples/javaconfig/custom-cookie/src/main/java/sample/EmbeddedRedisConfig.java b/samples/javaconfig/custom-cookie/src/main/java/sample/EmbeddedRedisConfig.java index ac41f0dc..7aed044a 100644 --- a/samples/javaconfig/custom-cookie/src/main/java/sample/EmbeddedRedisConfig.java +++ b/samples/javaconfig/custom-cookie/src/main/java/sample/EmbeddedRedisConfig.java @@ -16,8 +16,6 @@ package sample; -import java.io.IOException; - import org.testcontainers.containers.GenericContainer; import org.springframework.context.annotation.Bean; @@ -30,23 +28,11 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor @Profile("embedded-redis") public class EmbeddedRedisConfig { - private static final String REDIS_DOCKER_IMAGE = "redis:4.0.8"; + private static final String REDIS_DOCKER_IMAGE = "redis:4.0.9"; @Bean(initMethod = "start") public GenericContainer redisContainer() { - return new GenericContainer(REDIS_DOCKER_IMAGE) { - - @Override - public void close() { - super.close(); - try { - this.dockerClient.close(); - } - catch (IOException ignored) { - } - } - - }.withExposedPorts(6379); + return new GenericContainer(REDIS_DOCKER_IMAGE).withExposedPorts(6379); } @Bean diff --git a/samples/javaconfig/redis/src/main/java/sample/EmbeddedRedisConfig.java b/samples/javaconfig/redis/src/main/java/sample/EmbeddedRedisConfig.java index ac41f0dc..7aed044a 100644 --- a/samples/javaconfig/redis/src/main/java/sample/EmbeddedRedisConfig.java +++ b/samples/javaconfig/redis/src/main/java/sample/EmbeddedRedisConfig.java @@ -16,8 +16,6 @@ package sample; -import java.io.IOException; - import org.testcontainers.containers.GenericContainer; import org.springframework.context.annotation.Bean; @@ -30,23 +28,11 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor @Profile("embedded-redis") public class EmbeddedRedisConfig { - private static final String REDIS_DOCKER_IMAGE = "redis:4.0.8"; + private static final String REDIS_DOCKER_IMAGE = "redis:4.0.9"; @Bean(initMethod = "start") public GenericContainer redisContainer() { - return new GenericContainer(REDIS_DOCKER_IMAGE) { - - @Override - public void close() { - super.close(); - try { - this.dockerClient.close(); - } - catch (IOException ignored) { - } - } - - }.withExposedPorts(6379); + return new GenericContainer(REDIS_DOCKER_IMAGE).withExposedPorts(6379); } @Bean diff --git a/samples/javaconfig/rest/spring-session-sample-javaconfig-rest.gradle b/samples/javaconfig/rest/spring-session-sample-javaconfig-rest.gradle index 819575c6..bc0b70b6 100644 --- a/samples/javaconfig/rest/spring-session-sample-javaconfig-rest.gradle +++ b/samples/javaconfig/rest/spring-session-sample-javaconfig-rest.gradle @@ -17,7 +17,6 @@ dependencies { testCompile "org.springframework.security:spring-security-test" testCompile "org.assertj:assertj-core" testCompile "org.springframework:spring-test" - testCompile "commons-codec:commons-codec" integrationTestCompile "org.testcontainers:testcontainers" } diff --git a/samples/javaconfig/rest/src/integration-test/java/rest/RestMockMvcTests.java b/samples/javaconfig/rest/src/integration-test/java/rest/RestMockMvcTests.java index 8cd1391f..c5eda608 100644 --- a/samples/javaconfig/rest/src/integration-test/java/rest/RestMockMvcTests.java +++ b/samples/javaconfig/rest/src/integration-test/java/rest/RestMockMvcTests.java @@ -16,8 +16,9 @@ package rest; +import org.junit.AfterClass; import org.junit.Before; -import org.junit.ClassRule; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.testcontainers.containers.GenericContainer; @@ -55,12 +56,21 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @WebAppConfiguration public class RestMockMvcTests { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + @Autowired private SessionRepositoryFilter sessionRepositoryFilter; @@ -99,8 +109,8 @@ public class RestMockMvcTests { @Bean public LettuceConnectionFactory redisConnectionFactory() { - return new LettuceConnectionFactory(redisContainer.getContainerIpAddress(), - redisContainer.getFirstMappedPort()); + return new LettuceConnectionFactory(container.getContainerIpAddress(), + container.getFirstMappedPort()); } @Bean diff --git a/samples/javaconfig/rest/src/integration-test/java/sample/RestTests.java b/samples/javaconfig/rest/src/integration-test/java/sample/RestTests.java index e12c763b..ca7f1326 100644 --- a/samples/javaconfig/rest/src/integration-test/java/sample/RestTests.java +++ b/samples/javaconfig/rest/src/integration-test/java/sample/RestTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2017 the original author or authors. + * Copyright 2014-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,8 @@ package sample; import java.util.Arrays; +import java.util.Base64; -import org.apache.commons.codec.binary.Base64; import org.junit.Before; import org.junit.Test; @@ -122,6 +122,6 @@ public class RestTests { private String getAuth(String user, String password) { String auth = user + ":" + password; - return new String(Base64.encodeBase64(auth.getBytes())); + return Base64.getEncoder().encodeToString(auth.getBytes()); } } diff --git a/samples/javaconfig/rest/src/main/java/sample/EmbeddedRedisConfig.java b/samples/javaconfig/rest/src/main/java/sample/EmbeddedRedisConfig.java index ac41f0dc..7aed044a 100644 --- a/samples/javaconfig/rest/src/main/java/sample/EmbeddedRedisConfig.java +++ b/samples/javaconfig/rest/src/main/java/sample/EmbeddedRedisConfig.java @@ -16,8 +16,6 @@ package sample; -import java.io.IOException; - import org.testcontainers.containers.GenericContainer; import org.springframework.context.annotation.Bean; @@ -30,23 +28,11 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor @Profile("embedded-redis") public class EmbeddedRedisConfig { - private static final String REDIS_DOCKER_IMAGE = "redis:4.0.8"; + private static final String REDIS_DOCKER_IMAGE = "redis:4.0.9"; @Bean(initMethod = "start") public GenericContainer redisContainer() { - return new GenericContainer(REDIS_DOCKER_IMAGE) { - - @Override - public void close() { - super.close(); - try { - this.dockerClient.close(); - } - catch (IOException ignored) { - } - } - - }.withExposedPorts(6379); + return new GenericContainer(REDIS_DOCKER_IMAGE).withExposedPorts(6379); } @Bean diff --git a/samples/javaconfig/security/src/main/java/sample/EmbeddedRedisConfig.java b/samples/javaconfig/security/src/main/java/sample/EmbeddedRedisConfig.java index ac41f0dc..7aed044a 100644 --- a/samples/javaconfig/security/src/main/java/sample/EmbeddedRedisConfig.java +++ b/samples/javaconfig/security/src/main/java/sample/EmbeddedRedisConfig.java @@ -16,8 +16,6 @@ package sample; -import java.io.IOException; - import org.testcontainers.containers.GenericContainer; import org.springframework.context.annotation.Bean; @@ -30,23 +28,11 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor @Profile("embedded-redis") public class EmbeddedRedisConfig { - private static final String REDIS_DOCKER_IMAGE = "redis:4.0.8"; + private static final String REDIS_DOCKER_IMAGE = "redis:4.0.9"; @Bean(initMethod = "start") public GenericContainer redisContainer() { - return new GenericContainer(REDIS_DOCKER_IMAGE) { - - @Override - public void close() { - super.close(); - try { - this.dockerClient.close(); - } - catch (IOException ignored) { - } - } - - }.withExposedPorts(6379); + return new GenericContainer(REDIS_DOCKER_IMAGE).withExposedPorts(6379); } @Bean diff --git a/samples/xml/redis/src/main/java/sample/EmbeddedRedisConfig.java b/samples/xml/redis/src/main/java/sample/EmbeddedRedisConfig.java index ac41f0dc..7aed044a 100644 --- a/samples/xml/redis/src/main/java/sample/EmbeddedRedisConfig.java +++ b/samples/xml/redis/src/main/java/sample/EmbeddedRedisConfig.java @@ -16,8 +16,6 @@ package sample; -import java.io.IOException; - import org.testcontainers.containers.GenericContainer; import org.springframework.context.annotation.Bean; @@ -30,23 +28,11 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor @Profile("embedded-redis") public class EmbeddedRedisConfig { - private static final String REDIS_DOCKER_IMAGE = "redis:4.0.8"; + private static final String REDIS_DOCKER_IMAGE = "redis:4.0.9"; @Bean(initMethod = "start") public GenericContainer redisContainer() { - return new GenericContainer(REDIS_DOCKER_IMAGE) { - - @Override - public void close() { - super.close(); - try { - this.dockerClient.close(); - } - catch (IOException ignored) { - } - } - - }.withExposedPorts(6379); + return new GenericContainer(REDIS_DOCKER_IMAGE).withExposedPorts(6379); } @Bean diff --git a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/AbstractRedisITests.java b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/AbstractRedisITests.java index 0b19fb1c..1c42201e 100644 --- a/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/AbstractRedisITests.java +++ b/spring-session-data-redis/src/integration-test/java/org/springframework/session/data/redis/AbstractRedisITests.java @@ -16,7 +16,8 @@ package org.springframework.session.data.redis; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.testcontainers.containers.GenericContainer; import org.springframework.context.annotation.Bean; @@ -30,19 +31,27 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor */ public abstract class AbstractRedisITests { - private static final String DOCKER_IMAGE = "redis:4.0.8"; + private static final String DOCKER_IMAGE = "redis:4.0.9"; - @ClassRule - public static GenericContainer redisContainer = new GenericContainer(DOCKER_IMAGE) + private static GenericContainer container = new GenericContainer(DOCKER_IMAGE) .withExposedPorts(6379); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + protected static class BaseConfig { @Bean public LettuceConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration( - redisContainer.getContainerIpAddress(), - redisContainer.getFirstMappedPort()); + container.getContainerIpAddress(), container.getFirstMappedPort()); return new LettuceConnectionFactory(configuration); } diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDB10JdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDb10JdbcOperationsSessionRepositoryITests.java similarity index 72% rename from spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDB10JdbcOperationsSessionRepositoryITests.java rename to spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDb10JdbcOperationsSessionRepositoryITests.java index 72d687ea..6e5013be 100644 --- a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDB10JdbcOperationsSessionRepositoryITests.java +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDb10JdbcOperationsSessionRepositoryITests.java @@ -20,7 +20,8 @@ import java.sql.SQLException; import javax.sql.DataSource; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.mariadb.jdbc.MariaDbDataSource; import org.testcontainers.containers.MariaDBContainer; @@ -43,23 +44,29 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @WebAppConfiguration @ContextConfiguration -public class MariaDB10JdbcOperationsSessionRepositoryITests +public class MariaDb10JdbcOperationsSessionRepositoryITests extends AbstractJdbcOperationsSessionRepositoryITests { - private static final String DOCKER_IMAGE = "mariadb:10.2.13"; + private static MariaDBContainer container = new MariaDb10Container(); - @ClassRule - public static MariaDBContainer mariaDBContainer = new MariaDBContainer(DOCKER_IMAGE); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } @Configuration static class Config extends BaseConfig { @Bean public DataSource dataSource() throws SQLException { - MariaDbDataSource dataSource = new MariaDbDataSource( - mariaDBContainer.getJdbcUrl()); - dataSource.setUserName(mariaDBContainer.getUsername()); - dataSource.setPassword(mariaDBContainer.getPassword()); + MariaDbDataSource dataSource = new MariaDbDataSource(container.getJdbcUrl()); + dataSource.setUserName(container.getUsername()); + dataSource.setPassword(container.getPassword()); return dataSource; } @@ -76,4 +83,19 @@ public class MariaDB10JdbcOperationsSessionRepositoryITests } + private static class MariaDb10Container extends MariaDBContainer { + + MariaDb10Container() { + super("mariadb:10.2.14"); + } + + @Override + protected void configure() { + super.configure(); + setCommand("mysqld", "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_unicode_ci"); + } + + } + } diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDB5JdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDb5JdbcOperationsSessionRepositoryITests.java similarity index 70% rename from spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDB5JdbcOperationsSessionRepositoryITests.java rename to spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDb5JdbcOperationsSessionRepositoryITests.java index 60a76efb..540f1dbd 100644 --- a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDB5JdbcOperationsSessionRepositoryITests.java +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MariaDb5JdbcOperationsSessionRepositoryITests.java @@ -20,7 +20,8 @@ import java.sql.SQLException; import javax.sql.DataSource; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.mariadb.jdbc.MariaDbDataSource; import org.testcontainers.containers.MariaDBContainer; @@ -43,23 +44,29 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @WebAppConfiguration @ContextConfiguration -public class MariaDB5JdbcOperationsSessionRepositoryITests +public class MariaDb5JdbcOperationsSessionRepositoryITests extends AbstractJdbcOperationsSessionRepositoryITests { - private static final String DOCKER_IMAGE = "mariadb:5.5.59"; + private static MariaDBContainer container = new MariaDb5Container(); - @ClassRule - public static MariaDBContainer mariaDBContainer = new MariaDBContainer(DOCKER_IMAGE); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } @Configuration static class Config extends BaseConfig { @Bean public DataSource dataSource() throws SQLException { - MariaDbDataSource dataSource = new MariaDbDataSource( - mariaDBContainer.getJdbcUrl()); - dataSource.setUserName(mariaDBContainer.getUsername()); - dataSource.setPassword(mariaDBContainer.getPassword()); + MariaDbDataSource dataSource = new MariaDbDataSource(container.getJdbcUrl()); + dataSource.setUserName(container.getUsername()); + dataSource.setPassword(container.getPassword()); return dataSource; } @@ -76,4 +83,20 @@ public class MariaDB5JdbcOperationsSessionRepositoryITests } + private static class MariaDb5Container extends MariaDBContainer { + + MariaDb5Container() { + super("mariadb:5.5.59"); + } + + @Override + protected void configure() { + super.configure(); + setCommand("mysqld", "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_unicode_ci", "--innodb_large_prefix", + "--innodb_file_format=barracuda", "--innodb-file-per-table"); + } + + } + } diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySQL5JdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySql5JdbcOperationsSessionRepositoryITests.java similarity index 74% rename from spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySQL5JdbcOperationsSessionRepositoryITests.java rename to spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySql5JdbcOperationsSessionRepositoryITests.java index a930da07..d5e5b953 100644 --- a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySQL5JdbcOperationsSessionRepositoryITests.java +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySql5JdbcOperationsSessionRepositoryITests.java @@ -19,7 +19,8 @@ package org.springframework.session.jdbc; import javax.sql.DataSource; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.testcontainers.containers.MySQLContainer; @@ -40,13 +41,20 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @WebAppConfiguration @ContextConfiguration -public class MySQL5JdbcOperationsSessionRepositoryITests +public class MySql5JdbcOperationsSessionRepositoryITests extends AbstractJdbcOperationsSessionRepositoryITests { - private static final String DOCKER_IMAGE = "mysql:5.7.21"; + private static MySQLContainer container = new MySql5Container(); - @ClassRule - public static MySQLContainer mySQLContainer = new MySQLContainer(DOCKER_IMAGE); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } @Configuration static class Config extends BaseConfig { @@ -54,9 +62,9 @@ public class MySQL5JdbcOperationsSessionRepositoryITests @Bean public DataSource dataSource() { MysqlDataSource dataSource = new MysqlDataSource(); - dataSource.setUrl(mySQLContainer.getJdbcUrl()); - dataSource.setUser(mySQLContainer.getUsername()); - dataSource.setPassword(mySQLContainer.getPassword()); + dataSource.setUrl(container.getJdbcUrl()); + dataSource.setUser(container.getUsername()); + dataSource.setPassword(container.getPassword()); return dataSource; } @@ -73,4 +81,19 @@ public class MySQL5JdbcOperationsSessionRepositoryITests } + private static class MySql5Container extends MySQLContainer { + + MySql5Container() { + super("mysql:5.7.22"); + } + + @Override + protected void configure() { + super.configure(); + setCommand("mysqld", "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_unicode_ci"); + } + + } + } diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySql8JdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySql8JdbcOperationsSessionRepositoryITests.java new file mode 100644 index 00000000..302e7400 --- /dev/null +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/MySql8JdbcOperationsSessionRepositoryITests.java @@ -0,0 +1,101 @@ +/* + * Copyright 2014-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.session.jdbc; + +import javax.sql.DataSource; + +import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.runner.RunWith; +import org.testcontainers.containers.MySQLContainer; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ResourceLoader; +import org.springframework.jdbc.datasource.init.DataSourceInitializer; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +/** + * Integration tests for {@link JdbcOperationsSessionRepository} using MySQL 8.x database. + * + * @author Vedran Pavic + */ +@Ignore +@RunWith(SpringRunner.class) +@WebAppConfiguration +@ContextConfiguration +public class MySql8JdbcOperationsSessionRepositoryITests + extends AbstractJdbcOperationsSessionRepositoryITests { + + private static MySQLContainer container = new MySql8Container(); + + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } + + @Configuration + static class Config extends BaseConfig { + + @Bean + public DataSource dataSource() { + MysqlDataSource dataSource = new MysqlDataSource(); + dataSource.setUrl(container.getJdbcUrl()); + dataSource.setUser(container.getUsername()); + dataSource.setPassword(container.getPassword()); + return dataSource; + } + + @Bean + public DataSourceInitializer initializer(DataSource dataSource, + ResourceLoader resourceLoader) { + DataSourceInitializer initializer = new DataSourceInitializer(); + initializer.setDataSource(dataSource); + initializer.setDatabasePopulator( + new ResourceDatabasePopulator(resourceLoader.getResource( + "classpath:org/springframework/session/jdbc/schema-mysql.sql"))); + return initializer; + } + + } + + private static class MySql8Container extends MySQLContainer { + + MySql8Container() { + super("mysql:8.0.11"); + } + + @Override + protected void configure() { + super.configure(); + setCommand("mysqld", "--character-set-server=utf8mb4", + "--collation-server=utf8mb4_unicode_ci"); + } + + } + +} diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSQL10JdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSql10JdbcOperationsSessionRepositoryITests.java similarity index 77% rename from spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSQL10JdbcOperationsSessionRepositoryITests.java rename to spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSql10JdbcOperationsSessionRepositoryITests.java index 21c7597b..494b89d4 100644 --- a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSQL10JdbcOperationsSessionRepositoryITests.java +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSql10JdbcOperationsSessionRepositoryITests.java @@ -18,7 +18,8 @@ package org.springframework.session.jdbc; import javax.sql.DataSource; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.postgresql.ds.PGSimpleDataSource; import org.testcontainers.containers.PostgreSQLContainer; @@ -41,14 +42,20 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @WebAppConfiguration @ContextConfiguration -public class PostgreSQL10JdbcOperationsSessionRepositoryITests +public class PostgreSql10JdbcOperationsSessionRepositoryITests extends AbstractJdbcOperationsSessionRepositoryITests { - private static final String DOCKER_IMAGE = "postgres:10.2"; + private static PostgreSQLContainer container = new PostgreSql10Container(); - @ClassRule - public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer( - DOCKER_IMAGE); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } @Configuration static class Config extends BaseConfig { @@ -56,9 +63,9 @@ public class PostgreSQL10JdbcOperationsSessionRepositoryITests @Bean public DataSource dataSource() { PGSimpleDataSource dataSource = new PGSimpleDataSource(); - dataSource.setUrl(postgreSQLContainer.getJdbcUrl()); - dataSource.setUser(postgreSQLContainer.getUsername()); - dataSource.setPassword(postgreSQLContainer.getPassword()); + dataSource.setUrl(container.getJdbcUrl()); + dataSource.setUser(container.getUsername()); + dataSource.setPassword(container.getPassword()); return dataSource; } @@ -75,4 +82,12 @@ public class PostgreSQL10JdbcOperationsSessionRepositoryITests } + private static class PostgreSql10Container extends PostgreSQLContainer { + + PostgreSql10Container() { + super("postgres:10.3"); + } + + } + } diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSQL9JdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSql9JdbcOperationsSessionRepositoryITests.java similarity index 77% rename from spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSQL9JdbcOperationsSessionRepositoryITests.java rename to spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSql9JdbcOperationsSessionRepositoryITests.java index a8aef1bb..f537d6e2 100644 --- a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSQL9JdbcOperationsSessionRepositoryITests.java +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/PostgreSql9JdbcOperationsSessionRepositoryITests.java @@ -18,7 +18,8 @@ package org.springframework.session.jdbc; import javax.sql.DataSource; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.postgresql.ds.PGSimpleDataSource; import org.testcontainers.containers.PostgreSQLContainer; @@ -41,14 +42,20 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @WebAppConfiguration @ContextConfiguration -public class PostgreSQL9JdbcOperationsSessionRepositoryITests +public class PostgreSql9JdbcOperationsSessionRepositoryITests extends AbstractJdbcOperationsSessionRepositoryITests { - private static final String DOCKER_IMAGE = "postgres:9.6.7"; + private static PostgreSQLContainer container = new PostgreSql9Container(); - @ClassRule - public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer( - DOCKER_IMAGE); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } @Configuration static class Config extends BaseConfig { @@ -56,9 +63,9 @@ public class PostgreSQL9JdbcOperationsSessionRepositoryITests @Bean public DataSource dataSource() { PGSimpleDataSource dataSource = new PGSimpleDataSource(); - dataSource.setUrl(postgreSQLContainer.getJdbcUrl()); - dataSource.setUser(postgreSQLContainer.getUsername()); - dataSource.setPassword(postgreSQLContainer.getPassword()); + dataSource.setUrl(container.getJdbcUrl()); + dataSource.setUser(container.getUsername()); + dataSource.setPassword(container.getPassword()); return dataSource; } @@ -75,4 +82,12 @@ public class PostgreSQL9JdbcOperationsSessionRepositoryITests } + private static class PostgreSql9Container extends PostgreSQLContainer { + + PostgreSql9Container() { + super("postgres:9.6.8"); + } + + } + } diff --git a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/SQLServerJdbcOperationsSessionRepositoryITests.java b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/SqlServerJdbcOperationsSessionRepositoryITests.java similarity index 82% rename from spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/SQLServerJdbcOperationsSessionRepositoryITests.java rename to spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/SqlServerJdbcOperationsSessionRepositoryITests.java index 17f15c8d..8a626ac2 100644 --- a/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/SQLServerJdbcOperationsSessionRepositoryITests.java +++ b/spring-session-jdbc/src/integration-test/java/org/springframework/session/jdbc/SqlServerJdbcOperationsSessionRepositoryITests.java @@ -19,7 +19,8 @@ package org.springframework.session.jdbc; import javax.sql.DataSource; import com.microsoft.sqlserver.jdbc.SQLServerDataSource; -import org.junit.ClassRule; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.runner.RunWith; import org.testcontainers.containers.MSSQLServerContainer; @@ -43,13 +44,20 @@ import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @WebAppConfiguration @ContextConfiguration -public class SQLServerJdbcOperationsSessionRepositoryITests +public class SqlServerJdbcOperationsSessionRepositoryITests extends AbstractJdbcOperationsSessionRepositoryITests { - private static final String DOCKER_IMAGE = "microsoft/mssql-server-linux:2017-CU3"; + private static MSSQLServerContainer container = new SqlServer2007Container(); - @ClassRule - public static MSSQLServerContainer container = new MSSQLServerContainer(DOCKER_IMAGE); + @BeforeClass + public static void setUpClass() { + container.start(); + } + + @AfterClass + public static void tearDownClass() { + container.stop(); + } @Configuration static class Config extends BaseConfig { @@ -76,4 +84,12 @@ public class SQLServerJdbcOperationsSessionRepositoryITests } + private static class SqlServer2007Container extends MSSQLServerContainer { + + SqlServer2007Container() { + super("microsoft/mssql-server-linux:2017-CU6"); + } + + } + } diff --git a/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-mysql.sql b/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-mysql.sql index 84f35fec..226fe4bb 100644 --- a/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-mysql.sql +++ b/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc/schema-mysql.sql @@ -7,7 +7,7 @@ CREATE TABLE SPRING_SESSION ( EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID) -) ENGINE=InnoDB; +) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID); CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME); @@ -19,6 +19,6 @@ CREATE TABLE SPRING_SESSION_ATTRIBUTES ( ATTRIBUTE_BYTES BLOB NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE -) ENGINE=InnoDB; +) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID);