Skip to content

Commit 343c5a5

Browse files
authored
[CockroachDB] Support setting username/password/database (#6448)
1 parent 97ef800 commit 343c5a5

File tree

3 files changed

+83
-14
lines changed

3 files changed

+83
-14
lines changed

modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java

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

33
import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
4+
import org.testcontainers.utility.ComparableVersion;
45
import org.testcontainers.utility.DockerImageName;
56

67
import java.time.Duration;
@@ -29,12 +30,16 @@ public class CockroachContainer extends JdbcDatabaseContainer<CockroachContainer
2930

3031
private static final int DB_PORT = 26257;
3132

33+
private static final String FIRST_VERSION_WITH_ENV_VARS_SUPPORT = "22.1.0";
34+
3235
private String databaseName = "postgres";
3336

3437
private String username = "root";
3538

3639
private String password = "";
3740

41+
private boolean isVersionGreaterThanOrEqualTo221;
42+
3843
/**
3944
* @deprecated use {@link CockroachContainer(DockerImageName)} instead
4045
*/
@@ -50,6 +55,7 @@ public CockroachContainer(final String dockerImageName) {
5055
public CockroachContainer(final DockerImageName dockerImageName) {
5156
super(dockerImageName);
5257
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
58+
isVersionGreaterThanOrEqualTo221 = isVersionGreaterThanOrEqualTo221(dockerImageName);
5359

5460
withExposedPorts(REST_API_PORT, DB_PORT);
5561
waitingFor(
@@ -104,22 +110,35 @@ public String getTestQueryString() {
104110

105111
@Override
106112
public CockroachContainer withUsername(String username) {
107-
throw new UnsupportedOperationException(
108-
"The CockroachDB docker image does not currently support this - please see https://github.com/cockroachdb/cockroach/issues/19826"
109-
);
113+
validateIfVersionSupportsUsernameOrPasswordOrDatabase("username");
114+
this.username = username;
115+
return withEnv("COCKROACH_USER", username);
110116
}
111117

112118
@Override
113119
public CockroachContainer withPassword(String password) {
114-
throw new UnsupportedOperationException(
115-
"The CockroachDB docker image does not currently support this - please see https://github.com/cockroachdb/cockroach/issues/19826"
116-
);
120+
validateIfVersionSupportsUsernameOrPasswordOrDatabase("password");
121+
this.password = password;
122+
return withEnv("COCKROACH_PASSWORD", password).withCommand("start-single-node");
117123
}
118124

119125
@Override
120126
public CockroachContainer withDatabaseName(final String databaseName) {
121-
throw new UnsupportedOperationException(
122-
"The CockroachDB docker image does not currently support this - please see https://github.com/cockroachdb/cockroach/issues/19826"
123-
);
127+
validateIfVersionSupportsUsernameOrPasswordOrDatabase("databaseName");
128+
this.databaseName = databaseName;
129+
return withEnv("COCKROACH_DATABASE", databaseName);
130+
}
131+
132+
private boolean isVersionGreaterThanOrEqualTo221(DockerImageName dockerImageName) {
133+
ComparableVersion version = new ComparableVersion(dockerImageName.getVersionPart().replaceFirst("v", ""));
134+
return version.isGreaterThanOrEqualTo(FIRST_VERSION_WITH_ENV_VARS_SUPPORT);
135+
}
136+
137+
private void validateIfVersionSupportsUsernameOrPasswordOrDatabase(String parameter) {
138+
if (!isVersionGreaterThanOrEqualTo221) {
139+
throw new UnsupportedOperationException(
140+
String.format("Setting a %s in not supported in the versions below 22.1.0", parameter)
141+
);
142+
}
124143
}
125144
}

modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,12 @@
33
import org.testcontainers.utility.DockerImageName;
44

55
public interface CockroachDBTestImages {
6-
DockerImageName COCKROACHDB_IMAGE = DockerImageName.parse("cockroachdb/cockroach:v19.2.11");
6+
DockerImageName COCKROACHDB_IMAGE = DockerImageName.parse("cockroachdb/cockroach:v22.2.3");
7+
DockerImageName FIRST_COCKROACHDB_IMAGE_WITH_ENV_VARS_SUPPORT = DockerImageName.parse(
8+
"cockroachdb/cockroach:v22.1.0"
9+
);
10+
11+
DockerImageName COCKROACHDB_IMAGE_WITH_ENV_VARS_UNSUPPORTED = DockerImageName.parse(
12+
"cockroachdb/cockroach:v21.2.17"
13+
);
714
}

modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.logging.LogManager;
1212

1313
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1415

1516
public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest {
1617
static {
@@ -54,12 +55,54 @@ public void testWithAdditionalUrlParamInJdbcUrl() {
5455
try {
5556
cockroach.start();
5657
String jdbcUrl = cockroach.getJdbcUrl();
57-
assertThat(jdbcUrl).contains("?");
58-
assertThat(jdbcUrl).contains("&");
59-
assertThat(jdbcUrl).contains("sslmode=disable");
60-
assertThat(jdbcUrl).contains("application_name=cockroach");
58+
assertThat(jdbcUrl)
59+
.contains("?")
60+
.contains("&")
61+
.contains("sslmode=disable")
62+
.contains("application_name=cockroach");
6163
} finally {
6264
cockroach.stop();
6365
}
6466
}
67+
68+
@Test
69+
public void testWithUsernamePasswordDatabase() throws SQLException {
70+
try (
71+
CockroachContainer cockroach = new CockroachContainer(
72+
CockroachDBTestImages.FIRST_COCKROACHDB_IMAGE_WITH_ENV_VARS_SUPPORT
73+
)
74+
.withUsername("test_user")
75+
.withPassword("test_password")
76+
.withDatabaseName("test_database")
77+
) {
78+
cockroach.start();
79+
80+
ResultSet resultSet = performQuery(cockroach, "SELECT 1");
81+
82+
int resultSetInt = resultSet.getInt(1);
83+
assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1);
84+
85+
String jdbcUrl = cockroach.getJdbcUrl();
86+
assertThat(jdbcUrl).contains("/" + "test_database");
87+
}
88+
}
89+
90+
@Test
91+
public void testAnExceptionIsThrownWhenImageDoesNotSupportEnvVars() {
92+
CockroachContainer cockroachContainer = new CockroachContainer(
93+
CockroachDBTestImages.COCKROACHDB_IMAGE_WITH_ENV_VARS_UNSUPPORTED
94+
);
95+
96+
assertThatThrownBy(() -> cockroachContainer.withUsername("test_user"))
97+
.isInstanceOf(UnsupportedOperationException.class)
98+
.withFailMessage("Setting a username in not supported in the versions below 22.1.0");
99+
100+
assertThatThrownBy(() -> cockroachContainer.withPassword("test_password"))
101+
.isInstanceOf(UnsupportedOperationException.class)
102+
.withFailMessage("Setting a password in not supported in the versions below 22.1.0");
103+
104+
assertThatThrownBy(() -> cockroachContainer.withDatabaseName("test_database"))
105+
.isInstanceOf(UnsupportedOperationException.class)
106+
.withFailMessage("Setting a databaseName in not supported in the versions below 22.1.0");
107+
}
65108
}

0 commit comments

Comments
 (0)