Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Consumer;
import java.util.stream.Stream;

import static java.nio.file.StandardOpenOption.CREATE;
Expand Down Expand Up @@ -115,14 +116,14 @@ public class EmbeddedPostgres implements Closeable
PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector, ProcessBuilder.Redirect outputRedirector) throws IOException
{
this(parentDirectory, dataDirectory, cleanDataDirectory, postgresConfig, localeConfig, port, connectConfig,
pgBinaryResolver, errorRedirector, outputRedirector, DEFAULT_PG_STARTUP_WAIT, null);
pgBinaryResolver, errorRedirector, outputRedirector, DEFAULT_PG_STARTUP_WAIT, null, null);
}

EmbeddedPostgres(File parentDirectory, File dataDirectory, boolean cleanDataDirectory,
Map<String, String> postgresConfig, Map<String, String> localeConfig, int port, Map<String, String> connectConfig,
PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector,
ProcessBuilder.Redirect outputRedirector, Duration pgStartupWait,
File overrideWorkingDirectory) throws IOException
File overrideWorkingDirectory, Consumer<File> dataDirectoryCustomizer) throws IOException
{
this.cleanDataDirectory = cleanDataDirectory;
this.postgresConfig = new HashMap<>(postgresConfig);
Expand Down Expand Up @@ -159,9 +160,14 @@ public class EmbeddedPostgres implements Closeable
}

lock();

if (dataDirectoryCustomizer != null) {
dataDirectoryCustomizer.accept(dataDirectory);
}

this.process = startPostmaster();
}

public Process getProcess() {
return this.process;
}
Expand Down Expand Up @@ -501,6 +507,7 @@ public static class Builder
private final Map<String, String> connectConfig = new HashMap<>();
private PgBinaryResolver pgBinaryResolver = DefaultPostgresBinaryResolver.INSTANCE;
private Duration pgStartupWait = DEFAULT_PG_STARTUP_WAIT;
private Consumer<File> dataDirectoryCustomizer;

private ProcessBuilder.Redirect errRedirector = ProcessBuilder.Redirect.PIPE;
private ProcessBuilder.Redirect outRedirector = ProcessBuilder.Redirect.PIPE;
Expand Down Expand Up @@ -579,6 +586,11 @@ public Builder setPgBinaryResolver(PgBinaryResolver pgBinaryResolver) {
return this;
}

public Builder setDataDirectoryCustomizer(final Consumer<File> dataDirectoryCustomizer) {
this.dataDirectoryCustomizer = dataDirectoryCustomizer;
return this;
}

public EmbeddedPostgres start() throws IOException {
if (builderPort == 0)
{
Expand All @@ -589,7 +601,7 @@ public EmbeddedPostgres start() throws IOException {
}
return new EmbeddedPostgres(parentDirectory, builderDataDirectory, builderCleanDataDirectory, config,
localeConfig, builderPort, connectConfig, pgBinaryResolver, errRedirector, outRedirector,
pgStartupWait, overrideWorkingDirectory);
pgStartupWait, overrideWorkingDirectory, dataDirectoryCustomizer);
}

@Override
Expand All @@ -611,7 +623,9 @@ public boolean equals(Object o) {
Objects.equals(pgBinaryResolver, builder.pgBinaryResolver) &&
Objects.equals(pgStartupWait, builder.pgStartupWait) &&
Objects.equals(errRedirector, builder.errRedirector) &&
Objects.equals(outRedirector, builder.outRedirector);
Objects.equals(outRedirector, builder.outRedirector) &&
Objects.equals(dataDirectoryCustomizer != null ? dataDirectoryCustomizer.getClass() : null,
builder.dataDirectoryCustomizer != null ? builder.dataDirectoryCustomizer.getClass() : null);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.sql.Connection;
Expand Down Expand Up @@ -47,10 +49,28 @@ public void testEmbeddedPg() throws Exception
@Test
public void testEmbeddedPgCreationWithNestedDataDirectory() throws Exception
{
Path dataDir = Files.createDirectories(tf.resolve("data-dir-parent").resolve("data-dir"));
try (EmbeddedPostgres pg = EmbeddedPostgres.builder()
.setDataDirectory(Files.createDirectories(tf.resolve("data-dir-parent").resolve("data-dir")))
.setDataDirectory(dataDir)
.setDataDirectoryCustomizer(dd -> {
assertEquals(dataDir, dd.toPath());
Path pgConfigFile = dd.toPath().resolve("postgresql.conf");
assertTrue(Files.isRegularFile(pgConfigFile));
try {
String pgConfig = new String(Files.readAllBytes(pgConfigFile), StandardCharsets.UTF_8);
pgConfig = pgConfig.replaceFirst("#?listen_addresses\\s*=\\s*'localhost'", "listen_addresses = '*'");
Files.write(pgConfigFile, pgConfig.getBytes(StandardCharsets.UTF_8));
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
})
.start()) {
// nothing to do
try (Connection connection = pg.getPostgresDatabase().getConnection()) {
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery("SHOW listen_addresses;");
rs.next();
assertEquals("*", rs.getString(1));
}
}
}
}