Skip to content

Commit 734b7c5

Browse files
authored
Merge pull request #145 from cit-consulting/master
#144 allow customization of data dir between database initialization and start
2 parents dd261f5 + 88cf08e commit 734b7c5

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/main/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgres.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import java.util.concurrent.atomic.AtomicBoolean;
7272
import java.util.concurrent.locks.Lock;
7373
import java.util.concurrent.locks.ReentrantLock;
74+
import java.util.function.Consumer;
7475
import java.util.stream.Stream;
7576

7677
import static java.nio.file.StandardOpenOption.CREATE;
@@ -115,14 +116,14 @@ public class EmbeddedPostgres implements Closeable
115116
PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector, ProcessBuilder.Redirect outputRedirector) throws IOException
116117
{
117118
this(parentDirectory, dataDirectory, cleanDataDirectory, postgresConfig, localeConfig, port, connectConfig,
118-
pgBinaryResolver, errorRedirector, outputRedirector, DEFAULT_PG_STARTUP_WAIT, null);
119+
pgBinaryResolver, errorRedirector, outputRedirector, DEFAULT_PG_STARTUP_WAIT, null, null);
119120
}
120121

121122
EmbeddedPostgres(File parentDirectory, File dataDirectory, boolean cleanDataDirectory,
122123
Map<String, String> postgresConfig, Map<String, String> localeConfig, int port, Map<String, String> connectConfig,
123124
PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector,
124125
ProcessBuilder.Redirect outputRedirector, Duration pgStartupWait,
125-
File overrideWorkingDirectory) throws IOException
126+
File overrideWorkingDirectory, Consumer<File> dataDirectoryCustomizer) throws IOException
126127
{
127128
this.cleanDataDirectory = cleanDataDirectory;
128129
this.postgresConfig = new HashMap<>(postgresConfig);
@@ -159,9 +160,14 @@ public class EmbeddedPostgres implements Closeable
159160
}
160161

161162
lock();
163+
164+
if (dataDirectoryCustomizer != null) {
165+
dataDirectoryCustomizer.accept(dataDirectory);
166+
}
167+
162168
this.process = startPostmaster();
163169
}
164-
170+
165171
public Process getProcess() {
166172
return this.process;
167173
}
@@ -501,6 +507,7 @@ public static class Builder
501507
private final Map<String, String> connectConfig = new HashMap<>();
502508
private PgBinaryResolver pgBinaryResolver = DefaultPostgresBinaryResolver.INSTANCE;
503509
private Duration pgStartupWait = DEFAULT_PG_STARTUP_WAIT;
510+
private Consumer<File> dataDirectoryCustomizer;
504511

505512
private ProcessBuilder.Redirect errRedirector = ProcessBuilder.Redirect.PIPE;
506513
private ProcessBuilder.Redirect outRedirector = ProcessBuilder.Redirect.PIPE;
@@ -579,6 +586,11 @@ public Builder setPgBinaryResolver(PgBinaryResolver pgBinaryResolver) {
579586
return this;
580587
}
581588

589+
public Builder setDataDirectoryCustomizer(final Consumer<File> dataDirectoryCustomizer) {
590+
this.dataDirectoryCustomizer = dataDirectoryCustomizer;
591+
return this;
592+
}
593+
582594
public EmbeddedPostgres start() throws IOException {
583595
if (builderPort == 0)
584596
{
@@ -589,7 +601,7 @@ public EmbeddedPostgres start() throws IOException {
589601
}
590602
return new EmbeddedPostgres(parentDirectory, builderDataDirectory, builderCleanDataDirectory, config,
591603
localeConfig, builderPort, connectConfig, pgBinaryResolver, errRedirector, outRedirector,
592-
pgStartupWait, overrideWorkingDirectory);
604+
pgStartupWait, overrideWorkingDirectory, dataDirectoryCustomizer);
593605
}
594606

595607
@Override
@@ -611,7 +623,9 @@ public boolean equals(Object o) {
611623
Objects.equals(pgBinaryResolver, builder.pgBinaryResolver) &&
612624
Objects.equals(pgStartupWait, builder.pgStartupWait) &&
613625
Objects.equals(errRedirector, builder.errRedirector) &&
614-
Objects.equals(outRedirector, builder.outRedirector);
626+
Objects.equals(outRedirector, builder.outRedirector) &&
627+
Objects.equals(dataDirectoryCustomizer != null ? dataDirectoryCustomizer.getClass() : null,
628+
builder.dataDirectoryCustomizer != null ? builder.dataDirectoryCustomizer.getClass() : null);
615629
}
616630

617631
@Override

src/test/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgresTest.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import static org.junit.jupiter.api.Assertions.assertFalse;
1818
import static org.junit.jupiter.api.Assertions.assertTrue;
1919

20+
import java.io.IOException;
21+
import java.nio.charset.StandardCharsets;
2022
import java.nio.file.Files;
2123
import java.nio.file.Path;
2224
import java.sql.Connection;
@@ -47,10 +49,28 @@ public void testEmbeddedPg() throws Exception
4749
@Test
4850
public void testEmbeddedPgCreationWithNestedDataDirectory() throws Exception
4951
{
52+
Path dataDir = Files.createDirectories(tf.resolve("data-dir-parent").resolve("data-dir"));
5053
try (EmbeddedPostgres pg = EmbeddedPostgres.builder()
51-
.setDataDirectory(Files.createDirectories(tf.resolve("data-dir-parent").resolve("data-dir")))
54+
.setDataDirectory(dataDir)
55+
.setDataDirectoryCustomizer(dd -> {
56+
assertEquals(dataDir, dd.toPath());
57+
Path pgConfigFile = dd.toPath().resolve("postgresql.conf");
58+
assertTrue(Files.isRegularFile(pgConfigFile));
59+
try {
60+
String pgConfig = new String(Files.readAllBytes(pgConfigFile), StandardCharsets.UTF_8);
61+
pgConfig = pgConfig.replaceFirst("#?listen_addresses\\s*=\\s*'localhost'", "listen_addresses = '*'");
62+
Files.write(pgConfigFile, pgConfig.getBytes(StandardCharsets.UTF_8));
63+
} catch (IOException ioe) {
64+
throw new RuntimeException(ioe);
65+
}
66+
})
5267
.start()) {
53-
// nothing to do
68+
try (Connection connection = pg.getPostgresDatabase().getConnection()) {
69+
Statement statement = connection.createStatement();
70+
ResultSet rs = statement.executeQuery("SHOW listen_addresses;");
71+
rs.next();
72+
assertEquals("*", rs.getString(1));
73+
}
5474
}
5575
}
5676
}

0 commit comments

Comments
 (0)