Skip to content

Commit 545417c

Browse files
committed
Add CockroachDB container implementation under org.testcontainers.cockroachdb
1 parent 06ad992 commit 545417c

File tree

4 files changed

+164
-4
lines changed

4 files changed

+164
-4
lines changed

docs/modules/databases/cockroachdb.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Testcontainers module for [CockroachDB](https://hub.docker.com/r/cockroachdb/coc
77
You can start a CockroachDB container instance from any Java application by using:
88

99
<!--codeinclude-->
10-
[Container definition](../../../modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java) inside_block:container
10+
[Container definition](../../../modules/cockroachdb/src/test/java/org/testcontainers/cockroachdb/CockroachContainerTest.java) inside_block:container
1111
<!--/codeinclude-->
1212

1313
See [Database containers](./index.md) for documentation and usage that is common to all relational database container types.
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package org.testcontainers.cockroachdb;
2+
3+
import org.testcontainers.containers.JdbcDatabaseContainer;
4+
import org.testcontainers.containers.wait.strategy.Wait;
5+
import org.testcontainers.containers.wait.strategy.WaitAllStrategy;
6+
import org.testcontainers.utility.ComparableVersion;
7+
import org.testcontainers.utility.DockerImageName;
8+
9+
import java.time.Duration;
10+
11+
/**
12+
* Testcontainers implementation for CockroachDB.
13+
* <p>
14+
* Supported image: {@code cockroachdb/cockroach}
15+
* <p>
16+
* Exposed ports:
17+
* <ul>
18+
* <li>Database: 26257</li>
19+
* <li>Console: 8080</li>
20+
* </ul>
21+
*/
22+
public class CockroachContainer extends JdbcDatabaseContainer<CockroachContainer> {
23+
24+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("cockroachdb/cockroach");
25+
26+
public static final String NAME = "cockroach";
27+
28+
private static final String JDBC_DRIVER_CLASS_NAME = "org.postgresql.Driver";
29+
30+
private static final String JDBC_URL_PREFIX = "jdbc:postgresql";
31+
32+
private static final String TEST_QUERY_STRING = "SELECT 1";
33+
34+
private static final int REST_API_PORT = 8080;
35+
36+
private static final int DB_PORT = 26257;
37+
38+
private static final String FIRST_VERSION_WITH_ENV_VARS_SUPPORT = "22.1.0";
39+
40+
private String databaseName = "postgres";
41+
42+
private String username = "root";
43+
44+
private String password = "";
45+
46+
private boolean isVersionGreaterThanOrEqualTo221;
47+
48+
public CockroachContainer(final String dockerImageName) {
49+
this(DockerImageName.parse(dockerImageName));
50+
}
51+
52+
public CockroachContainer(final DockerImageName dockerImageName) {
53+
super(dockerImageName);
54+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
55+
this.isVersionGreaterThanOrEqualTo221 = isVersionGreaterThanOrEqualTo221(dockerImageName);
56+
57+
WaitAllStrategy waitStrategy = new WaitAllStrategy();
58+
waitStrategy.withStrategy(
59+
Wait.forHttp("/health").forPort(REST_API_PORT).forStatusCode(200).withStartupTimeout(Duration.ofMinutes(1))
60+
);
61+
if (this.isVersionGreaterThanOrEqualTo221) {
62+
waitStrategy.withStrategy(Wait.forSuccessfulCommand("[ -f ./init_success ] || { exit 1; }"));
63+
}
64+
65+
withExposedPorts(REST_API_PORT, DB_PORT);
66+
waitingFor(waitStrategy);
67+
withCommand("start-single-node --insecure");
68+
}
69+
70+
@Override
71+
protected void configure() {
72+
withEnv("COCKROACH_USER", this.username);
73+
withEnv("COCKROACH_PASSWORD", this.password);
74+
if (this.password != null && !this.password.isEmpty()) {
75+
withCommand("start-single-node");
76+
}
77+
withEnv("COCKROACH_DATABASE", this.databaseName);
78+
}
79+
80+
@Override
81+
public String getDriverClassName() {
82+
return JDBC_DRIVER_CLASS_NAME;
83+
}
84+
85+
@Override
86+
public String getJdbcUrl() {
87+
String additionalUrlParams = constructUrlParameters("?", "&");
88+
return (
89+
JDBC_URL_PREFIX +
90+
"://" +
91+
getHost() +
92+
":" +
93+
getMappedPort(DB_PORT) +
94+
"/" +
95+
databaseName +
96+
additionalUrlParams
97+
);
98+
}
99+
100+
@Override
101+
public final String getDatabaseName() {
102+
return databaseName;
103+
}
104+
105+
@Override
106+
public String getUsername() {
107+
return username;
108+
}
109+
110+
@Override
111+
public String getPassword() {
112+
return password;
113+
}
114+
115+
@Override
116+
public String getTestQueryString() {
117+
return TEST_QUERY_STRING;
118+
}
119+
120+
@Override
121+
public CockroachContainer withUsername(String username) {
122+
validateIfVersionSupportsUsernameOrPasswordOrDatabase("username");
123+
this.username = username;
124+
return this;
125+
}
126+
127+
@Override
128+
public CockroachContainer withPassword(String password) {
129+
validateIfVersionSupportsUsernameOrPasswordOrDatabase("password");
130+
this.password = password;
131+
return this;
132+
}
133+
134+
@Override
135+
public CockroachContainer withDatabaseName(final String databaseName) {
136+
validateIfVersionSupportsUsernameOrPasswordOrDatabase("databaseName");
137+
this.databaseName = databaseName;
138+
return this;
139+
}
140+
141+
private boolean isVersionGreaterThanOrEqualTo221(DockerImageName dockerImageName) {
142+
ComparableVersion version = new ComparableVersion(dockerImageName.getVersionPart().replaceFirst("v", ""));
143+
return version.isGreaterThanOrEqualTo(FIRST_VERSION_WITH_ENV_VARS_SUPPORT);
144+
}
145+
146+
private void validateIfVersionSupportsUsernameOrPasswordOrDatabase(String parameter) {
147+
if (!isVersionGreaterThanOrEqualTo221) {
148+
throw new UnsupportedOperationException(
149+
String.format("Setting a %s in not supported in the versions below 22.1.0", parameter)
150+
);
151+
}
152+
}
153+
154+
@Override
155+
protected void waitUntilContainerStarted() {
156+
getWaitStrategy().waitUntilReady(this);
157+
}
158+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
* <li>Database: 26257</li>
1818
* <li>Console: 8080</li>
1919
* </ul>
20+
*
21+
* @deprecated use {@link org.testcontainers.cockroachdb.CockroachContainer} instead
2022
*/
23+
@Deprecated
2124
public class CockroachContainer extends JdbcDatabaseContainer<CockroachContainer> {
2225

2326
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("cockroachdb/cockroach");

modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java renamed to modules/cockroachdb/src/test/java/org/testcontainers/cockroachdb/CockroachContainerTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
package org.testcontainers.junit.cockroachdb;
1+
package org.testcontainers.cockroachdb;
22

33
import org.junit.jupiter.api.Test;
44
import org.testcontainers.CockroachDBTestImages;
5-
import org.testcontainers.containers.CockroachContainer;
65
import org.testcontainers.db.AbstractContainerDatabaseTest;
76
import org.testcontainers.images.builder.Transferable;
87

@@ -14,7 +13,7 @@
1413
import static org.assertj.core.api.Assertions.assertThat;
1514
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1615

17-
class SimpleCockroachDBTest extends AbstractContainerDatabaseTest {
16+
class CockroachContainerTest extends AbstractContainerDatabaseTest {
1817
static {
1918
// Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing
2019
LogManager.getLogManager().getLogger("").setLevel(Level.OFF);

0 commit comments

Comments
 (0)