Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix invalid connection URLs returned by PostgreSQLContainer (#1976) #2049

Merged
merged 9 commits into from Mar 10, 2020
Expand Up @@ -7,6 +7,7 @@
import java.util.HashSet;
import java.util.Set;

import static java.lang.String.format;
import static java.time.temporal.ChronoUnit.SECONDS;

/**
Expand All @@ -24,6 +25,8 @@ public class PostgreSQLContainer<SELF extends PostgreSQLContainer<SELF>> extends

private static final String FSYNC_OFF_OPTION = "fsync=off";

private static final String QUERY_PARAM_SEPARATOR = "&";

public PostgreSQLContainer() {
this(IMAGE + ":" + DEFAULT_TAG);
}
Expand Down Expand Up @@ -59,7 +62,14 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
// Disable Postgres driver use of java.util.logging to reduce noise at startup time
return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT) + "/" + databaseName + "?loggerLevel=OFF";
return format("jdbc:postgresql://%s:%d/%s?loggerLevel=OFF", getContainerIpAddress(), getMappedPort(POSTGRESQL_PORT), databaseName);
}

@Override
protected String constructUrlForConnection(String queryString) {
return "".equals(queryString)
? getJdbcUrl()
: getJdbcUrl() + QUERY_PARAM_SEPARATOR + queryString.substring(1);
bsideup marked this conversation as resolved.
Show resolved Hide resolved
bsideup marked this conversation as resolved.
Show resolved Hide resolved
}

@Override
Expand Down
@@ -0,0 +1,34 @@
package org.testcontainers.containers;

import org.junit.Test;

import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse;
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;

public class PostgreSQLConnectionURLTest {
bsideup marked this conversation as resolved.
Show resolved Hide resolved

@Test
public void shouldCorrectlyAppendQueryString() {
PostgreSQLContainer postgres = new FixedJdbcUrlPostgreSQLContainer();
String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified");
String queryString = connectionUrl.substring(connectionUrl.indexOf('?'));

assertTrue("Query String contains expected params", queryString.contains("&stringtype=unspecified&stringtype=unspecified"));
assertEquals("Query String starts with '?'", 0, queryString.indexOf('?'));
assertFalse("Query String does not contain extra '?'", queryString.substring(1).contains("?"));
}

public static class FixedJdbcUrlPostgreSQLContainer extends PostgreSQLContainer {

@Override
public String getContainerIpAddress() {
return "localhost";
}

@Override
public Integer getMappedPort(int originalPort) {
return 34532;
}
}
}