diff --git a/driver/src/main/java/org/neo4j/driver/internal/net/BoltServerAddress.java b/driver/src/main/java/org/neo4j/driver/internal/net/BoltServerAddress.java index ed8a6764ff..a7be5657f7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/net/BoltServerAddress.java +++ b/driver/src/main/java/org/neo4j/driver/internal/net/BoltServerAddress.java @@ -41,6 +41,12 @@ public static BoltServerAddress from( URI uri ) { port = DEFAULT_PORT; } + + if( uri.getHost() == null ) + { + throw new IllegalArgumentException( "Invalid URI format `" + uri.toString() + "`"); + } + return new BoltServerAddress( uri.getHost(), port ); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/DirectDriverTest.java b/driver/src/test/java/org/neo4j/driver/internal/DirectDriverTest.java index 230ee2f712..3df69e3bbd 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/DirectDriverTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/DirectDriverTest.java @@ -32,6 +32,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; import static org.neo4j.driver.internal.net.BoltServerAddress.LOCAL_DEFAULT; import static org.neo4j.driver.internal.util.Matchers.directDriverWithAddress; import static org.neo4j.driver.v1.Values.parameters; @@ -52,6 +53,38 @@ public void shouldUseDefaultPortIfMissing() assertThat( driver, is( directDriverWithAddress( LOCAL_DEFAULT ) ) ); } + @Test + public void shouldAllowIPv6Address() + { + // Given + URI uri = URI.create( "bolt://[::1]" ); + BoltServerAddress address = BoltServerAddress.from( uri ); + + // When + Driver driver = GraphDatabase.driver( uri ); + + // Then + assertThat( driver, is( directDriverWithAddress( address ) ) ); + } + + @Test + public void shouldRejectInvalidAddress() + { + // Given + URI uri = URI.create( "*" ); + + // When & Then + try + { + Driver driver = GraphDatabase.driver( uri ); + fail("Expecting error for wrong uri"); + } + catch( IllegalArgumentException e ) + { + assertThat( e.getMessage(), equalTo( "Invalid URI format `*`" ) ); + } + } + @Test public void shouldRegisterSingleServer() { diff --git a/driver/src/test/java/org/neo4j/driver/v1/integration/BookmarkIT.java b/driver/src/test/java/org/neo4j/driver/v1/integration/BookmarkIT.java index cc15ac74e5..79c1645d1c 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/integration/BookmarkIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/integration/BookmarkIT.java @@ -27,7 +27,9 @@ import org.neo4j.driver.v1.AccessMode; import org.neo4j.driver.v1.Driver; +import org.neo4j.driver.v1.GraphDatabase; import org.neo4j.driver.v1.Session; +import org.neo4j.driver.v1.StatementResult; import org.neo4j.driver.v1.Transaction; import org.neo4j.driver.v1.exceptions.ClientException; import org.neo4j.driver.v1.exceptions.TransientException; @@ -35,6 +37,7 @@ import org.neo4j.driver.v1.util.TestNeo4jSession; import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertEquals; @@ -65,6 +68,21 @@ public void assumeBookmarkSupport() assumeTrue( serverVersion.greaterThanOrEqual( v3_1_0 ) ); } + @Test + public void shouldConnectIPv6Uri() + { + // Given + try( Driver driver = GraphDatabase.driver( "bolt://[::1]:7687" ); + Session session = driver.session() ) + { + // When + StatementResult result = session.run( "RETURN 1" ); + + // Then + assertThat( result.single().get( 0 ).asInt(), equalTo( 1 ) ); + } + } + @Test public void shouldReceiveBookmarkOnSuccessfulCommit() throws Throwable { diff --git a/driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketChannelIT.java b/driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketChannelIT.java index 1c89199bf8..670e5c9bd2 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketChannelIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketChannelIT.java @@ -231,8 +231,7 @@ private void createFakeServerCertPairInKnownCerts( BoltServerAddress address, Fi public void shouldFailTLSHandshakeDueToServerCertNotSignedByKnownCA() throws Throwable { // Given - neo4j.restart( - Neo4jSettings.TEST_SETTINGS.updateWith( + neo4j.restart( Neo4jSettings.TEST_SETTINGS.updateWith( Neo4jSettings.CERT_DIR, folder.getRoot().getAbsolutePath().replace( "\\", "/" ) ) ); SocketChannel channel = SocketChannel.open(); diff --git a/driver/src/test/java/org/neo4j/driver/v1/util/Neo4jSettings.java b/driver/src/test/java/org/neo4j/driver/v1/util/Neo4jSettings.java index 4d93dbb93d..850d951b6f 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/util/Neo4jSettings.java +++ b/driver/src/test/java/org/neo4j/driver/v1/util/Neo4jSettings.java @@ -33,6 +33,8 @@ public class Neo4jSettings public static final String DATA_DIR = "dbms.directories.data"; public static final String CERT_DIR = "dbms.directories.certificates"; public static final String IMPORT_DIR = "dbms.directories.import"; + public static final String LISTEN_ADDR = "dbms.connectors.default_listen_address"; // only valid for 3.1+ + public static final String IPV6_ENABLED_ADDR = "::"; private static final String DEFAULT_IMPORT_DIR = "import"; private static final String DEFAULT_CERT_DIR = "certificates"; @@ -52,7 +54,8 @@ public class Neo4jSettings CERT_DIR, DEFAULT_CERT_DIR, DATA_DIR, DEFAULT_DATA_DIR, IMPORT_DIR, DEFAULT_IMPORT_DIR, - AUTH_ENABLED, "false" ), Collections.emptySet() ); + AUTH_ENABLED, "false", + LISTEN_ADDR, IPV6_ENABLED_ADDR ), Collections.emptySet() ); private Neo4jSettings( Map settings, Set excludes ) {