-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
PostgreSQLContainer.java
119 lines (94 loc) · 3.19 KB
/
PostgreSQLContainer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package org.testcontainers.containers;
import org.jetbrains.annotations.NotNull;
import org.testcontainers.containers.wait.LogMessageWaitStrategy;
import java.time.Duration;
import java.util.HashSet;
import java.util.Set;
import static java.lang.String.format;
import static java.time.temporal.ChronoUnit.SECONDS;
/**
* @author richardnorth
*/
public class PostgreSQLContainer<SELF extends PostgreSQLContainer<SELF>> extends JdbcDatabaseContainer<SELF> {
public static final String NAME = "postgresql";
public static final String IMAGE = "postgres";
public static final String DEFAULT_TAG = "9.6.12";
public static final Integer POSTGRESQL_PORT = 5432;
static final String DEFAULT_USER = "test";
static final String DEFAULT_PASSWORD = "test";
private String databaseName = "test";
private String username = "test";
private String password = "test";
private static final String FSYNC_OFF_OPTION = "fsync=off";
private static final String QUERY_PARAM_SEPARATOR = "&";
public PostgreSQLContainer() {
this(IMAGE + ":" + DEFAULT_TAG);
}
public PostgreSQLContainer(final String dockerImageName) {
super(dockerImageName);
this.waitStrategy = new LogMessageWaitStrategy()
.withRegEx(".*database system is ready to accept connections.*\\s")
.withTimes(2)
.withStartupTimeout(Duration.of(60, SECONDS));
this.setCommand("postgres", "-c", FSYNC_OFF_OPTION);
addExposedPort(POSTGRESQL_PORT);
}
@NotNull
@Override
protected Set<Integer> getLivenessCheckPorts() {
return new HashSet<>(getMappedPort(POSTGRESQL_PORT));
}
@Override
protected void configure() {
// Disable Postgres driver use of java.util.logging to reduce noise at startup time
withUrlParam("loggerLevel", "OFF");
addEnv("POSTGRES_DB", databaseName);
addEnv("POSTGRES_USER", username);
addEnv("POSTGRES_PASSWORD", password);
}
@Override
public String getDriverClassName() {
return "org.postgresql.Driver";
}
@Override
public String getJdbcUrl() {
String additionalUrlParams = constructUrlParameters("?", "&");
return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT)
+ "/" + databaseName + additionalUrlParams;
}
@Override
public String getDatabaseName() {
return databaseName;
}
@Override
public String getUsername() {
return username;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getTestQueryString() {
return "SELECT 1";
}
@Override
public SELF withDatabaseName(final String databaseName) {
this.databaseName = databaseName;
return self();
}
@Override
public SELF withUsername(final String username) {
this.username = username;
return self();
}
@Override
public SELF withPassword(final String password) {
this.password = password;
return self();
}
@Override
protected void waitUntilContainerStarted() {
getWaitStrategy().waitUntilReady(this);
}
}