package org.testcontainers.containers;
import org.testcontainers.containers.wait.LogMessageWaitStrategy;
import java.time.Duration;
import static java.time.temporal.ChronoUnit.SECONDS;
/**
* @author richardnorth
*/
public class PostgreSQLContainer<SELF extends PostgreSQLContainer<SELF>> extends JdbcDatabaseContainer<SELF> {
static final String NAME = "postgresql";
static final String IMAGE = "postgres";
public static final Integer POSTGRESQL_PORT = 5432;
private String databaseName = "test";
private String username = "test";
private String password = "test";
public PostgreSQLContainer() {
this(IMAGE + ":latest");
}
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));
}
@Override
protected Integer getLivenessCheckPort() {
return getMappedPort(POSTGRESQL_PORT);
}
@Override
protected void configure() {
addExposedPort(POSTGRESQL_PORT);
addEnv("POSTGRES_DB", databaseName);
addEnv("POSTGRES_USER", username);
addEnv("POSTGRES_PASSWORD", password);
setCommand("postgres");
}
@Override
public String getDriverClassName() {
return "org.postgresql.Driver";
}
@Override
public String getJdbcUrl() {
return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT) + "/" + databaseName;
}
@Override
public String getUsername() {
return username;
}
@Override
public String getPassword() {
return password;
}
@Override
public String getTestQueryString() {
return "SELECT 1";
}
public SELF withDatabaseName(final String databaseName) {
this.databaseName = databaseName;
return self();
}
public SELF withUsername(final String username) {
this.username = username;
return self();
}
public SELF withPassword(final String password) {
this.password = password;
return self();
}
@Override
protected void waitUntilContainerStarted() {
getWaitStrategy().waitUntilReady(this);
}
}