diff --git a/driver/src/main/java/org/neo4j/driver/internal/ConnectionSettings.java b/driver/src/main/java/org/neo4j/driver/internal/ConnectionSettings.java index da04f10d95..00e69f4703 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/ConnectionSettings.java +++ b/driver/src/main/java/org/neo4j/driver/internal/ConnectionSettings.java @@ -29,7 +29,7 @@ */ public class ConnectionSettings { - public static final String DEFAULT_USER_AGENT = format( "neo4j-java/%s", driverVersion() ); + private static final String DEFAULT_USER_AGENT = format( "neo4j-java/%s", driverVersion() ); /** * Extracts the driver version from the driver jar MANIFEST.MF file. @@ -52,16 +52,18 @@ private static String driverVersion() private final AuthToken authToken; private final String userAgent; + private final int timeoutMillis; - public ConnectionSettings( AuthToken authToken, String userAgent ) + public ConnectionSettings( AuthToken authToken, String userAgent, int timeoutMillis ) { this.authToken = authToken; this.userAgent = userAgent; + this.timeoutMillis = timeoutMillis; } - public ConnectionSettings( AuthToken authToken ) + public ConnectionSettings( AuthToken authToken, int timeoutMillis ) { - this( authToken, DEFAULT_USER_AGENT ); + this( authToken, DEFAULT_USER_AGENT, timeoutMillis ); } public AuthToken authToken() @@ -74,4 +76,8 @@ public String userAgent() return userAgent; } + public int timeoutMillis() + { + return timeoutMillis; + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java b/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java index d74207d992..0465e8a50d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java +++ b/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java @@ -120,7 +120,7 @@ ConnectionPool createConnectionPool( AuthToken authToken, SecurityPlan securityP { authToken = authToken == null ? AuthTokens.none() : authToken; - ConnectionSettings connectionSettings = new ConnectionSettings( authToken ); + ConnectionSettings connectionSettings = new ConnectionSettings( authToken, config.connectionTimeoutMillis() ); PoolSettings poolSettings = new PoolSettings( config.maxIdleConnectionPoolSize() ); Connector connector = new SocketConnector( connectionSettings, securityPlan, config.logging() ); diff --git a/driver/src/main/java/org/neo4j/driver/internal/net/ChannelFactory.java b/driver/src/main/java/org/neo4j/driver/internal/net/ChannelFactory.java new file mode 100644 index 0000000000..13217af347 --- /dev/null +++ b/driver/src/main/java/org/neo4j/driver/internal/net/ChannelFactory.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.neo4j.driver.internal.net; + +import java.io.IOException; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.net.StandardSocketOptions; +import java.nio.channels.ByteChannel; +import java.nio.channels.SocketChannel; +import java.security.GeneralSecurityException; + +import org.neo4j.driver.internal.security.SecurityPlan; +import org.neo4j.driver.internal.security.TLSSocketChannel; +import org.neo4j.driver.v1.Logger; + +class ChannelFactory +{ + static ByteChannel create( BoltServerAddress address, SecurityPlan securityPlan, int timeoutMillis, Logger log ) + throws IOException, GeneralSecurityException + { + SocketChannel soChannel = SocketChannel.open(); + soChannel.setOption( StandardSocketOptions.SO_REUSEADDR, true ); + soChannel.setOption( StandardSocketOptions.SO_KEEPALIVE, true ); + connect( soChannel, address, timeoutMillis ); + + ByteChannel channel; + + if ( securityPlan.requiresEncryption() ) + { + channel = TLSSocketChannel.create( address, securityPlan, soChannel, log ); + } + else + { + channel = soChannel; + } + + if ( log.isTraceEnabled() ) + { + channel = new LoggingByteChannel( channel, log ); + } + + return channel; + } + + private static void connect( SocketChannel soChannel, BoltServerAddress address, int timeoutMillis ) + throws IOException + { + Socket socket = soChannel.socket(); + try + { + socket.connect( address.toSocketAddress(), timeoutMillis ); + } + catch ( SocketTimeoutException e ) + { + throw new IOException( "Timeout " + timeoutMillis + "ms expired", e ); + } + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/net/SocketClient.java b/driver/src/main/java/org/neo4j/driver/internal/net/SocketClient.java index 7f9b5cb350..5e520a77c1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/net/SocketClient.java +++ b/driver/src/main/java/org/neo4j/driver/internal/net/SocketClient.java @@ -20,17 +20,14 @@ import java.io.IOException; import java.net.ConnectException; -import java.net.StandardSocketOptions; import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; -import java.nio.channels.SocketChannel; import java.security.GeneralSecurityException; import java.util.Queue; import org.neo4j.driver.internal.messaging.Message; import org.neo4j.driver.internal.messaging.MessageFormat; import org.neo4j.driver.internal.security.SecurityPlan; -import org.neo4j.driver.internal.security.TLSSocketChannel; import org.neo4j.driver.internal.util.BytePrinter; import org.neo4j.driver.v1.Logger; import org.neo4j.driver.v1.exceptions.ClientException; @@ -49,6 +46,7 @@ public class SocketClient private final BoltServerAddress address; private final SecurityPlan securityPlan; + private final int timeoutMillis; private final Logger logger; private SocketProtocol protocol; @@ -57,10 +55,11 @@ public class SocketClient private ByteChannel channel; - public SocketClient( BoltServerAddress address, SecurityPlan securityPlan, Logger logger ) + public SocketClient( BoltServerAddress address, SecurityPlan securityPlan, int timeoutMillis, Logger logger ) { this.address = address; this.securityPlan = securityPlan; + this.timeoutMillis = timeoutMillis; this.logger = logger; this.channel = null; } @@ -121,7 +120,7 @@ public void start() try { logger.debug( "~~ [CONNECT] %s", address ); - setChannel( ChannelFactory.create( address, securityPlan, logger ) ); + setChannel( ChannelFactory.create( address, securityPlan, timeoutMillis, logger ) ); protocol = negotiateProtocol(); reader = protocol.reader(); writer = protocol.writer(); @@ -280,36 +279,6 @@ public String toString() return "SocketClient[protocolVersion=" + version + "]"; } - private static class ChannelFactory - { - public static ByteChannel create( BoltServerAddress address, SecurityPlan securityPlan, Logger logger ) - throws IOException, GeneralSecurityException - { - SocketChannel soChannel = SocketChannel.open(); - soChannel.setOption( StandardSocketOptions.SO_REUSEADDR, true ); - soChannel.setOption( StandardSocketOptions.SO_KEEPALIVE, true ); - soChannel.connect( address.toSocketAddress() ); - - ByteChannel channel; - - if (securityPlan.requiresEncryption()) - { - channel = TLSSocketChannel.create( address, securityPlan, soChannel, logger ); - } - else - { - channel = soChannel; - } - - if ( logger.isTraceEnabled() ) - { - channel = new LoggingByteChannel( channel, logger ); - } - - return channel; - } - } - public BoltServerAddress address() { return address; diff --git a/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnection.java b/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnection.java index 730dd1e5dc..733f6469a9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnection.java +++ b/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnection.java @@ -58,10 +58,10 @@ public class SocketConnection implements Connection private final Logger logger; - public SocketConnection( BoltServerAddress address, SecurityPlan securityPlan, Logging logging ) + public SocketConnection( BoltServerAddress address, SecurityPlan securityPlan, int timeoutMillis, Logging logging ) { this.logger = logging.getLog( format( "conn-%s", UUID.randomUUID().toString() ) ); - this.socket = new SocketClient( address, securityPlan, logger ); + this.socket = new SocketClient( address, securityPlan, timeoutMillis, logger ); this.responseHandler = createResponseHandler( logger ); this.socket.start(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnector.java b/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnector.java index 979b1f1018..925a0e1d7d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnector.java +++ b/driver/src/main/java/org/neo4j/driver/internal/net/SocketConnector.java @@ -47,7 +47,8 @@ public SocketConnector( ConnectionSettings connectionSettings, SecurityPlan secu @Override public final Connection connect( BoltServerAddress address ) { - Connection connection = createConnection( address, securityPlan, logging ); + Connection connection = createConnection( address, securityPlan, connectionSettings.timeoutMillis(), + logging ); // Because SocketConnection is not thread safe, wrap it in this guard // to ensure concurrent access leads causes application errors @@ -71,9 +72,10 @@ public final Connection connect( BoltServerAddress address ) *

* This method is package-private only for testing */ - Connection createConnection( BoltServerAddress address, SecurityPlan securityPlan, Logging logging ) + Connection createConnection( BoltServerAddress address, SecurityPlan securityPlan, int timeoutMillis, + Logging logging ) { - return new SocketConnection( address, securityPlan, logging ); + return new SocketConnection( address, securityPlan, timeoutMillis, logging ); } private static Map tokenAsMap( AuthToken token ) diff --git a/driver/src/main/java/org/neo4j/driver/v1/Config.java b/driver/src/main/java/org/neo4j/driver/v1/Config.java index ab177066e8..02b9bcc50e 100644 --- a/driver/src/main/java/org/neo4j/driver/v1/Config.java +++ b/driver/src/main/java/org/neo4j/driver/v1/Config.java @@ -61,6 +61,7 @@ public class Config private final int routingFailureLimit; private final long routingRetryDelayMillis; + private final int connectionTimeoutMillis; private Config( ConfigBuilder builder) { @@ -73,6 +74,7 @@ private Config( ConfigBuilder builder) this.trustStrategy = builder.trustStrategy; this.routingFailureLimit = builder.routingFailureLimit; this.routingRetryDelayMillis = builder.routingRetryDelayMillis; + this.connectionTimeoutMillis = builder.connectionTimeoutMillis; } /** @@ -127,6 +129,14 @@ public long idleTimeBeforeConnectionTest() return -1; } + /** + * @return the configured connection timeout value in milliseconds. + */ + public int connectionTimeoutMillis() + { + return connectionTimeoutMillis; + } + /** * @return the level of encryption required for all connections. */ @@ -176,7 +186,8 @@ public static class ConfigBuilder private EncryptionLevel encryptionLevel = EncryptionLevel.REQUIRED; private TrustStrategy trustStrategy = trustAllCertificates(); private int routingFailureLimit = 1; - private long routingRetryDelayMillis = 5_000; + private long routingRetryDelayMillis = TimeUnit.SECONDS.toMillis( 5 ); + private int connectionTimeoutMillis = (int) TimeUnit.SECONDS.toMillis( 5 ); private ConfigBuilder() {} @@ -367,6 +378,42 @@ public ConfigBuilder withRoutingRetryDelay( long delay, TimeUnit unit ) return this; } + /** + * Specify socket connection timeout. + *

+ * A timeout of zero is treated as an infinite timeout and will be bound by the timeout configured on the + * operating system level. The connection will block until established or an error occurs. + *

+ * Timeout value should be greater or equal to zero and represent a valid {@code int} value when converted to + * {@link TimeUnit#MILLISECONDS milliseconds}. + *

+ * The default value of this parameter is {@code 5 SECONDS}. + * + * @param value the timeout duration + * @param unit the unit in which duration is given + * @return this builder + * @throws IllegalArgumentException when given value is negative or does not fit in {@code int} when + * converted to milliseconds. + */ + public ConfigBuilder withConnectionTimeout( long value, TimeUnit unit ) + { + long connectionTimeoutMillis = unit.toMillis( value ); + if ( connectionTimeoutMillis < 0 ) + { + throw new IllegalArgumentException( String.format( + "The connection timeout may not be smaller than 0, but was %d %s.", value, unit ) ); + } + int connectionTimeoutMillisInt = (int) connectionTimeoutMillis; + if ( connectionTimeoutMillisInt != connectionTimeoutMillis ) + { + throw new IllegalArgumentException( String.format( + "The connection timeout must represent int value when converted to milliseconds %d.", + connectionTimeoutMillis ) ); + } + this.connectionTimeoutMillis = connectionTimeoutMillisInt; + return this; + } + /** * Create a config instance from this builder. * @return a {@link Config} instance diff --git a/driver/src/test/java/org/neo4j/driver/internal/ConfigTest.java b/driver/src/test/java/org/neo4j/driver/internal/ConfigTest.java index 2786ed7942..9cc6156670 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/ConfigTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/ConfigTest.java @@ -21,14 +21,18 @@ import org.junit.Test; import java.io.File; +import java.util.concurrent.TimeUnit; import org.neo4j.driver.v1.Config; import org.neo4j.driver.v1.util.FileTools; import static java.lang.System.getProperty; +import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; public class ConfigTest { @@ -98,6 +102,59 @@ public void shouldTurnOnLeakedSessionsLogging() assertTrue( Config.build().withLeakedSessionsLogging().toConfig().logLeakedSessions() ); } + @Test + public void shouldHaveDefaultConnectionTimeout() + { + Config defaultConfig = Config.defaultConfig(); + assertEquals( TimeUnit.SECONDS.toMillis( 5 ), defaultConfig.connectionTimeoutMillis() ); + } + + @Test + public void shouldRespectConfiguredConnectionTimeout() + { + Config config = Config.build().withConnectionTimeout( 42, TimeUnit.HOURS ).toConfig(); + assertEquals( TimeUnit.HOURS.toMillis( 42 ), config.connectionTimeoutMillis() ); + } + + @Test + public void shouldAllowConnectionTimeoutOfZero() + { + Config config = Config.build().withConnectionTimeout( 0, TimeUnit.SECONDS ).toConfig(); + assertEquals( 0, config.connectionTimeoutMillis() ); + } + + @Test + public void shouldThrowForNegativeConnectionTimeout() + { + Config.ConfigBuilder builder = Config.build(); + + try + { + builder.withConnectionTimeout( -42, TimeUnit.SECONDS ); + fail( "Exception expected" ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } + + @Test + public void shouldThrowForTooLargeConnectionTimeout() + { + Config.ConfigBuilder builder = Config.build(); + + try + { + builder.withConnectionTimeout( Long.MAX_VALUE - 42, TimeUnit.SECONDS ); + fail( "Exception expected" ); + } + catch ( Exception e ) + { + assertThat( e, instanceOf( IllegalArgumentException.class ) ); + } + } + public static void deleteDefaultKnownCertFileIfExists() { if( DEFAULT_KNOWN_HOSTS.exists() ) diff --git a/driver/src/test/java/org/neo4j/driver/internal/net/SocketClientTest.java b/driver/src/test/java/org/neo4j/driver/internal/net/SocketClientTest.java index c629009f74..20b1eecde7 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/net/SocketClientTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/net/SocketClientTest.java @@ -39,9 +39,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.neo4j.driver.internal.net.BoltServerAddress.LOCAL_DEFAULT; public class SocketClientTest { + private static final int CONNECTION_TIMEOUT = 42; + @Rule public ExpectedException exception = ExpectedException.none(); @@ -56,7 +59,7 @@ public void testNetworkTimeout() throws Throwable BoltServerAddress address = new BoltServerAddress( "localhost", server.getLocalPort() ); SecurityPlan securityPlan = SecurityPlan.insecure(); - SocketClient client = new SocketClient( address, securityPlan, new DevNullLogger() ); + SocketClient client = new SocketClient( address, securityPlan, CONNECTION_TIMEOUT, new DevNullLogger() ); // Expect exception.expect( ClientException.class ); @@ -68,7 +71,7 @@ public void testNetworkTimeout() throws Throwable private SocketClient dummyClient() { - return new SocketClient( BoltServerAddress.LOCAL_DEFAULT, SecurityPlan.insecure(), new DevNullLogger() ); + return new SocketClient( LOCAL_DEFAULT, SecurityPlan.insecure(), CONNECTION_TIMEOUT, new DevNullLogger() ); } @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/net/SocketConnectorTest.java b/driver/src/test/java/org/neo4j/driver/internal/net/SocketConnectorTest.java index b97f6c4c39..a57ab7831a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/net/SocketConnectorTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/net/SocketConnectorTest.java @@ -25,6 +25,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.neo4j.driver.internal.ConnectionSettings; +import org.neo4j.driver.internal.security.InternalAuthToken; import org.neo4j.driver.internal.security.SecurityPlan; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.v1.AuthToken; @@ -34,25 +35,32 @@ import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.RETURNS_MOCKS; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.neo4j.driver.internal.net.BoltServerAddress.LOCAL_DEFAULT; +import static org.neo4j.driver.internal.security.SecurityPlan.insecure; public class SocketConnectorTest { + private static final int CONNECTION_TIMEOUT = 42; + @Test public void connectCreatesConnection() { - ConnectionSettings settings = new ConnectionSettings( basicAuthToken() ); + ConnectionSettings settings = new ConnectionSettings( basicAuthToken(), CONNECTION_TIMEOUT ); SocketConnector connector = new RecordingSocketConnector( settings ); Connection connection = connector.connect( LOCAL_DEFAULT ); @@ -65,7 +73,7 @@ public void connectCreatesConnection() public void connectSendsInit() { String userAgent = "agentSmith"; - ConnectionSettings settings = new ConnectionSettings( basicAuthToken(), userAgent ); + ConnectionSettings settings = new ConnectionSettings( basicAuthToken(), userAgent, CONNECTION_TIMEOUT ); RecordingSocketConnector connector = new RecordingSocketConnector( settings ); connector.connect( LOCAL_DEFAULT ); @@ -78,7 +86,7 @@ public void connectSendsInit() @Test public void connectThrowsForUnknownAuthToken() { - ConnectionSettings settings = new ConnectionSettings( mock( AuthToken.class ) ); + ConnectionSettings settings = new ConnectionSettings( mock( AuthToken.class ), CONNECTION_TIMEOUT ); RecordingSocketConnector connector = new RecordingSocketConnector( settings ); try @@ -100,7 +108,7 @@ public void connectClosesOpenedConnectionIfInitThrows() RuntimeException initError = new RuntimeException( "Init error" ); doThrow( initError ).when( connection ).init( anyString(), any( Map.class ) ); - StubSocketConnector connector = new StubSocketConnector( connection ); + SocketConnector connector = stubSocketConnector( connection ); try { @@ -115,6 +123,24 @@ public void connectClosesOpenedConnectionIfInitThrows() verify( connection ).close(); } + @Test + public void createsConnectionWithUsingConnectionSettings() + { + AuthToken authToken = AuthTokens.basic( "neo4j", "test" ); + String userAgent = "tester"; + int connectionTimeoutMillis = CONNECTION_TIMEOUT; + ConnectionSettings settings = new ConnectionSettings( authToken, userAgent, connectionTimeoutMillis ); + + Connection connection = mock( Connection.class ); + SocketConnector connector = stubSocketConnector( connection, settings ); + + assertNotNull( connector.connect( LOCAL_DEFAULT ) ); + + verify( connector ).createConnection( eq( LOCAL_DEFAULT ), any( SecurityPlan.class ), + eq( connectionTimeoutMillis ), any( Logging.class ) ); + verify( connection ).init( userAgent, ((InternalAuthToken) authToken).toMap() ); + } + private static Logging loggingMock() { return mock( Logging.class, RETURNS_MOCKS ); @@ -125,17 +151,31 @@ private static AuthToken basicAuthToken() return AuthTokens.basic( "neo4j", "neo4j" ); } + private static SocketConnector stubSocketConnector( Connection connection ) + { + return stubSocketConnector( connection, new ConnectionSettings( basicAuthToken(), CONNECTION_TIMEOUT ) ); + } + + private static SocketConnector stubSocketConnector( Connection connection, ConnectionSettings settings ) + { + SocketConnector connector = spy( new SocketConnector( settings, insecure(), loggingMock() ) ); + doReturn( connection ).when( connector ).createConnection( + any( BoltServerAddress.class ), any( SecurityPlan.class ), anyInt(), any( Logging.class ) ); + return connector; + } + private static class RecordingSocketConnector extends SocketConnector { final List createConnections = new CopyOnWriteArrayList<>(); RecordingSocketConnector( ConnectionSettings settings ) { - super( settings, SecurityPlan.insecure(), loggingMock() ); + super( settings, insecure(), loggingMock() ); } @Override - Connection createConnection( BoltServerAddress address, SecurityPlan securityPlan, Logging logging ) + Connection createConnection( BoltServerAddress address, SecurityPlan securityPlan, int timeoutMillis, + Logging logging ) { Connection connection = mock( Connection.class ); when( connection.boltServerAddress() ).thenReturn( address ); @@ -143,21 +183,4 @@ Connection createConnection( BoltServerAddress address, SecurityPlan securityPla return connection; } } - - private static class StubSocketConnector extends SocketConnector - { - final Connection connection; - - StubSocketConnector( Connection connection ) - { - super( new ConnectionSettings( basicAuthToken() ), SecurityPlan.insecure(), loggingMock() ); - this.connection = connection; - } - - @Override - Connection createConnection( BoltServerAddress address, SecurityPlan securityPlan, Logging logging ) - { - return connection; - } - } } diff --git a/driver/src/test/java/org/neo4j/driver/v1/integration/SocketClientIT.java b/driver/src/test/java/org/neo4j/driver/v1/integration/SocketClientIT.java index 79981eff0a..d34f3c9319 100644 --- a/driver/src/test/java/org/neo4j/driver/v1/integration/SocketClientIT.java +++ b/driver/src/test/java/org/neo4j/driver/v1/integration/SocketClientIT.java @@ -28,11 +28,11 @@ import java.util.LinkedList; import java.util.Queue; -import org.neo4j.driver.internal.net.SocketClient; -import org.neo4j.driver.internal.net.SocketResponseHandler; import org.neo4j.driver.internal.logging.DevNullLogger; import org.neo4j.driver.internal.messaging.InitMessage; import org.neo4j.driver.internal.messaging.Message; +import org.neo4j.driver.internal.net.SocketClient; +import org.neo4j.driver.internal.net.SocketResponseHandler; import org.neo4j.driver.internal.security.SecurityPlan; import org.neo4j.driver.v1.exceptions.ClientException; import org.neo4j.driver.v1.util.TestNeo4j; @@ -45,8 +45,8 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.v1.Values.parameters; import static org.neo4j.driver.v1.Values.ofValue; +import static org.neo4j.driver.v1.Values.parameters; public class SocketClientIT { @@ -59,7 +59,7 @@ public class SocketClientIT public void setup() throws GeneralSecurityException, IOException { SecurityPlan securityPlan = SecurityPlan.insecure(); - client = new SocketClient( neo4j.address(), securityPlan, new DevNullLogger() ); + client = new SocketClient( neo4j.address(), securityPlan, 42, new DevNullLogger() ); } @After