diff --git a/src/main/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgres.java b/src/main/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgres.java index 9e6b0c0d..48fe5843 100644 --- a/src/main/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgres.java +++ b/src/main/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgres.java @@ -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; @@ -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 postgresConfig, Map localeConfig, int port, Map connectConfig, PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector, ProcessBuilder.Redirect outputRedirector, Duration pgStartupWait, - File overrideWorkingDirectory) throws IOException + File overrideWorkingDirectory, Consumer dataDirectoryCustomizer) throws IOException { this.cleanDataDirectory = cleanDataDirectory; this.postgresConfig = new HashMap<>(postgresConfig); @@ -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; } @@ -501,6 +507,7 @@ public static class Builder private final Map connectConfig = new HashMap<>(); private PgBinaryResolver pgBinaryResolver = DefaultPostgresBinaryResolver.INSTANCE; private Duration pgStartupWait = DEFAULT_PG_STARTUP_WAIT; + private Consumer dataDirectoryCustomizer; private ProcessBuilder.Redirect errRedirector = ProcessBuilder.Redirect.PIPE; private ProcessBuilder.Redirect outRedirector = ProcessBuilder.Redirect.PIPE; @@ -579,6 +586,11 @@ public Builder setPgBinaryResolver(PgBinaryResolver pgBinaryResolver) { return this; } + public Builder setDataDirectoryCustomizer(final Consumer dataDirectoryCustomizer) { + this.dataDirectoryCustomizer = dataDirectoryCustomizer; + return this; + } + public EmbeddedPostgres start() throws IOException { if (builderPort == 0) { @@ -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 @@ -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 diff --git a/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java b/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java index b752dc5b..7af761eb 100644 --- a/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java +++ b/src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java @@ -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; @@ -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)); + } } } }