package ru.yandex.qatools.embed.postgresql;
import de.flapdoodle.embed.process.config.IRuntimeConfig;
import de.flapdoodle.embed.process.io.progress.LoggingProgressListener;
import de.flapdoodle.embed.process.store.NonCachedPostgresArtifactStoreBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import ru.yandex.qatools.embed.postgresql.config.AbstractPostgresConfig;
import ru.yandex.qatools.embed.postgresql.config.PostgresDownloadConfigBuilder;
import ru.yandex.qatools.embed.postgresql.config.PostgresConfig;
import ru.yandex.qatools.embed.postgresql.config.RuntimeConfigBuilder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static ru.yandex.qatools.embed.postgresql.distribution.Version.Main.PRODUCTION;
import static ru.yandex.qatools.embed.postgresql.util.SocketUtil.findFreePort;
public class TestPostgresStarter {
private static final Logger logger = Logger.getLogger(TestPostgresStarter.class.getName());
private final TestHandler testHandler = new TestHandler();
protected PostgresProcess process;
private Connection conn;
@Before
public void setUp() throws Exception {
logger.setLevel(Level.INFO);
logger.addHandler(testHandler);
// turns off the default functionality of unzipping on every run.
IRuntimeConfig runtimeConfig = buildRuntimeConfig();
PostgresStarter<PostgresExecutable, PostgresProcess> runtime = PostgresStarter.getInstance(runtimeConfig);
final PostgresConfig config = new PostgresConfig(PRODUCTION, new AbstractPostgresConfig.Net(
"localhost", findFreePort()
), new AbstractPostgresConfig.Storage("test"), new AbstractPostgresConfig.Timeout(),
new AbstractPostgresConfig.Credentials("user", "password"));
config.getAdditionalInitDbParams().addAll(asList(
"-E", "SQL_ASCII",
"--locale=C",
"--lc-collate=C",
"--lc-ctype=C"
));
PostgresExecutable exec = runtime.prepare(config);
process = exec.start();
String url = format("jdbc:postgresql://%s:%s/%s?user=%s&password=%s",
config.net().host(),
config.net().port(),
config.storage().dbName(),
config.credentials().username(),
config.credentials().password()
);
conn = DriverManager.getConnection(url);
}
protected IRuntimeConfig buildRuntimeConfig() {
return new RuntimeConfigBuilder()
.defaults(Command.Postgres)
.artifactStore(new NonCachedPostgresArtifactStoreBuilder()
.defaults(Command.Postgres)
.download(new PostgresDownloadConfigBuilder()
.defaultsForCommand(Command.Postgres)
.progressListener(new LoggingProgressListener(logger, Level.ALL))
.build()))
.build();
}
@After
public void tearDown() throws Exception {
conn.close();
process.stop();
}
@Test
public void testPostgres() throws Exception {
assertThat(conn, not(nullValue()));
assertThat(conn.createStatement().execute("CREATE TABLE films (code char(5));"), is(false));
assertThat(conn.createStatement().execute("INSERT INTO films VALUES ('movie');"), is(false));
final Statement statement = conn.createStatement();
assertThat(statement.execute("SELECT * FROM films;"), is(true));
assertThat(statement.getResultSet().next(), is(true));
assertThat(statement.getResultSet().getString("code"), is("movie"));
// verify no logs
assertThat(testHandler.RECORDS.size(), is(0));
}
private static class TestHandler extends Handler {
public final List<LogRecord> RECORDS = new ArrayList<>();
@Override
public void publish(LogRecord record) {
RECORDS.add(record);
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
}
}