Skip to content

Commit 68a9da5

Browse files
authored
Ensure readability of MySQL and MariaDB config override (#6625)
1 parent 3ca5e67 commit 68a9da5

File tree

5 files changed

+111
-11
lines changed

5 files changed

+111
-11
lines changed

modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import lombok.SneakyThrows;
66
import org.apache.commons.lang3.StringUtils;
77
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
89
import org.testcontainers.containers.traits.LinkableContainer;
910
import org.testcontainers.delegate.DatabaseDelegate;
1011
import org.testcontainers.ext.ScriptUtils;
@@ -300,15 +301,25 @@ protected String constructUrlParameters(String startCharacter, String delimiter,
300301
return urlParameters;
301302
}
302303

304+
@Deprecated
303305
protected void optionallyMapResourceParameterAsVolume(
304306
@NotNull String paramName,
305307
@NotNull String pathNameInContainer,
306308
@NotNull String defaultResource
309+
) {
310+
optionallyMapResourceParameterAsVolume(paramName, pathNameInContainer, defaultResource, null);
311+
}
312+
313+
protected void optionallyMapResourceParameterAsVolume(
314+
@NotNull String paramName,
315+
@NotNull String pathNameInContainer,
316+
@NotNull String defaultResource,
317+
@Nullable Integer fileMode
307318
) {
308319
String resourceName = parameters.getOrDefault(paramName, defaultResource);
309320

310321
if (resourceName != null) {
311-
final MountableFile mountableFile = MountableFile.forClasspathResource(resourceName);
322+
final MountableFile mountableFile = MountableFile.forClasspathResource(resourceName, fileMode);
312323
withCopyFileToContainer(mountableFile, pathNameInContainer);
313324
}
314325
}

modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.testcontainers.containers;
22

33
import com.google.common.collect.Sets;
4+
import org.testcontainers.images.builder.Transferable;
45
import org.testcontainers.utility.DockerImageName;
56

67
import java.util.Set;
@@ -65,7 +66,8 @@ protected void configure() {
6566
optionallyMapResourceParameterAsVolume(
6667
MY_CNF_CONFIG_OVERRIDE_PARAM_NAME,
6768
"/etc/mysql/conf.d",
68-
"mariadb-default-conf"
69+
"mariadb-default-conf",
70+
Transferable.DEFAULT_DIR_MODE
6971
);
7072

7173
addEnv("MYSQL_DATABASE", databaseName);

modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,19 @@
66
import org.testcontainers.containers.MariaDBContainer;
77
import org.testcontainers.db.AbstractContainerDatabaseTest;
88

9+
import java.io.File;
10+
import java.net.URL;
11+
import java.nio.file.FileSystems;
12+
import java.nio.file.Files;
13+
import java.nio.file.attribute.PosixFilePermission;
914
import java.sql.ResultSet;
1015
import java.sql.SQLException;
16+
import java.util.Arrays;
17+
import java.util.HashSet;
18+
import java.util.Set;
1119

1220
import static org.assertj.core.api.Assertions.assertThat;
21+
import static org.assertj.core.api.Assumptions.assumeThat;
1322
import static org.junit.Assume.assumeFalse;
1423

1524
public class SimpleMariaDBTest extends AbstractContainerDatabaseTest {
@@ -56,10 +65,7 @@ public void testMariaDBWithCustomIniFile() throws SQLException {
5665
) {
5766
mariadbCustomConfig.start();
5867

59-
ResultSet resultSet = performQuery(mariadbCustomConfig, "SELECT @@GLOBAL.innodb_file_format");
60-
String result = resultSet.getString(1);
61-
62-
assertThat(result).as("The InnoDB file format has been set by the ini file content").isEqualTo("Barracuda");
68+
assertThatCustomIniFileWasUsed(mariadbCustomConfig);
6369
}
6470
}
6571

@@ -94,4 +100,42 @@ public void testWithAdditionalUrlParamInJdbcUrl() {
94100
mariaDBContainer.stop();
95101
}
96102
}
103+
104+
@Test
105+
public void testWithOnlyUserReadableCustomIniFile() throws Exception {
106+
assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue();
107+
108+
try (
109+
MariaDBContainer<?> mariadbCustomConfig = new MariaDBContainer<>(
110+
MariaDBTestImages.MARIADB_IMAGE.withTag("10.1.16")
111+
)
112+
.withConfigurationOverride("somepath/mariadb_conf_override")
113+
) {
114+
URL resource = this.getClass().getClassLoader().getResource("somepath/mariadb_conf_override");
115+
116+
File file = new File(resource.toURI());
117+
assertThat(file.isDirectory()).isTrue();
118+
119+
Set<PosixFilePermission> permissions = new HashSet<>(
120+
Arrays.asList(
121+
PosixFilePermission.OWNER_READ,
122+
PosixFilePermission.OWNER_WRITE,
123+
PosixFilePermission.OWNER_EXECUTE
124+
)
125+
);
126+
127+
Files.setPosixFilePermissions(file.toPath(), permissions);
128+
129+
mariadbCustomConfig.start();
130+
131+
assertThatCustomIniFileWasUsed(mariadbCustomConfig);
132+
}
133+
}
134+
135+
private void assertThatCustomIniFileWasUsed(MariaDBContainer<?> mariadb) throws SQLException {
136+
try (ResultSet resultSet = performQuery(mariadb, "SELECT @@GLOBAL.innodb_file_format")) {
137+
String result = resultSet.getString(1);
138+
assertThat(result).as("The InnoDB file format has been set by the ini file content").isEqualTo("Barracuda");
139+
}
140+
}
97141
}

modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.testcontainers.containers;
22

33
import org.jetbrains.annotations.NotNull;
4+
import org.testcontainers.images.builder.Transferable;
45
import org.testcontainers.utility.DockerImageName;
56

67
import java.util.Set;
@@ -68,7 +69,8 @@ protected void configure() {
6869
optionallyMapResourceParameterAsVolume(
6970
MY_CNF_CONFIG_OVERRIDE_PARAM_NAME,
7071
"/etc/mysql/conf.d",
71-
"mysql-default-conf"
72+
"mysql-default-conf",
73+
Transferable.DEFAULT_DIR_MODE
7274
);
7375

7476
addEnv("MYSQL_DATABASE", databaseName);

modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
import org.testcontainers.containers.output.Slf4jLogConsumer;
1010
import org.testcontainers.db.AbstractContainerDatabaseTest;
1111

12+
import java.io.File;
13+
import java.net.URL;
14+
import java.nio.file.FileSystems;
15+
import java.nio.file.Files;
16+
import java.nio.file.attribute.PosixFilePermission;
1217
import java.sql.Connection;
1318
import java.sql.ResultSet;
1419
import java.sql.SQLException;
@@ -17,9 +22,13 @@
1722
import java.time.ZoneId;
1823
import java.time.ZonedDateTime;
1924
import java.time.temporal.ChronoUnit;
25+
import java.util.Arrays;
26+
import java.util.HashSet;
27+
import java.util.Set;
2028

2129
import static org.assertj.core.api.Assertions.assertThat;
2230
import static org.assertj.core.api.Assertions.fail;
31+
import static org.assertj.core.api.Assumptions.assumeThat;
2332

2433
public class SimpleMySQLTest extends AbstractContainerDatabaseTest {
2534

@@ -84,10 +93,7 @@ public void testMySQLWithCustomIniFile() throws SQLException {
8493
) {
8594
mysqlCustomConfig.start();
8695

87-
ResultSet resultSet = performQuery(mysqlCustomConfig, "SELECT @@GLOBAL.innodb_file_format");
88-
String result = resultSet.getString(1);
89-
90-
assertThat(result).as("The InnoDB file format has been set by the ini file content").isEqualTo("Barracuda");
96+
assertThatCustomIniFileWasUsed(mysqlCustomConfig);
9197
}
9298
}
9399

@@ -234,8 +240,43 @@ public void testWithAdditionalUrlParamInJdbcUrl() {
234240
}
235241
}
236242

243+
@Test
244+
public void testWithOnlyUserReadableCustomIniFile() throws Exception {
245+
assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue();
246+
try (
247+
MySQLContainer<?> mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_56_IMAGE)
248+
.withConfigurationOverride("somepath/mysql_conf_override")
249+
.withLogConsumer(new Slf4jLogConsumer(logger))
250+
) {
251+
URL resource = this.getClass().getClassLoader().getResource("somepath/mysql_conf_override");
252+
253+
File file = new File(resource.toURI());
254+
assertThat(file.isDirectory()).isTrue();
255+
256+
Set<PosixFilePermission> permissions = new HashSet<>(
257+
Arrays.asList(
258+
PosixFilePermission.OWNER_READ,
259+
PosixFilePermission.OWNER_WRITE,
260+
PosixFilePermission.OWNER_EXECUTE
261+
)
262+
);
263+
264+
Files.setPosixFilePermissions(file.toPath(), permissions);
265+
266+
mysql.start();
267+
assertThatCustomIniFileWasUsed(mysql);
268+
}
269+
}
270+
237271
private void assertHasCorrectExposedAndLivenessCheckPorts(MySQLContainer<?> mysql) {
238272
assertThat(mysql.getExposedPorts()).containsExactly(MySQLContainer.MYSQL_PORT);
239273
assertThat(mysql.getLivenessCheckPortNumbers()).containsExactly(mysql.getMappedPort(MySQLContainer.MYSQL_PORT));
240274
}
275+
276+
private void assertThatCustomIniFileWasUsed(MySQLContainer<?> mysql) throws SQLException {
277+
try (ResultSet resultSet = performQuery(mysql, "SELECT @@GLOBAL.innodb_file_format")) {
278+
String result = resultSet.getString(1);
279+
assertThat(result).as("The InnoDB file format has been set by the ini file content").isEqualTo("Barracuda");
280+
}
281+
}
241282
}

0 commit comments

Comments
 (0)