@Test public void testEmptyPasswordWithNonRootUser() { MySQLContainer container = (MySQLContainer) new MySQLContainer("mysql:5.5").withDatabaseName("TEST") .withUsername("test").withPassword("").withEnv("MYSQL_ROOT_HOST", "%"); try { container.start(); fail("ContainerLaunchException expected to be thrown"); } catch (ContainerLaunchException e) { } finally { container.stop(); } }
@Override public String getJdbcUrl() { return "jdbc:mysql://" + getContainerIpAddress() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName; }
@Override protected void configure() { optionallyMapResourceParameterAsVolume(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", "mysql-default-conf"); addExposedPort(MYSQL_PORT); addEnv("MYSQL_DATABASE", databaseName); addEnv("MYSQL_USER", username); if (password != null && !password.isEmpty()) { addEnv("MYSQL_PASSWORD", password); addEnv("MYSQL_ROOT_PASSWORD", password); } else if (MYSQL_ROOT_USER.equalsIgnoreCase(username)) { addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes"); } else { throw new ContainerLaunchException("Empty password can be used only with the root user"); } setStartupAttempts(3); }
@Test public void testSimple() throws SQLException { MySQLContainer mysql = (MySQLContainer) new MySQLContainer() .withConfigurationOverride("somepath/mysql_conf_override") .withLogConsumer(new Slf4jLogConsumer(logger)); mysql.start(); try { ResultSet resultSet = performQuery(mysql, "SELECT 1"); int resultSetInt = resultSet.getInt(1); assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } finally { mysql.stop(); } }
@Test public void testCommandOverride() throws SQLException { MySQLContainer mysqlCustomConfig = (MySQLContainer) new MySQLContainer().withCommand("mysqld --auto_increment_increment=42"); mysqlCustomConfig.start(); try { ResultSet resultSet = performQuery(mysqlCustomConfig, "show variables like 'auto_increment_increment'"); String result = resultSet.getString("Value"); assertEquals("Auto increment increment should be overriden by command line", "42", result); } finally { mysqlCustomConfig.stop(); } }
@Test public void testExplicitInitScript() throws SQLException { try (MySQLContainer container = (MySQLContainer) new MySQLContainer() .withInitScript("somepath/init_mysql.sql") .withLogConsumer(new Slf4jLogConsumer(logger))) { container.start(); ResultSet resultSet = performQuery(container, "SELECT foo FROM bar"); String firstColumnValue = resultSet.getString(1); assertEquals("Value from init script should equal real value", "hello world", firstColumnValue); } }
@Override public SELF withDatabaseName(final String databaseName) { this.databaseName = databaseName; return self(); }
@NonNull protected ResultSet performQuery(MySQLContainer containerRule, String sql) throws SQLException { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName(containerRule.getDriverClassName()); hikariConfig.setJdbcUrl(containerRule.getJdbcUrl()); hikariConfig.setUsername(containerRule.getUsername()); hikariConfig.setPassword(containerRule.getPassword()); HikariDataSource ds = new HikariDataSource(hikariConfig); Statement statement = ds.getConnection().createStatement(); statement.execute(sql); ResultSet resultSet = statement.getResultSet(); resultSet.next(); return resultSet; } }
@NotNull @Override protected Set<Integer> getLivenessCheckPorts() { return new HashSet<>(getMappedPort(MYSQL_PORT)); }
@Override public JdbcDatabaseContainer newInstance(String tag) { if (tag != null) { return new MySQLContainer(MySQLContainer.IMAGE + ":" + tag); } else { return newInstance(); } }
@Test public void testSpecificVersion() throws SQLException { MySQLContainer mysqlOldVersion = (MySQLContainer) new MySQLContainer("mysql:5.5") .withConfigurationOverride("somepath/mysql_conf_override") .withLogConsumer(new Slf4jLogConsumer(logger)); mysqlOldVersion.start(); try { ResultSet resultSet = performQuery(mysqlOldVersion, "SELECT VERSION()"); String resultSetString = resultSet.getString(1); assertTrue("The database version can be set using a container rule parameter", resultSetString.startsWith("5.5")); } finally { mysqlOldVersion.stop(); } }
@Test public void testMySQL8() throws SQLException { assumeFalse(SystemUtils.IS_OS_WINDOWS); MySQLContainer container = new MySQLContainer<>("mysql:8.0.11") .withCommand("mysqld --default-authentication-plugin=mysql_native_password"); container.start(); try { ResultSet resultSet = performQuery(container, "SELECT VERSION()"); String resultSetString = resultSet.getString(1); assertTrue("The database version can be set using a container rule parameter", "8.0.11".equals(resultSetString)); } finally { container.stop(); } }
@Override public SELF withUsername(final String username) { this.username = username; return self(); }
@NotNull @Override protected Set<Integer> getLivenessCheckPorts() { return new HashSet<>(getMappedPort(MYSQL_PORT)); }
@Override public JdbcDatabaseContainer newInstance(String tag) { if (tag != null) { return new MySQLContainer(MySQLContainer.IMAGE + ":" + tag); } else { return newInstance(); } }
@Test public void testMySQLWithCustomIniFile() throws SQLException { assumeFalse(SystemUtils.IS_OS_WINDOWS); MySQLContainer mysqlCustomConfig = new MySQLContainer("mysql:5.6") .withConfigurationOverride("somepath/mysql_conf_override"); mysqlCustomConfig.start(); try { ResultSet resultSet = performQuery(mysqlCustomConfig, "SELECT @@GLOBAL.innodb_file_format"); String result = resultSet.getString(1); assertEquals("The InnoDB file format has been set by the ini file content", "Barracuda", result); } finally { mysqlCustomConfig.stop(); } }
@Test public void testSimple() throws SQLException { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl("jdbc:mysql://" + mysql.getContainerIpAddress() + ":" + mysql.getMappedPort(MySQLContainer.MYSQL_PORT) + "/" + DB_NAME); hikariConfig.setUsername(USER); hikariConfig.setPassword(PWD); HikariDataSource ds = new HikariDataSource(hikariConfig); Statement statement = ds.getConnection().createStatement(); statement.execute("SELECT 1"); ResultSet resultSet = statement.getResultSet(); assertEquals("There is a result", resultSet.next(), true); int resultSetInt = resultSet.getInt(1); assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } }
@Override protected void configure() { optionallyMapResourceParameterAsVolume(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", "mysql-default-conf"); addExposedPort(MYSQL_PORT); addEnv("MYSQL_DATABASE", databaseName); addEnv("MYSQL_USER", username); if (password != null && !password.isEmpty()) { addEnv("MYSQL_PASSWORD", password); addEnv("MYSQL_ROOT_PASSWORD", password); } else if (MYSQL_ROOT_USER.equalsIgnoreCase(username)) { addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes"); } else { throw new ContainerLaunchException("Empty password can be used only with the root user"); } setStartupAttempts(3); }
@Override public SELF withPassword(final String password) { this.password = password; return self(); } }
@Test public void testSimple() throws SQLException { HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setJdbcUrl("jdbc:mysql://" + mysql.getContainerIpAddress() + ":" + mysql.getMappedPort(MySQLContainer.MYSQL_PORT) + "/" + DB_NAME); hikariConfig.setUsername(USER); hikariConfig.setPassword(""); HikariDataSource ds = new HikariDataSource(hikariConfig); Statement statement = ds.getConnection().createStatement(); statement.execute("SELECT 1"); ResultSet resultSet = statement.getResultSet(); assertEquals("There is a result", resultSet.next(), true); int resultSetInt = resultSet.getInt(1); assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } }