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 0d2bde136f..7c8f6bbcc7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java +++ b/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java @@ -61,14 +61,16 @@ public class DriverFactory { + public static final String NO_ROUTING_CONTEXT_ERROR_MESSAGE = "Routing parameters are not supported with scheme 'bolt'. Given URI: "; + public final Driver newInstance( URI uri, AuthToken authToken, RoutingSettings routingSettings, RetrySettings retrySettings, Config config, SecurityPlan securityPlan ) { return newInstance( uri, authToken, routingSettings, retrySettings, config, null, securityPlan ); } - public final Driver newInstance ( URI uri, AuthToken authToken, RoutingSettings routingSettings, - RetrySettings retrySettings, Config config, EventLoopGroup eventLoopGroup, SecurityPlan securityPlan ) + public final Driver newInstance( URI uri, AuthToken authToken, RoutingSettings routingSettings, + RetrySettings retrySettings, Config config, EventLoopGroup eventLoopGroup, SecurityPlan securityPlan ) { Bootstrap bootstrap; boolean ownsEventLoopGroup; @@ -288,8 +290,7 @@ private static void assertNoRoutingContext( URI uri, RoutingSettings routingSett RoutingContext routingContext = routingSettings.routingContext(); if ( routingContext.isDefined() ) { - throw new IllegalArgumentException( - "Routing parameters are not supported with scheme 'bolt'. Given URI: '" + uri + "'" ); + throw new IllegalArgumentException( NO_ROUTING_CONTEXT_ERROR_MESSAGE + "'" + uri + "'" ); } } diff --git a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/NewDriver.java b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/NewDriver.java index f1d24aa79f..85366fbc4c 100644 --- a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/NewDriver.java +++ b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/NewDriver.java @@ -25,6 +25,7 @@ import neo4j.org.testkit.backend.TestkitState; import neo4j.org.testkit.backend.messages.responses.DomainNameResolutionRequired; import neo4j.org.testkit.backend.messages.responses.Driver; +import neo4j.org.testkit.backend.messages.responses.DriverError; import neo4j.org.testkit.backend.messages.responses.ResolverResolutionRequired; import neo4j.org.testkit.backend.messages.responses.TestkitErrorResponse; import neo4j.org.testkit.backend.messages.responses.TestkitResponse; @@ -82,7 +83,16 @@ public TestkitResponse process( TestkitState testkitState ) } Optional.ofNullable( data.userAgent ).ifPresent( configBuilder::withUserAgent ); Optional.ofNullable( data.connectionTimeoutMs ).ifPresent( timeout -> configBuilder.withConnectionTimeout( timeout, TimeUnit.MILLISECONDS ) ); - testkitState.getDrivers().putIfAbsent( id, driver( URI.create( data.uri ), authToken, configBuilder.build(), domainNameResolver ) ); + org.neo4j.driver.Driver driver; + try + { + driver = driver( URI.create( data.uri ), authToken, configBuilder.build(), domainNameResolver ); + } + catch ( RuntimeException e ) + { + return handleExceptionAsErrorResponse( testkitState, e ).orElseThrow( () -> e ); + } + testkitState.getDrivers().putIfAbsent( id, driver ); return Driver.builder().data( Driver.DriverBody.builder().id( id ).build() ).build(); } @@ -137,6 +147,20 @@ private org.neo4j.driver.Driver driver( URI uri, AuthToken authToken, Config con .newInstance( uri, authToken, routingSettings, retrySettings, config, securityPlan ); } + private Optional handleExceptionAsErrorResponse( TestkitState testkitState, RuntimeException e ) + { + Optional response = Optional.empty(); + if ( e instanceof IllegalArgumentException && e.getMessage().startsWith( DriverFactory.NO_ROUTING_CONTEXT_ERROR_MESSAGE ) ) + { + String id = testkitState.newId(); + String errorType = e.getClass().getName(); + response = Optional.of( + DriverError.builder().data( DriverError.DriverErrorBody.builder().id( id ).errorType( errorType ).build() ).build() + ); + } + return response; + } + @Setter @Getter @NoArgsConstructor