From f2d0cf3e40e0052f38fed572aefe24eb1ad6778d Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Tue, 18 Jul 2023 17:22:01 +0100 Subject: [PATCH 1/2] Remove unused declarations This also enables the `MetricsIT.driverMetricsUpdatedWithDriverUse` test. --- .../driver/internal/NoOpBookmarkManager.java | 4 - .../driver/internal/async/NetworkSession.java | 13 ---- .../AuthorizationStateListener.java | 8 +- .../inbound/InboundMessageDispatcher.java | 4 +- .../async/pool/ConnectionPoolImpl.java | 3 +- .../async/pool/NettyChannelHealthChecker.java | 3 +- .../internal/cluster/RoutingSettings.java | 4 - .../cluster/loadbalancing/LoadBalancer.java | 4 - .../pulln/BasicPullResponseHandler.java | 28 +++---- .../InternalConnectionPoolMetrics.java | 3 +- .../ByteArrayIncompatiblePacker.java | 33 -------- .../internal/packstream/PackStream.java | 57 ++++++++++++++ .../driver/internal/spi/ConnectionPool.java | 2 - .../driver/internal/summary/InternalPlan.java | 5 -- .../driver/internal/util/CertificateTool.java | 29 ------- .../neo4j/driver/internal/util/ErrorUtil.java | 14 ---- .../neo4j/driver/internal/util/Iterables.java | 9 --- .../integration/ConnectionHandlingIT.java | 2 +- .../neo4j/driver/integration/MetricsIT.java | 64 +++++++--------- .../neo4j/driver/integration/SessionIT.java | 2 +- .../driver/integration/SessionMixIT.java | 44 ----------- .../integration/reactive/RxResultIT.java | 8 +- .../async/pool/ConnectionPoolImplTest.java | 8 +- .../pool/NettyChannelHealthCheckerTest.java | 18 ++--- .../async/pool/NettyChannelPoolIT.java | 2 +- .../async/pool/TestConnectionPool.java | 1 - .../RoutingTableAndConnectionPoolTest.java | 5 +- .../handlers/ResetResponseHandlerTest.java | 5 -- .../MicrometerConnectionPoolMetricsTest.java | 3 - .../driver/internal/util/BookmarkUtil.java | 12 --- .../driver/internal/util/Neo4jEdition.java | 1 - .../driver/internal/util/Neo4jFeature.java | 1 - .../internal/util/ThrowingMessageEncoder.java | 38 ---------- .../neo4j/driver/stress/AbstractContext.java | 3 +- .../driver/stress/AbstractStressTestBase.java | 4 - .../driver/stress/AsyncFailingQuery.java | 53 ------------- .../driver/stress/AsyncFailingQueryInTx.java | 55 -------------- .../neo4j/driver/stress/AsyncReadQuery.java | 59 -------------- .../driver/stress/AsyncReadQueryInTx.java | 62 --------------- .../stress/AsyncReadQueryWithRetries.java | 2 +- .../neo4j/driver/stress/AsyncWriteQuery.java | 64 ---------------- .../driver/stress/AsyncWriteQueryInTx.java | 67 ---------------- .../neo4j/driver/stress/AsyncWrongQuery.java | 58 -------------- .../driver/stress/AsyncWrongQueryInTx.java | 61 --------------- .../driver/stress/BlockingReadQuery.java | 3 +- .../driver/stress/BlockingReadQueryInTx.java | 3 +- .../stress/BlockingReadQueryWithRetries.java | 4 +- .../org/neo4j/driver/stress/RxReadQuery.java | 2 +- .../neo4j/driver/stress/RxReadQueryInTx.java | 2 +- .../driver/stress/RxReadQueryWithRetries.java | 2 +- .../driver/stress/SingleInstanceStressIT.java | 17 ----- .../driver/testutil/CertificateUtil.java | 9 --- .../neo4j/driver/testutil/Neo4jSettings.java | 76 ------------------- .../neo4j/driver/testutil/StdIOCapture.java | 4 - .../org/neo4j/driver/testutil/TestUtil.java | 6 -- 55 files changed, 134 insertions(+), 919 deletions(-) delete mode 100644 driver/src/main/java/org/neo4j/driver/internal/packstream/ByteArrayIncompatiblePacker.java delete mode 100644 driver/src/test/java/org/neo4j/driver/internal/util/ThrowingMessageEncoder.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java delete mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/NoOpBookmarkManager.java b/driver/src/main/java/org/neo4j/driver/internal/NoOpBookmarkManager.java index a6ec96ae29..2d8af8fe84 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/NoOpBookmarkManager.java +++ b/driver/src/main/java/org/neo4j/driver/internal/NoOpBookmarkManager.java @@ -46,8 +46,4 @@ public void updateBookmarks(Set previousBookmarks, Set newBo public Set getBookmarks() { return EMPTY; } - - private Set getAllBookmarks() { - return EMPTY; - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java b/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java index cf4ee10734..4dc9fc7ace 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/NetworkSession.java @@ -19,13 +19,11 @@ package org.neo4j.driver.internal.async; import static java.util.concurrent.CompletableFuture.completedFuture; -import static org.neo4j.driver.internal.async.ConnectionContext.PENDING_DATABASE_NAME_EXCEPTION_SUPPLIER; import static org.neo4j.driver.internal.util.Futures.completedWithNull; import java.util.Collections; import java.util.HashSet; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; @@ -58,11 +56,6 @@ import org.neo4j.driver.internal.util.Futures; public class NetworkSession { - /** - * Fallback database name used by the driver when session has no database name configured and database discovery is unavailable. - */ - String FALLBACK_DATABASE_NAME = ""; - private final ConnectionProvider connectionProvider; private final NetworkSessionConnectionContext connectionContext; private final AccessMode mode; @@ -393,12 +386,6 @@ private void assertDatabaseNameFutureIsDone() { } } - private Optional getDatabaseNameNow() { - return Futures.joinNowOrElseThrow( - connectionContext.databaseNameFuture(), PENDING_DATABASE_NAME_EXCEPTION_SUPPLIER) - .databaseName(); - } - /** * The {@link NetworkSessionConnectionContext#mode} can be mutable for a session connection context */ diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/connection/AuthorizationStateListener.java b/driver/src/main/java/org/neo4j/driver/internal/async/connection/AuthorizationStateListener.java index eff66fb863..26f1093309 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/connection/AuthorizationStateListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/connection/AuthorizationStateListener.java @@ -18,18 +18,12 @@ */ package org.neo4j.driver.internal.async.connection; -import io.netty.channel.Channel; -import org.neo4j.driver.exceptions.AuthorizationExpiredException; - /** * Listener for authorization info state maintained on the server side. */ public interface AuthorizationStateListener { /** * Notifies the listener that the credentials stored on the server side have expired. - * - * @param e the {@link AuthorizationExpiredException} exception. - * @param channel the channel that received the error. */ - void onExpired(AuthorizationExpiredException e, Channel channel); + void onExpired(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/inbound/InboundMessageDispatcher.java b/driver/src/main/java/org/neo4j/driver/internal/async/inbound/InboundMessageDispatcher.java index c125e1044d..d62418645a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/inbound/InboundMessageDispatcher.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/inbound/InboundMessageDispatcher.java @@ -120,8 +120,8 @@ public void handleFailureMessage(String code, String message) { } var currentError = this.currentError; - if (currentError instanceof AuthorizationExpiredException authorizationExpiredException) { - authorizationStateListener(channel).onExpired(authorizationExpiredException, channel); + if (currentError instanceof AuthorizationExpiredException) { + authorizationStateListener(channel).onExpired(); } else if (currentError instanceof TokenExpiredException tokenExpiredException) { var authContext = authContext(channel); var authTokenProvider = authContext.getAuthTokenManager(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java index a87df88983..93a1e95a2f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java @@ -174,8 +174,7 @@ public int inUseConnections(ServerAddress address) { return nettyChannelTracker.inUseChannelCount(address); } - @Override - public int idleConnections(ServerAddress address) { + private int idleConnections(ServerAddress address) { return nettyChannelTracker.idleChannelCount(address); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthChecker.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthChecker.java index 9710a2cd1c..23f1699fa5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthChecker.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthChecker.java @@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicLong; import org.neo4j.driver.Logger; import org.neo4j.driver.Logging; -import org.neo4j.driver.exceptions.AuthorizationExpiredException; import org.neo4j.driver.internal.async.connection.AuthorizationStateListener; import org.neo4j.driver.internal.handlers.PingResponseHandler; import org.neo4j.driver.internal.messaging.request.ResetMessage; @@ -124,7 +123,7 @@ private boolean isAuthExpiredByFailure(Channel channel) { } @Override - public void onExpired(AuthorizationExpiredException e, Channel channel) { + public void onExpired() { var now = clock.millis(); minAuthTimestamp.getAndUpdate(prev -> Math.max(prev, now)); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingSettings.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingSettings.java index b3767a08b7..cf3860bbd2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingSettings.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/RoutingSettings.java @@ -26,10 +26,6 @@ public class RoutingSettings { private final RoutingContext routingContext; private final long routingTablePurgeDelayMs; - public RoutingSettings(long routingTablePurgeDelayMs) { - this(routingTablePurgeDelayMs, RoutingContext.EMPTY); - } - public RoutingSettings(long routingTablePurgeDelayMs, RoutingContext routingContext) { this.routingContext = routingContext; this.routingTablePurgeDelayMs = routingTablePurgeDelayMs; diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/loadbalancing/LoadBalancer.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/loadbalancing/LoadBalancer.java index 2baf25fd14..a320c1be6a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/loadbalancing/LoadBalancer.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/loadbalancing/LoadBalancer.java @@ -264,10 +264,6 @@ private static RoutingTableRegistry createRoutingTables( connectionPool, rediscovery, clock, logging, settings.routingTablePurgeDelayMs()); } - private static RuntimeException unknownMode(AccessMode mode) { - return new IllegalArgumentException("Mode '" + mode + "' is not supported"); - } - /** * This method is only for testing */ diff --git a/driver/src/main/java/org/neo4j/driver/internal/handlers/pulln/BasicPullResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/handlers/pulln/BasicPullResponseHandler.java index 7fbf8bcefc..ddc0e96db9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/handlers/pulln/BasicPullResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/handlers/pulln/BasicPullResponseHandler.java @@ -128,7 +128,7 @@ public void onFailure(Throwable error) { ResultSummary summary; synchronized (this) { assertRecordAndSummaryConsumerInstalled(); - state.onFailure(this, error); + state.onFailure(this); completionListener.afterFailure(error); summary = extractResultSummary(emptyMap()); recordConsumer = this.recordConsumer; @@ -149,7 +149,7 @@ public void onRecord(Value[] fields) { Record record = null; synchronized (this) { assertRecordAndSummaryConsumerInstalled(); - state.onRecord(this, fields); + state.onRecord(this); newState = state; if (newState == State.STREAMING_STATE) { record = new InternalRecord(runResponseHandler.queryKeys(), fields); @@ -294,12 +294,12 @@ void onSuccess(BasicPullResponseHandler context, Map metadata) { } @Override - void onFailure(BasicPullResponseHandler context, Throwable error) { + void onFailure(BasicPullResponseHandler context) { context.state(FAILURE_STATE); } @Override - void onRecord(BasicPullResponseHandler context, Value[] fields) { + void onRecord(BasicPullResponseHandler context) { context.state(READY_STATE); } @@ -326,12 +326,12 @@ void onSuccess(BasicPullResponseHandler context, Map metadata) { } @Override - void onFailure(BasicPullResponseHandler context, Throwable error) { + void onFailure(BasicPullResponseHandler context) { context.state(FAILURE_STATE); } @Override - void onRecord(BasicPullResponseHandler context, Value[] fields) { + void onRecord(BasicPullResponseHandler context) { context.state(STREAMING_STATE); } @@ -360,12 +360,12 @@ void onSuccess(BasicPullResponseHandler context, Map metadata) { } @Override - void onFailure(BasicPullResponseHandler context, Throwable error) { + void onFailure(BasicPullResponseHandler context) { context.state(FAILURE_STATE); } @Override - void onRecord(BasicPullResponseHandler context, Value[] fields) { + void onRecord(BasicPullResponseHandler context) { context.state(CANCELLED_STATE); } @@ -388,12 +388,12 @@ void onSuccess(BasicPullResponseHandler context, Map metadata) { } @Override - void onFailure(BasicPullResponseHandler context, Throwable error) { + void onFailure(BasicPullResponseHandler context) { context.state(FAILURE_STATE); } @Override - void onRecord(BasicPullResponseHandler context, Value[] fields) { + void onRecord(BasicPullResponseHandler context) { context.state(SUCCEEDED_STATE); } @@ -416,12 +416,12 @@ void onSuccess(BasicPullResponseHandler context, Map metadata) { } @Override - void onFailure(BasicPullResponseHandler context, Throwable error) { + void onFailure(BasicPullResponseHandler context) { context.state(FAILURE_STATE); } @Override - void onRecord(BasicPullResponseHandler context, Value[] fields) { + void onRecord(BasicPullResponseHandler context) { context.state(FAILURE_STATE); } @@ -440,9 +440,9 @@ Runnable cancel(BasicPullResponseHandler context) { abstract void onSuccess(BasicPullResponseHandler context, Map metadata); - abstract void onFailure(BasicPullResponseHandler context, Throwable error); + abstract void onFailure(BasicPullResponseHandler context); - abstract void onRecord(BasicPullResponseHandler context, Value[] fields); + abstract void onRecord(BasicPullResponseHandler context); abstract Runnable request(BasicPullResponseHandler context, long n); diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java index 670083fb78..a9a31f842e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java @@ -218,7 +218,8 @@ public String toString() { totalInUseCount()); } - // This method is for testing purposes only + // This is used by the Testkit backend + @SuppressWarnings("unused") public ServerAddress getAddress() { return address; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/packstream/ByteArrayIncompatiblePacker.java b/driver/src/main/java/org/neo4j/driver/internal/packstream/ByteArrayIncompatiblePacker.java deleted file mode 100644 index aa8a115eba..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/packstream/ByteArrayIncompatiblePacker.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.packstream; - -import java.io.IOException; - -public class ByteArrayIncompatiblePacker extends PackStream.Packer { - public ByteArrayIncompatiblePacker(PackOutput out) { - super(out); - } - - @Override - public void packBytesHeader(int size) throws IOException { - throw new PackStream.UnPackable("Packing bytes is not supported " - + "as the current server this driver connected to does not support unpack bytes."); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/packstream/PackStream.java b/driver/src/main/java/org/neo4j/driver/internal/packstream/PackStream.java index 5db08708c1..dc227dd007 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/packstream/PackStream.java +++ b/driver/src/main/java/org/neo4j/driver/internal/packstream/PackStream.java @@ -91,10 +91,19 @@ public class PackStream { public static final byte FLOAT_64 = (byte) 0xC1; public static final byte FALSE = (byte) 0xC2; public static final byte TRUE = (byte) 0xC3; + + @SuppressWarnings("unused") public static final byte RESERVED_C4 = (byte) 0xC4; + + @SuppressWarnings("unused") public static final byte RESERVED_C5 = (byte) 0xC5; + + @SuppressWarnings("unused") public static final byte RESERVED_C6 = (byte) 0xC6; + + @SuppressWarnings("unused") public static final byte RESERVED_C7 = (byte) 0xC7; + public static final byte INT_8 = (byte) 0xC8; public static final byte INT_16 = (byte) 0xC9; public static final byte INT_32 = (byte) 0xCA; @@ -102,38 +111,86 @@ public class PackStream { public static final byte BYTES_8 = (byte) 0xCC; public static final byte BYTES_16 = (byte) 0xCD; public static final byte BYTES_32 = (byte) 0xCE; + + @SuppressWarnings("unused") public static final byte RESERVED_CF = (byte) 0xCF; + public static final byte STRING_8 = (byte) 0xD0; public static final byte STRING_16 = (byte) 0xD1; public static final byte STRING_32 = (byte) 0xD2; + + @SuppressWarnings("unused") public static final byte RESERVED_D3 = (byte) 0xD3; + public static final byte LIST_8 = (byte) 0xD4; public static final byte LIST_16 = (byte) 0xD5; public static final byte LIST_32 = (byte) 0xD6; + + @SuppressWarnings("unused") public static final byte RESERVED_D7 = (byte) 0xD7; + public static final byte MAP_8 = (byte) 0xD8; public static final byte MAP_16 = (byte) 0xD9; public static final byte MAP_32 = (byte) 0xDA; + + @SuppressWarnings("unused") public static final byte RESERVED_DB = (byte) 0xDB; + public static final byte STRUCT_8 = (byte) 0xDC; public static final byte STRUCT_16 = (byte) 0xDD; + + @SuppressWarnings("unused") public static final byte RESERVED_DE = (byte) 0xDE; + + @SuppressWarnings("unused") public static final byte RESERVED_DF = (byte) 0xDF; + + @SuppressWarnings("unused") public static final byte RESERVED_E0 = (byte) 0xE0; + + @SuppressWarnings("unused") public static final byte RESERVED_E1 = (byte) 0xE1; + + @SuppressWarnings("unused") public static final byte RESERVED_E2 = (byte) 0xE2; + + @SuppressWarnings("unused") public static final byte RESERVED_E3 = (byte) 0xE3; + + @SuppressWarnings("unused") public static final byte RESERVED_E4 = (byte) 0xE4; + + @SuppressWarnings("unused") public static final byte RESERVED_E5 = (byte) 0xE5; + + @SuppressWarnings("unused") public static final byte RESERVED_E6 = (byte) 0xE6; + + @SuppressWarnings("unused") public static final byte RESERVED_E7 = (byte) 0xE7; + + @SuppressWarnings("unused") public static final byte RESERVED_E8 = (byte) 0xE8; + + @SuppressWarnings("unused") public static final byte RESERVED_E9 = (byte) 0xE9; + + @SuppressWarnings("unused") public static final byte RESERVED_EA = (byte) 0xEA; + + @SuppressWarnings("unused") public static final byte RESERVED_EB = (byte) 0xEB; + + @SuppressWarnings("unused") public static final byte RESERVED_EC = (byte) 0xEC; + + @SuppressWarnings("unused") public static final byte RESERVED_ED = (byte) 0xED; + + @SuppressWarnings("unused") public static final byte RESERVED_EE = (byte) 0xEE; + + @SuppressWarnings("unused") public static final byte RESERVED_EF = (byte) 0xEF; private static final long PLUS_2_TO_THE_31 = 2147483648L; diff --git a/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java b/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java index 9e4ef4fda6..df30f40353 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java +++ b/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java @@ -33,8 +33,6 @@ public interface ConnectionPool { int inUseConnections(ServerAddress address); - int idleConnections(ServerAddress address); - CompletionStage close(); boolean isOpen(BoltServerAddress address); diff --git a/driver/src/main/java/org/neo4j/driver/internal/summary/InternalPlan.java b/driver/src/main/java/org/neo4j/driver/internal/summary/InternalPlan.java index a43cfa43a3..c8755df0b2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/summary/InternalPlan.java +++ b/driver/src/main/java/org/neo4j/driver/internal/summary/InternalPlan.java @@ -97,11 +97,6 @@ public int hashCode() { return result; } - public static Plan plan( - String operatorType, Map arguments, List identifiers, List children) { - return EXPLAIN_PLAN.create(operatorType, arguments, identifiers, children, null); - } - public static final PlanCreator EXPLAIN_PLAN = (operatorType, arguments, identifiers, children, originalPlanValue) -> new InternalPlan<>(operatorType, arguments, identifiers, children); diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/CertificateTool.java b/driver/src/main/java/org/neo4j/driver/internal/util/CertificateTool.java index 08246c3913..fd829d4438 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/CertificateTool.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/CertificateTool.java @@ -41,25 +41,6 @@ public final class CertificateTool { private static final String BEGIN_CERT = "-----BEGIN CERTIFICATE-----"; private static final String END_CERT = "-----END CERTIFICATE-----"; - /** - * Save a certificate to a file in base 64 binary format with BEGIN and END strings - * @param certStr - * @param certFile - * @throws IOException - */ - public static void saveX509Cert(String certStr, File certFile) throws IOException { - try (var writer = new BufferedWriter(new FileWriter(certFile))) { - writer.write(BEGIN_CERT); - writer.newLine(); - - writer.write(certStr); - writer.newLine(); - - writer.write(END_CERT); - writer.newLine(); - } - } - /** * Save a certificate to a file. Remove all the content in the file if there is any before. * @@ -152,15 +133,5 @@ public static void loadX509Cert(Certificate cert, String certAlias, KeyStore key keyStore.setCertificateEntry(certAlias, cert); } - /** - * Convert a certificate in base 64 binary format with BEGIN and END strings - * @param cert encoded cert string - * @return - */ - public static String X509CertToString(String cert) { - var cert64CharPerLine = cert.replaceAll("(.{64})", "$1\n"); - return String.join("\n", BEGIN_CERT, cert64CharPerLine, END_CERT) + "\n"; - } - private CertificateTool() {} } diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/ErrorUtil.java b/driver/src/main/java/org/neo4j/driver/internal/util/ErrorUtil.java index 1c0fe0bd24..9432237827 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/ErrorUtil.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/ErrorUtil.java @@ -19,7 +19,6 @@ package org.neo4j.driver.internal.util; import java.io.Serial; -import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; import org.neo4j.driver.exceptions.AuthenticationException; @@ -162,19 +161,6 @@ public static void addSuppressed(Throwable mainError, Throwable error) { } } - public static Throwable getRootCause(Throwable error) { - Objects.requireNonNull(error); - var cause = error.getCause(); - if (cause == null) { - // Nothing causes this error, returns the error itself - return error; - } - while (cause.getCause() != null) { - cause = cause.getCause(); - } - return cause; - } - /** * Exception which is merely a holder of an async stacktrace, which is not the primary stacktrace users are interested in. * Used for blocking API calls that block on async API calls. diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/Iterables.java b/driver/src/main/java/org/neo4j/driver/internal/util/Iterables.java index 5d06f8e168..9268232da8 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/Iterables.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/Iterables.java @@ -26,7 +26,6 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Queue; import java.util.function.Function; @@ -70,14 +69,6 @@ public static T single(Iterable it) { return result; } - public static Map map(String... alternatingKeyValue) { - Map out = newHashMapWithSize(alternatingKeyValue.length / 2); - for (var i = 0; i < alternatingKeyValue.length; i += 2) { - out.put(alternatingKeyValue[i], alternatingKeyValue[i + 1]); - } - return out; - } - public static Iterable map(final Iterable it, final Function f) { return () -> { final var aIterator = it.iterator(); diff --git a/driver/src/test/java/org/neo4j/driver/integration/ConnectionHandlingIT.java b/driver/src/test/java/org/neo4j/driver/integration/ConnectionHandlingIT.java index 886d7c3314..9cb7c070f3 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/ConnectionHandlingIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/ConnectionHandlingIT.java @@ -279,7 +279,7 @@ void connectionUsedForSessionRunReturnedToThePoolWhenSessionClose() { @Test void connectionUsedForBeginTxReturnedToThePoolWhenSessionClose() { var session = driver.session(); - var tx = session.beginTransaction(); + session.beginTransaction(); var connection1 = connectionPool.lastAcquiredConnectionSpy; verify(connection1, never()).release(); diff --git a/driver/src/test/java/org/neo4j/driver/integration/MetricsIT.java b/driver/src/test/java/org/neo4j/driver/integration/MetricsIT.java index 51ddbfa21c..fa5939c196 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/MetricsIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/MetricsIT.java @@ -19,20 +19,18 @@ package org.neo4j.driver.integration; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.neo4j.driver.Values.parameters; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import org.junit.Test; +import java.util.Map; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.neo4j.driver.Config; import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; import org.neo4j.driver.MetricsAdapter; -import org.neo4j.driver.QueryRunner; -import org.neo4j.driver.Result; import org.neo4j.driver.testutil.DatabaseExtension; import org.neo4j.driver.testutil.ParallelizableIT; @@ -41,15 +39,19 @@ class MetricsIT { @RegisterExtension static final DatabaseExtension neo4j = new DatabaseExtension(); + private final MeterRegistry meterRegistry = Metrics.globalRegistry; + private final long fetchSize = 5; + private Driver driver; - private final MeterRegistry meterRegistry = new SimpleMeterRegistry(); @BeforeEach void createDriver() { - driver = GraphDatabase.driver( - neo4j.uri(), - neo4j.authTokenManager(), - Config.builder().withMetricsAdapter(MetricsAdapter.MICROMETER).build()); + Metrics.addRegistry(new SimpleMeterRegistry()); + var config = Config.builder() + .withFetchSize(fetchSize) + .withMetricsAdapter(MetricsAdapter.MICROMETER) + .build(); + driver = neo4j.customDriver(config); } @AfterEach @@ -59,31 +61,23 @@ void closeDriver() { @Test void driverMetricsUpdatedWithDriverUse() { - var result = createNodesInNewSession(); - // assert in use - var acquisitionTimer = - meterRegistry.get("neo4j.driver.connections.acquisition").timer(); - var creationTimer = - meterRegistry.get("neo4j.driver.connections.creation").timer(); - var usageTimer = meterRegistry.get("neo4j.driver.connections.usage").timer(); - assertEquals(1, acquisitionTimer.count()); - assertEquals(1, creationTimer.count()); - assertEquals(0, usageTimer.count()); - - result.consume(); - // assert released - assertEquals(1, acquisitionTimer.count()); - assertEquals(1, creationTimer.count()); - assertEquals(1, usageTimer.count()); - } - - private Result createNodesInNewSession() { - return createNodes(12, driver.session()); - } + try (var session = driver.session()) { + var result = session.run("UNWIND range(1, $limit) AS x RETURN x", Map.of("limit", fetchSize + 1)); + // assert in use + var acquisitionTimer = + meterRegistry.get("neo4j.driver.connections.acquisition").timer(); + var creationTimer = + meterRegistry.get("neo4j.driver.connections.creation").timer(); + var usageTimer = meterRegistry.get("neo4j.driver.connections.usage").timer(); + assertEquals(1, acquisitionTimer.count()); + assertEquals(1, creationTimer.count()); + assertEquals(0, usageTimer.count()); - private Result createNodes(int nodesToCreate, QueryRunner queryRunner) { - return queryRunner.run( - "UNWIND range(1, $nodesToCreate) AS i CREATE (n {index: i}) RETURN n", - parameters("nodesToCreate", nodesToCreate)); + result.consume(); + // assert released + assertEquals(1, acquisitionTimer.count()); + assertEquals(1, creationTimer.count()); + assertEquals(1, usageTimer.count()); + } } } diff --git a/driver/src/test/java/org/neo4j/driver/integration/SessionIT.java b/driver/src/test/java/org/neo4j/driver/integration/SessionIT.java index 84d5cb721e..c540a41397 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/SessionIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/SessionIT.java @@ -810,7 +810,7 @@ void shouldNotRetryOnConnectionAcquisitionTimeout() { void shouldReportFailureInClose() { var session = neo4j.driver().session(); - var result = session.run("CYPHER runtime=interpreted UNWIND [2, 4, 8, 0] AS x RETURN 32 / x"); + session.run("CYPHER runtime=interpreted UNWIND [2, 4, 8, 0] AS x RETURN 32 / x"); var e = assertThrows(ClientException.class, session::close); assertThat(e, is(arithmeticError())); diff --git a/driver/src/test/java/org/neo4j/driver/integration/SessionMixIT.java b/driver/src/test/java/org/neo4j/driver/integration/SessionMixIT.java index e37fd800a2..98e7525499 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/SessionMixIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/SessionMixIT.java @@ -28,15 +28,12 @@ import static org.neo4j.driver.internal.util.Matchers.blockingOperationInEventLoopError; import static org.neo4j.driver.testutil.TestUtil.await; -import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.neo4j.driver.Query; -import org.neo4j.driver.Record; import org.neo4j.driver.Result; import org.neo4j.driver.Session; import org.neo4j.driver.TransactionConfig; @@ -44,7 +41,6 @@ import org.neo4j.driver.async.AsyncTransactionWork; import org.neo4j.driver.async.ResultCursor; import org.neo4j.driver.internal.async.connection.EventLoopGroupFactory; -import org.neo4j.driver.internal.util.Futures; import org.neo4j.driver.testutil.DatabaseExtension; import org.neo4j.driver.testutil.ParallelizableIT; @@ -167,46 +163,6 @@ void shouldAllowBlockingOperationInCommonPoolWhenChaining() { assertEquals(1, countNodes()); } - private void runNestedQueries( - ResultCursor inputCursor, - List> stages, - CompletableFuture>> resultFuture) { - final var recordResponse = inputCursor.nextAsync(); - stages.add(recordResponse); - - recordResponse.whenComplete((record, error) -> { - if (error != null) { - resultFuture.completeExceptionally(error); - } else if (record != null) { - runNestedQuery(inputCursor, record, stages, resultFuture); - } else { - resultFuture.complete(stages); - } - }); - } - - private void runNestedQuery( - ResultCursor inputCursor, - Record record, - List> stages, - CompletableFuture>> resultFuture) { - var node = record.get(0).asNode(); - var id = node.get("id").asLong(); - var age = id * 10; - - var response = asyncSession.runAsync( - "MATCH (p:Person {id: $id}) SET p.age = $age RETURN p", parameters("id", id, "age", age)); - - response.whenComplete((cursor, error) -> { - if (error != null) { - resultFuture.completeExceptionally(Futures.completionExceptionCause(error)); - } else { - stages.add(cursor.nextAsync()); - runNestedQueries(inputCursor, stages, resultFuture); - } - }); - } - private long countNodes() { var countStage = asyncSession .runAsync("MATCH (n:Node) RETURN count(n)") diff --git a/driver/src/test/java/org/neo4j/driver/integration/reactive/RxResultIT.java b/driver/src/test/java/org/neo4j/driver/integration/reactive/RxResultIT.java index 39716454fb..344db2d973 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/reactive/RxResultIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/reactive/RxResultIT.java @@ -350,7 +350,7 @@ void shouldErrorToAccessSummaryAfterSessionClose() { void shouldErrorToAccessRecordAfterTxClose() { // Given var session = neo4j.driver().rxSession(); - var result = session.run("UNWIND [1,2] AS a RETURN a"); + session.run("UNWIND [1,2] AS a RETURN a"); // When StepVerifier.create(Flux.from(session.beginTransaction()) @@ -367,7 +367,7 @@ void shouldErrorToAccessRecordAfterTxClose() { void shouldErrorToAccessKeysAfterTxClose() { // Given var session = neo4j.driver().rxSession(); - var result = session.run("UNWIND [1,2] AS a RETURN a"); + session.run("UNWIND [1,2] AS a RETURN a"); // When StepVerifier.create(Flux.from(session.beginTransaction()) @@ -384,7 +384,7 @@ void shouldErrorToAccessKeysAfterTxClose() { void shouldErrorToAccessSummaryAfterTxClose() { // Given var session = neo4j.driver().rxSession(); - var result = session.run("UNWIND [1,2] AS a RETURN a"); + session.run("UNWIND [1,2] AS a RETURN a"); // When StepVerifier.create(Flux.from(session.beginTransaction()) @@ -401,7 +401,7 @@ void shouldErrorToAccessSummaryAfterTxClose() { void throwErrorAfterKeys() { // Given var session = neo4j.driver().rxSession(); - var result = session.run("UNWIND [1,2] AS a RETURN a"); + session.run("UNWIND [1,2] AS a RETURN a"); // When StepVerifier.create(Flux.from(session.beginTransaction()) diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java index 5a65470489..f5b7f1a8b0 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java @@ -116,7 +116,7 @@ void shouldRegisterAuthorizationStateListenerWithChannel() throws ExecutionExcep var nettyChannelTracker = mock(NettyChannelTracker.class); var nettyChannelHealthChecker = mock(NettyChannelHealthChecker.class); var channelArgumentCaptor = ArgumentCaptor.forClass(Channel.class); - var pool = newConnectionPool(nettyChannelTracker, nettyChannelHealthChecker); + var pool = newConnectionPool(nettyChannelTracker); pool.acquire(ADDRESS_1, null).toCompletableFuture().get(); verify(nettyChannelTracker).channelAcquired(channelArgumentCaptor.capture()); @@ -130,15 +130,9 @@ private static PoolSettings newSettings() { } private static TestConnectionPool newConnectionPool(NettyChannelTracker nettyChannelTracker) { - return newConnectionPool(nettyChannelTracker, mock(NettyChannelHealthChecker.class)); - } - - private static TestConnectionPool newConnectionPool( - NettyChannelTracker nettyChannelTracker, NettyChannelHealthChecker nettyChannelHealthChecker) { return new TestConnectionPool( mock(Bootstrap.class), nettyChannelTracker, - nettyChannelHealthChecker, newSettings(), DevNullMetricsListener.INSTANCE, DEV_NULL_LOGGING, diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthCheckerTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthCheckerTest.java index a1dfcb107d..a81e9d185a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthCheckerTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelHealthCheckerTest.java @@ -56,7 +56,6 @@ import org.junit.jupiter.params.provider.MethodSource; import org.neo4j.driver.AuthTokenManager; import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.exceptions.AuthorizationExpiredException; import org.neo4j.driver.internal.async.inbound.InboundMessageDispatcher; import org.neo4j.driver.internal.messaging.BoltProtocolVersion; import org.neo4j.driver.internal.messaging.request.ResetMessage; @@ -162,8 +161,7 @@ void shouldFailAllConnectionsCreatedOnOrBeforeExpirationTimestamp(BoltProtocolVe var authorizationExpiredChannelIndex = channels.size() / 2 - 1; given(clock.millis()).willReturn((long) authorizationExpiredChannelIndex); - healthChecker.onExpired( - new AuthorizationExpiredException("", ""), channels.get(authorizationExpiredChannelIndex)); + healthChecker.onExpired(); for (var i = 0; i < channels.size(); i++) { var channel = channels.get(i); @@ -204,8 +202,7 @@ void shouldMarkForLogoffAllConnectionsCreatedOnOrBeforeExpirationTimestamp() { var authorizationExpiredChannelIndex = channels.size() / 2 - 1; given(clock.millis()).willReturn((long) authorizationExpiredChannelIndex); - healthChecker.onExpired( - new AuthorizationExpiredException("", ""), channels.get(authorizationExpiredChannelIndex)); + healthChecker.onExpired(); for (var i = 0; i < channels.size(); i++) { var channel = channels.get(i); @@ -227,19 +224,17 @@ void shouldUseGreatestExpirationTimestamp() { DEFAULT_CONNECTION_ACQUISITION_TIMEOUT, NOT_CONFIGURED, DEFAULT_IDLE_TIME_BEFORE_CONNECTION_TEST); - var clock = Clock.systemUTC(); + var clock = mock(Clock.class); + given(clock.millis()).willReturn(0L).willReturn(100L); var healthChecker = newHealthChecker(settings, clock); - var initialTimestamp = clock.millis(); var channel1 = new EmbeddedChannel(); var channel2 = new EmbeddedChannel(); - setCreationTimestamp(channel1, initialTimestamp); - setCreationTimestamp(channel2, initialTimestamp + 100); setAuthContext(channel1, new AuthContext(new StaticAuthTokenManager(AuthTokens.none()))); setAuthContext(channel2, new AuthContext(new StaticAuthTokenManager(AuthTokens.none()))); - healthChecker.onExpired(new AuthorizationExpiredException("", ""), channel2); - healthChecker.onExpired(new AuthorizationExpiredException("", ""), channel1); + healthChecker.onExpired(); + healthChecker.onExpired(); var healthy = healthChecker.isHealthy(channel1); channel1.runPendingTasks(); @@ -247,6 +242,7 @@ void shouldUseGreatestExpirationTimestamp() { healthy = healthChecker.isHealthy(channel2); channel2.runPendingTasks(); assertFalse(Objects.requireNonNull(await(healthy))); + then(clock).should(times(2)).millis(); } @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java index 765c3a716d..8c52dfbf2e 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java @@ -142,7 +142,7 @@ void shouldAllowAcquireAfterFailures() { pool = newPool(new StaticAuthTokenManager(authToken), maxConnections); for (var i = 0; i < maxConnections; i++) { - var e = assertThrows(AuthenticationException.class, () -> acquire(pool)); + assertThrows(AuthenticationException.class, () -> acquire(pool)); } authTokenMap.put("credentials", value(neo4j.adminPassword())); diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/TestConnectionPool.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/TestConnectionPool.java index 00f746d995..15a2fd02ee 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/TestConnectionPool.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/TestConnectionPool.java @@ -47,7 +47,6 @@ public class TestConnectionPool extends ConnectionPoolImpl { public TestConnectionPool( Bootstrap bootstrap, NettyChannelTracker nettyChannelTracker, - NettyChannelHealthChecker nettyChannelHealthChecker, PoolSettings settings, MetricsListener metricsListener, Logging logging, diff --git a/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java b/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java index 27117f5fe9..783a77b0e4 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/cluster/loadbalancing/RoutingTableAndConnectionPoolTest.java @@ -63,7 +63,6 @@ import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.DatabaseNameUtil; import org.neo4j.driver.internal.async.connection.BootstrapFactory; -import org.neo4j.driver.internal.async.pool.NettyChannelHealthChecker; import org.neo4j.driver.internal.async.pool.NettyChannelTracker; import org.neo4j.driver.internal.async.pool.PoolSettings; import org.neo4j.driver.internal.async.pool.TestConnectionPool; @@ -313,10 +312,8 @@ private ConnectionPool newConnectionPool() { var bootstrap = BootstrapFactory.newBootstrap(1); var channelTracker = new NettyChannelTracker(metrics, bootstrap.config().group().next(), logging); - var channelHealthChecker = new NettyChannelHealthChecker(poolSettings, clock, logging); - return new TestConnectionPool( - bootstrap, channelTracker, channelHealthChecker, poolSettings, metrics, logging, clock, true); + return new TestConnectionPool(bootstrap, channelTracker, poolSettings, metrics, logging, clock, true); } private RoutingTableRegistryImpl newRoutingTables(ConnectionPool connectionPool, Rediscovery rediscovery) { diff --git a/driver/src/test/java/org/neo4j/driver/internal/handlers/ResetResponseHandlerTest.java b/driver/src/test/java/org/neo4j/driver/internal/handlers/ResetResponseHandlerTest.java index 6761c3f70a..42bf11be14 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/handlers/ResetResponseHandlerTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/handlers/ResetResponseHandlerTest.java @@ -67,9 +67,4 @@ void shouldThrowWhenOnRecord() { private static ResetResponseHandler newHandler(CompletableFuture future) { return new ResetResponseHandler(mock(InboundMessageDispatcher.class), future); } - - private static ResetResponseHandler newHandler( - InboundMessageDispatcher messageDispatcher, CompletableFuture future) { - return new ResetResponseHandler(messageDispatcher, future); - } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/metrics/MicrometerConnectionPoolMetricsTest.java b/driver/src/test/java/org/neo4j/driver/internal/metrics/MicrometerConnectionPoolMetricsTest.java index 39c494fb68..0dcab16228 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/metrics/MicrometerConnectionPoolMetricsTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/metrics/MicrometerConnectionPoolMetricsTest.java @@ -32,14 +32,12 @@ import org.junit.jupiter.api.Test; import org.neo4j.driver.ConnectionPoolMetrics; import org.neo4j.driver.internal.BoltServerAddress; -import org.neo4j.driver.internal.spi.ConnectionPool; class MicrometerConnectionPoolMetricsTest { static final String ID = "id"; MicrometerConnectionPoolMetrics metrics; BoltServerAddress address; - ConnectionPool pool; MeterRegistry registry; final AtomicInteger inUse = new AtomicInteger(0); final IntSupplier inUseSupplier = inUse::get; @@ -49,7 +47,6 @@ class MicrometerConnectionPoolMetricsTest { @BeforeEach void beforeEach() { address = new BoltServerAddress("host", "127.0.0.1", 7687); - pool = mock(ConnectionPool.class); registry = new SimpleMeterRegistry(); metrics = new MicrometerConnectionPoolMetrics(ID, address, inUseSupplier, idleSupplier, registry); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/util/BookmarkUtil.java b/driver/src/test/java/org/neo4j/driver/internal/util/BookmarkUtil.java index 799472457f..bc0275d02d 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/util/BookmarkUtil.java +++ b/driver/src/test/java/org/neo4j/driver/internal/util/BookmarkUtil.java @@ -74,18 +74,6 @@ public static void assertBookmarkContainsSingleValue(Bookmark bookmark, Matcher< assertThat(values.get(0), matcher); } - /** - * Bookmark contains values matching the requirement set by matcher. - */ - @SuppressWarnings("deprecation") - public static void assertBookmarkContainsValues(Bookmark bookmark, Matcher> matcher) { - assertNotNull(bookmark); - assertThat(bookmark, instanceOf(InternalBookmark.class)); - - var values = asList(((InternalBookmark) bookmark).values()); - assertThat(values, matcher); - } - /** * Each bookmark contains one single value and the values are all different from each other. */ diff --git a/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jEdition.java b/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jEdition.java index 8bde49a21b..ed74045fba 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jEdition.java +++ b/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jEdition.java @@ -20,7 +20,6 @@ public enum Neo4jEdition { UNDEFINED("n/a"), - COMMUNITY("community"), ENTERPRISE("enterprise"); private final String value; diff --git a/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jFeature.java b/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jFeature.java index b1ad8a2255..216f179de6 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jFeature.java +++ b/driver/src/test/java/org/neo4j/driver/internal/util/Neo4jFeature.java @@ -26,7 +26,6 @@ public enum Neo4jFeature { TEMPORAL_TYPES(new Version(3, 4, 0)), BOLT_V3(new Version(3, 5, 0)), BOLT_V4(new Version(4, 0, 0)), - BOLT_V5(new Version(5, 0, 0)), BOLT_V51(new Version(5, 5, 0)); private final Version availableFromVersion; diff --git a/driver/src/test/java/org/neo4j/driver/internal/util/ThrowingMessageEncoder.java b/driver/src/test/java/org/neo4j/driver/internal/util/ThrowingMessageEncoder.java deleted file mode 100644 index 0c9fe50265..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/util/ThrowingMessageEncoder.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.util; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToMessageEncoder; -import java.util.List; - -public class ThrowingMessageEncoder extends MessageToMessageEncoder { - private final RuntimeException error; - - private ThrowingMessageEncoder(Class messageType, RuntimeException error) { - super(messageType); - this.error = error; - } - - @Override - protected void encode(ChannelHandlerContext ctx, T msg, List out) { - ctx.pipeline().remove(this); - throw error; - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AbstractContext.java b/driver/src/test/java/org/neo4j/driver/stress/AbstractContext.java index f6dc488942..728fa71744 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/AbstractContext.java +++ b/driver/src/test/java/org/neo4j/driver/stress/AbstractContext.java @@ -21,7 +21,6 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.neo4j.driver.Bookmark; -import org.neo4j.driver.summary.ResultSummary; public abstract class AbstractContext { private volatile boolean stopped; @@ -54,7 +53,7 @@ public final long getCreatedNodesCount() { return createdNodesCount.get(); } - public final void readCompleted(ResultSummary summary) { + public final void readCompleted() { readNodesCount.incrementAndGet(); } diff --git a/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java b/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java index ff0273e96e..c4b08a745d 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java +++ b/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java @@ -213,10 +213,6 @@ List> createTestSpecificBlockingCommands() { return Collections.emptyList(); } - List> createTestSpecificAsyncCommands() { - return Collections.emptyList(); - } - List> createTestSpecificRxCommands() { return Collections.emptyList(); } diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java deleted file mode 100644 index b465060c5b..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.junit.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.neo4j.driver.internal.util.Matchers.arithmeticError; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.internal.util.Futures; - -public class AsyncFailingQuery extends AbstractAsyncQuery { - public AsyncFailingQuery(Driver driver) { - super(driver, false); - } - - @Override - public CompletionStage execute(C context) { - var session = newSession(AccessMode.READ, context); - - return session.runAsync("UNWIND [10, 5, 0] AS x RETURN 10 / x") - .thenCompose(ResultCursor::listAsync) - .handle((records, error) -> { - session.closeAsync(); - - assertNull(records); - var cause = Futures.completionExceptionCause(error); - assertThat(cause, is(arithmeticError())); - - return null; - }); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java deleted file mode 100644 index 80d3b49dc6..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.hamcrest.Matchers.is; -import static org.hamcrest.junit.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.neo4j.driver.internal.util.Matchers.arithmeticError; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.async.AsyncTransaction; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.internal.util.Futures; - -public class AsyncFailingQueryInTx extends AbstractAsyncQuery { - public AsyncFailingQueryInTx(Driver driver) { - super(driver, false); - } - - @Override - public CompletionStage execute(C context) { - var session = newSession(AccessMode.READ, context); - - return session.beginTransactionAsync() - .thenCompose(tx -> tx.runAsync("UNWIND [10, 5, 0] AS x RETURN 10 / x") - .thenCompose(ResultCursor::listAsync) - .handle((records, error) -> { - assertNull(records); - var cause = Futures.completionExceptionCause(error); - assertThat(cause, is(arithmeticError())); - - return tx; - })) - .thenCompose(AsyncTransaction::rollbackAsync) - .whenComplete((ignore, error) -> session.closeAsync()); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java deleted file mode 100644 index b91b882d0f..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.Record; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.summary.ResultSummary; - -public class AsyncReadQuery extends AbstractAsyncQuery { - public AsyncReadQuery(Driver driver, boolean useBookmark) { - super(driver, useBookmark); - } - - @Override - public CompletionStage execute(C context) { - var session = newSession(AccessMode.READ, context); - - var queryFinished = session.runAsync("MATCH (n) RETURN n LIMIT 1") - .thenCompose(cursor -> cursor.nextAsync().thenCompose(record -> processAndGetSummary(record, cursor))); - - queryFinished.whenComplete((summary, error) -> { - if (summary != null) { - context.readCompleted(summary); - } - session.closeAsync(); - }); - - return queryFinished.thenApply(summary -> null); - } - - private CompletionStage processAndGetSummary(Record record, ResultCursor cursor) { - if (record != null) { - var node = record.get(0).asNode(); - assertNotNull(node); - } - return cursor.consumeAsync(); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java deleted file mode 100644 index df46e963b4..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.Record; -import org.neo4j.driver.async.AsyncTransaction; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.summary.ResultSummary; - -public class AsyncReadQueryInTx extends AbstractAsyncQuery { - public AsyncReadQueryInTx(Driver driver, boolean useBookmark) { - super(driver, useBookmark); - } - - @Override - public CompletionStage execute(C ctx) { - var session = newSession(AccessMode.READ, ctx); - - var txCommitted = session.beginTransactionAsync() - .thenCompose(tx -> tx.runAsync("MATCH (n) RETURN n LIMIT 1").thenCompose(cursor -> cursor.nextAsync() - .thenCompose(record -> processRecordAndGetSummary(record, cursor) - .thenCompose(summary -> processSummaryAndCommit(summary, tx, ctx))))); - - txCommitted.whenComplete((ignore, error) -> session.closeAsync()); - - return txCommitted; - } - - private CompletionStage processRecordAndGetSummary(Record record, ResultCursor cursor) { - if (record != null) { - var node = record.get(0).asNode(); - assertNotNull(node); - } - return cursor.consumeAsync(); - } - - private CompletionStage processSummaryAndCommit(ResultSummary summary, AsyncTransaction tx, C context) { - context.readCompleted(summary); - return tx.commitAsync(); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryWithRetries.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryWithRetries.java index 91bbace3a9..2ff509ba96 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryWithRetries.java +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryWithRetries.java @@ -56,7 +56,7 @@ private CompletionStage processRecordAndGetSummary(Record record, private Void processResultSummary(ResultSummary resultSummary, C context) { if (resultSummary != null) { - context.readCompleted(resultSummary); + context.readCompleted(); } return null; } diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java deleted file mode 100644 index 409cd37e30..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.internal.util.Futures; - -public class AsyncWriteQuery extends AbstractAsyncQuery { - private final AbstractStressTestBase stressTest; - - public AsyncWriteQuery(AbstractStressTestBase stressTest, Driver driver, boolean useBookmark) { - super(driver, useBookmark); - this.stressTest = stressTest; - } - - @Override - @SuppressWarnings("deprecation") - public CompletionStage execute(C context) { - var session = newSession(AccessMode.WRITE, context); - - return session.runAsync("CREATE ()") - .thenCompose(ResultCursor::consumeAsync) - .handle((summary, error) -> { - session.closeAsync(); - - if (error != null) { - handleError(Futures.completionExceptionCause(error), context); - } else { - context.setBookmark(session.lastBookmark()); - assertEquals(1, summary.counters().nodesCreated()); - context.nodeCreated(); - } - - return null; - }); - } - - private void handleError(Throwable error, C context) { - if (!stressTest.handleWriteFailure(error, context)) { - throw new RuntimeException(error); - } - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java deleted file mode 100644 index 5643a4e510..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.internal.util.Futures; - -public class AsyncWriteQueryInTx extends AbstractAsyncQuery { - private final AbstractStressTestBase stressTest; - - public AsyncWriteQueryInTx(AbstractStressTestBase stressTest, Driver driver, boolean useBookmark) { - super(driver, useBookmark); - this.stressTest = stressTest; - } - - @Override - @SuppressWarnings("deprecation") - public CompletionStage execute(C context) { - var session = newSession(AccessMode.WRITE, context); - - var txCommitted = session.beginTransactionAsync() - .thenCompose(tx -> tx.runAsync("CREATE ()").thenCompose(cursor -> cursor.consumeAsync() - .thenCompose(summary -> tx.commitAsync().thenApply(ignore -> { - context.setBookmark(session.lastBookmark()); - return summary; - })))); - - return txCommitted.handle((summary, error) -> { - session.closeAsync(); - - if (error != null) { - handleError(Futures.completionExceptionCause(error), context); - } else { - assertEquals(1, summary.counters().nodesCreated()); - context.nodeCreated(); - } - - return null; - }); - } - - private void handleError(Throwable error, C context) { - if (!stressTest.handleWriteFailure(error, context)) { - throw new RuntimeException(error); - } - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java deleted file mode 100644 index 992d74b693..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.junit.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.exceptions.ClientException; -import org.neo4j.driver.exceptions.Neo4jException; -import org.neo4j.driver.internal.util.Futures; - -public class AsyncWrongQuery extends AbstractAsyncQuery { - public AsyncWrongQuery(Driver driver) { - super(driver, false); - } - - @Override - public CompletionStage execute(C context) { - var session = newSession(AccessMode.READ, context); - - return session.runAsync("RETURN Wrong") - .thenCompose(ResultCursor::nextAsync) - .handle((record, error) -> { - session.closeAsync(); - assertNull(record); - - var cause = Futures.completionExceptionCause(error); - assertNotNull(cause); - assertThat(cause, instanceOf(ClientException.class)); - assertThat(((Neo4jException) cause).code(), containsString("SyntaxError")); - - return null; - }); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java deleted file mode 100644 index bb57b1ad1b..0000000000 --- a/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [http://neo4j.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.stress; - -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.junit.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -import java.util.concurrent.CompletionStage; -import org.neo4j.driver.AccessMode; -import org.neo4j.driver.Driver; -import org.neo4j.driver.async.AsyncTransaction; -import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.exceptions.ClientException; -import org.neo4j.driver.exceptions.Neo4jException; -import org.neo4j.driver.internal.util.Futures; - -public class AsyncWrongQueryInTx extends AbstractAsyncQuery { - public AsyncWrongQueryInTx(Driver driver) { - super(driver, false); - } - - @Override - public CompletionStage execute(C context) { - var session = newSession(AccessMode.READ, context); - - return session.beginTransactionAsync() - .thenCompose(tx -> tx.runAsync("RETURN Wrong") - .thenCompose(ResultCursor::nextAsync) - .handle((record, error) -> { - assertNull(record); - - var cause = Futures.completionExceptionCause(error); - assertNotNull(cause); - assertThat(cause, instanceOf(ClientException.class)); - assertThat(((Neo4jException) cause).code(), containsString("SyntaxError")); - - return tx; - })) - .thenCompose(AsyncTransaction::rollbackAsync) - .whenComplete((ignore, error) -> session.closeAsync()); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQuery.java b/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQuery.java index 26f1605051..a658020c1e 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQuery.java +++ b/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQuery.java @@ -40,7 +40,8 @@ var record = single(records); assertNotNull(node); } - context.readCompleted(result.consume()); + result.consume(); + context.readCompleted(); } } } diff --git a/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryInTx.java index 9293fada6b..97db3bc750 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryInTx.java +++ b/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryInTx.java @@ -41,7 +41,8 @@ var record = single(records); assertNotNull(node); } - context.readCompleted(result.consume()); + result.consume(); + context.readCompleted(); tx.commit(); } } diff --git a/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryWithRetries.java b/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryWithRetries.java index 52851d9bde..9aa05a7a8b 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryWithRetries.java +++ b/driver/src/test/java/org/neo4j/driver/stress/BlockingReadQueryWithRetries.java @@ -33,7 +33,7 @@ public BlockingReadQueryWithRetries(Driver driver, boolean useBookmark) { @SuppressWarnings("deprecation") public void execute(C context) { try (var session = newSession(AccessMode.READ, context)) { - var resultSummary = session.readTransaction(tx -> { + session.readTransaction(tx -> { var result = tx.run("MATCH (n) RETURN n LIMIT 1"); var records = result.list(); if (!records.isEmpty()) { @@ -44,7 +44,7 @@ var record = single(records); return result.consume(); }); - context.readCompleted(resultSummary); + context.readCompleted(); } } } diff --git a/driver/src/test/java/org/neo4j/driver/stress/RxReadQuery.java b/driver/src/test/java/org/neo4j/driver/stress/RxReadQuery.java index a2d2f0518f..3c4eaf9eb4 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/RxReadQuery.java +++ b/driver/src/test/java/org/neo4j/driver/stress/RxReadQuery.java @@ -43,7 +43,7 @@ public CompletionStage execute(C context) { RxSession::close) .subscribe( summary -> { - context.readCompleted(summary); + context.readCompleted(); queryFinished.complete(null); }, error -> { diff --git a/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryInTx.java index 1aacf83b09..3244b714f0 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryInTx.java +++ b/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryInTx.java @@ -46,7 +46,7 @@ public CompletionStage execute(C context) { null) .subscribe( summary -> { - context.readCompleted(summary); + context.readCompleted(); queryFinished.complete(null); }, error -> { diff --git a/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryWithRetries.java b/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryWithRetries.java index 0f10ae10d0..efee1c2f98 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryWithRetries.java +++ b/driver/src/test/java/org/neo4j/driver/stress/RxReadQueryWithRetries.java @@ -44,7 +44,7 @@ public CompletionStage execute(C context) { .subscribe( summary -> { queryFinished.complete(null); - context.readCompleted(summary); + context.readCompleted(); }, error -> { // ignores the error diff --git a/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java b/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java index cb9c1823f7..31ffb7cd51 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java +++ b/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java @@ -83,23 +83,6 @@ List> createTestSpecificBlockingCommands() { new BlockingFailingQueryInTx<>(driver)); } - @Override - List> createTestSpecificAsyncCommands() { - return Arrays.asList( - new AsyncReadQuery<>(driver, false), - new AsyncReadQuery<>(driver, true), - new AsyncReadQueryInTx<>(driver, false), - new AsyncReadQueryInTx<>(driver, true), - new AsyncWriteQuery<>(this, driver, false), - new AsyncWriteQuery<>(this, driver, true), - new AsyncWriteQueryInTx<>(this, driver, false), - new AsyncWriteQueryInTx<>(this, driver, true), - new AsyncWrongQuery<>(driver), - new AsyncWrongQueryInTx<>(driver), - new AsyncFailingQuery<>(driver), - new AsyncFailingQueryInTx<>(driver)); - } - @Override List> createTestSpecificRxCommands() { return Arrays.asList( diff --git a/driver/src/test/java/org/neo4j/driver/testutil/CertificateUtil.java b/driver/src/test/java/org/neo4j/driver/testutil/CertificateUtil.java index 261e31597a..a91309ec29 100644 --- a/driver/src/test/java/org/neo4j/driver/testutil/CertificateUtil.java +++ b/driver/src/test/java/org/neo4j/driver/testutil/CertificateUtil.java @@ -29,7 +29,6 @@ import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; import java.security.Provider; import java.security.PublicKey; import java.security.SecureRandom; @@ -162,10 +161,6 @@ public CertificateSigningRequestGenerator() throws NoSuchAlgorithmException, Ope csr = builder.build(signGen); } - public PrivateKey privateKey() { - return keyPair.getPrivate(); - } - public PublicKey publicKey() { return keyPair.getPublic(); } @@ -246,10 +241,6 @@ public C cert() { return pair.key(); } - public CertificateUtil.SelfSignedCertificateGenerator certGenerator() { - return this.certGenerator; - } - @Override public String toString() { return pair.toString(); diff --git a/driver/src/test/java/org/neo4j/driver/testutil/Neo4jSettings.java b/driver/src/test/java/org/neo4j/driver/testutil/Neo4jSettings.java index 373fad1e4c..43e37eeecd 100644 --- a/driver/src/test/java/org/neo4j/driver/testutil/Neo4jSettings.java +++ b/driver/src/test/java/org/neo4j/driver/testutil/Neo4jSettings.java @@ -18,29 +18,14 @@ */ package org.neo4j.driver.testutil; -import static org.neo4j.driver.internal.util.Iterables.map; - -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; public class Neo4jSettings { - public static final String DATA_DIR = "dbms.directories.data"; - public static final String IMPORT_DIR = "dbms.directories.import"; public static final String SSL_POLICY_BOLT_ENABLED = "dbms.ssl.policy.bolt.enabled"; public static final String SSL_POLICY_BOLT_CLIENT_AUTH = "dbms.ssl.policy.bolt.client_auth"; - // 5.0 - public static final String LISTEN_ADDR = "dbms.default_listen_address"; - public static final String IPV6_ENABLED_ADDR = "::"; public static final String BOLT_TLS_LEVEL = "dbms.connector.bolt.tls_level"; - private static final String DEFAULT_IMPORT_DIR = "import"; - public static final String DEFAULT_BOLT_TLS_LEVEL = BoltTlsLevel.OPTIONAL.toString(); - - public static final String DEFAULT_DATA_DIR = "data"; - static final int TEST_JVM_ID = Integer.getInteger("testJvmId", 0); private static final int DEFAULT_HTTP_PORT = 12000; @@ -48,54 +33,10 @@ public class Neo4jSettings { private static final int DEFAULT_BOLT_PORT = 14000; private static final int DEFAULT_DISCOVERY_LISTEN_PORT = 15000; private static final int DEFAULT_RAFT_ADVERTISED_PORT = 16000; - private static final int DEFAULT_TX_LISTEN_PORT = 17000; - - static final int CURRENT_HTTP_PORT = DEFAULT_HTTP_PORT + TEST_JVM_ID; - private static final int CURRENT_HTTPS_PORT = DEFAULT_HTTPS_PORT + TEST_JVM_ID; - static final int CURRENT_BOLT_PORT = DEFAULT_BOLT_PORT + TEST_JVM_ID; - static final int CURRENT_DISCOVERY_LISTEN_PORT = DEFAULT_DISCOVERY_LISTEN_PORT + TEST_JVM_ID; - static final int CURRENT_RAFT_ADVERTISED_PORT = DEFAULT_RAFT_ADVERTISED_PORT + TEST_JVM_ID; - static final int CURRENT_TX_LISTEN_PORT = DEFAULT_TX_LISTEN_PORT + TEST_JVM_ID; - - private static final String WINDOWS_SERVICE_NAME = "neo4j-" + TEST_JVM_ID; private final Map settings; private final Set excludes; - public static final Neo4jSettings TEST_SETTINGS = new Neo4jSettings( - map( - "dbms.connector.http.listen_address", - ":" + CURRENT_HTTP_PORT, - "dbms.connector.https.listen_address", - ":" + CURRENT_HTTPS_PORT, - "dbms.connector.bolt.listen_address", - ":" + CURRENT_BOLT_PORT, - "dbms.cluster.discovery.initial_members", - "localhost:" + CURRENT_DISCOVERY_LISTEN_PORT, - "server.discovery.listen_address", - ":" + CURRENT_DISCOVERY_LISTEN_PORT, - "cluster.raft_advertised_address", - ":" + CURRENT_RAFT_ADVERTISED_PORT, - "cluster.raft_listen_address", - ":" + CURRENT_RAFT_ADVERTISED_PORT, - "cluster.transaction_listen_address", - ":" + CURRENT_TX_LISTEN_PORT, - "cluster.transaction_advertised_address", - ":" + CURRENT_TX_LISTEN_PORT, - "server.cluster.advertised_address", - ":" + CURRENT_TX_LISTEN_PORT, - "dbms.windows_service_name", - WINDOWS_SERVICE_NAME, - DATA_DIR, - DEFAULT_DATA_DIR, - IMPORT_DIR, - DEFAULT_IMPORT_DIR, - BOLT_TLS_LEVEL, - DEFAULT_BOLT_TLS_LEVEL, - LISTEN_ADDR, - IPV6_ENABLED_ADDR), - Collections.emptySet()); - public enum BoltTlsLevel { OPTIONAL, REQUIRED, @@ -107,19 +48,6 @@ private Neo4jSettings(Map settings, Set excludes) { this.excludes = excludes; } - public Map propertiesMap() { - return settings; - } - - public Neo4jSettings without(String key) { - Set newExcludes = new HashSet<>(excludes); - newExcludes.add(key); - Map newMap = new HashMap<>(this.settings); - newMap.remove(key); - var newSettings = new Neo4jSettings(newMap, newExcludes); - return newSettings; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -141,8 +69,4 @@ public boolean equals(Object o) { public int hashCode() { return settings.hashCode(); } - - public Set excludes() { - return excludes; - } } diff --git a/driver/src/test/java/org/neo4j/driver/testutil/StdIOCapture.java b/driver/src/test/java/org/neo4j/driver/testutil/StdIOCapture.java index 815683fc9e..1cca46e282 100644 --- a/driver/src/test/java/org/neo4j/driver/testutil/StdIOCapture.java +++ b/driver/src/test/java/org/neo4j/driver/testutil/StdIOCapture.java @@ -56,10 +56,6 @@ public List stdout() { return stdout; } - public List stderr() { - return stderr; - } - @Override public void close() throws UnsupportedEncodingException { System.setOut(originalStdOut); diff --git a/driver/src/test/java/org/neo4j/driver/testutil/TestUtil.java b/driver/src/test/java/org/neo4j/driver/testutil/TestUtil.java index b0e137d31c..2fb1691bd9 100644 --- a/driver/src/test/java/org/neo4j/driver/testutil/TestUtil.java +++ b/driver/src/test/java/org/neo4j/driver/testutil/TestUtil.java @@ -131,12 +131,6 @@ public static List await(Flux publisher) { return publisher.collectList().block(Duration.ofMillis(DEFAULT_WAIT_TIME_MS)); } - @SafeVarargs - @SuppressWarnings("varargs") - public static List awaitAll(CompletionStage... stages) { - return awaitAll(Arrays.asList(stages)); - } - public static List awaitAll(List> stages) { return stages.stream().map(TestUtil::await).collect(toList()); } From 21b3b41176e719bf242e7a0b82d3d9632cb9b75c Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Wed, 12 Apr 2023 14:29:11 +0100 Subject: [PATCH 2/2] Enable async specific test commands --- .../driver/stress/AbstractStressTestBase.java | 6 ++ .../driver/stress/AsyncFailingQuery.java | 53 +++++++++++++++ .../driver/stress/AsyncFailingQueryInTx.java | 55 +++++++++++++++ .../neo4j/driver/stress/AsyncReadQuery.java | 59 ++++++++++++++++ .../driver/stress/AsyncReadQueryInTx.java | 62 +++++++++++++++++ .../neo4j/driver/stress/AsyncWriteQuery.java | 64 ++++++++++++++++++ .../driver/stress/AsyncWriteQueryInTx.java | 67 +++++++++++++++++++ .../neo4j/driver/stress/AsyncWrongQuery.java | 58 ++++++++++++++++ .../driver/stress/AsyncWrongQueryInTx.java | 61 +++++++++++++++++ .../driver/stress/SingleInstanceStressIT.java | 17 +++++ 10 files changed, 502 insertions(+) create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java create mode 100644 driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java diff --git a/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java b/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java index c4b08a745d..27b2a8f2e3 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java +++ b/driver/src/test/java/org/neo4j/driver/stress/AbstractStressTestBase.java @@ -213,6 +213,10 @@ List> createTestSpecificBlockingCommands() { return Collections.emptyList(); } + List> createTestSpecificAsyncCommands() { + return Collections.emptyList(); + } + List> createTestSpecificRxCommands() { return Collections.emptyList(); } @@ -330,6 +334,8 @@ private List> createAsyncCommands() { commands.add(new AsyncFailingQueryWithRetries<>(driver)); + commands.addAll(createTestSpecificAsyncCommands()); + return commands; } diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java new file mode 100644 index 0000000000..b465060c5b --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQuery.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.junit.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.neo4j.driver.internal.util.Matchers.arithmeticError; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.internal.util.Futures; + +public class AsyncFailingQuery extends AbstractAsyncQuery { + public AsyncFailingQuery(Driver driver) { + super(driver, false); + } + + @Override + public CompletionStage execute(C context) { + var session = newSession(AccessMode.READ, context); + + return session.runAsync("UNWIND [10, 5, 0] AS x RETURN 10 / x") + .thenCompose(ResultCursor::listAsync) + .handle((records, error) -> { + session.closeAsync(); + + assertNull(records); + var cause = Futures.completionExceptionCause(error); + assertThat(cause, is(arithmeticError())); + + return null; + }); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java new file mode 100644 index 0000000000..80d3b49dc6 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncFailingQueryInTx.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.hamcrest.Matchers.is; +import static org.hamcrest.junit.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.neo4j.driver.internal.util.Matchers.arithmeticError; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.async.AsyncTransaction; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.internal.util.Futures; + +public class AsyncFailingQueryInTx extends AbstractAsyncQuery { + public AsyncFailingQueryInTx(Driver driver) { + super(driver, false); + } + + @Override + public CompletionStage execute(C context) { + var session = newSession(AccessMode.READ, context); + + return session.beginTransactionAsync() + .thenCompose(tx -> tx.runAsync("UNWIND [10, 5, 0] AS x RETURN 10 / x") + .thenCompose(ResultCursor::listAsync) + .handle((records, error) -> { + assertNull(records); + var cause = Futures.completionExceptionCause(error); + assertThat(cause, is(arithmeticError())); + + return tx; + })) + .thenCompose(AsyncTransaction::rollbackAsync) + .whenComplete((ignore, error) -> session.closeAsync()); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java new file mode 100644 index 0000000000..0bfa28b068 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQuery.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.Record; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.summary.ResultSummary; + +public class AsyncReadQuery extends AbstractAsyncQuery { + public AsyncReadQuery(Driver driver, boolean useBookmark) { + super(driver, useBookmark); + } + + @Override + public CompletionStage execute(C context) { + var session = newSession(AccessMode.READ, context); + + var queryFinished = session.runAsync("MATCH (n) RETURN n LIMIT 1") + .thenCompose(cursor -> cursor.nextAsync().thenCompose(record -> processAndGetSummary(record, cursor))); + + queryFinished.whenComplete((summary, error) -> { + if (summary != null) { + context.readCompleted(); + } + session.closeAsync(); + }); + + return queryFinished.thenApply(summary -> null); + } + + private CompletionStage processAndGetSummary(Record record, ResultCursor cursor) { + if (record != null) { + var node = record.get(0).asNode(); + assertNotNull(node); + } + return cursor.consumeAsync(); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java new file mode 100644 index 0000000000..5209270b22 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncReadQueryInTx.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.Record; +import org.neo4j.driver.async.AsyncTransaction; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.summary.ResultSummary; + +public class AsyncReadQueryInTx extends AbstractAsyncQuery { + public AsyncReadQueryInTx(Driver driver, boolean useBookmark) { + super(driver, useBookmark); + } + + @Override + public CompletionStage execute(C ctx) { + var session = newSession(AccessMode.READ, ctx); + + var txCommitted = session.beginTransactionAsync() + .thenCompose(tx -> tx.runAsync("MATCH (n) RETURN n LIMIT 1").thenCompose(cursor -> cursor.nextAsync() + .thenCompose(record -> processRecordAndGetSummary(record, cursor) + .thenCompose(summary -> processSummaryAndCommit(tx, ctx))))); + + txCommitted.whenComplete((ignore, error) -> session.closeAsync()); + + return txCommitted; + } + + private CompletionStage processRecordAndGetSummary(Record record, ResultCursor cursor) { + if (record != null) { + var node = record.get(0).asNode(); + assertNotNull(node); + } + return cursor.consumeAsync(); + } + + private CompletionStage processSummaryAndCommit(AsyncTransaction tx, C context) { + context.readCompleted(); + return tx.commitAsync(); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java new file mode 100644 index 0000000000..409cd37e30 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQuery.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.internal.util.Futures; + +public class AsyncWriteQuery extends AbstractAsyncQuery { + private final AbstractStressTestBase stressTest; + + public AsyncWriteQuery(AbstractStressTestBase stressTest, Driver driver, boolean useBookmark) { + super(driver, useBookmark); + this.stressTest = stressTest; + } + + @Override + @SuppressWarnings("deprecation") + public CompletionStage execute(C context) { + var session = newSession(AccessMode.WRITE, context); + + return session.runAsync("CREATE ()") + .thenCompose(ResultCursor::consumeAsync) + .handle((summary, error) -> { + session.closeAsync(); + + if (error != null) { + handleError(Futures.completionExceptionCause(error), context); + } else { + context.setBookmark(session.lastBookmark()); + assertEquals(1, summary.counters().nodesCreated()); + context.nodeCreated(); + } + + return null; + }); + } + + private void handleError(Throwable error, C context) { + if (!stressTest.handleWriteFailure(error, context)) { + throw new RuntimeException(error); + } + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java new file mode 100644 index 0000000000..5643a4e510 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncWriteQueryInTx.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.internal.util.Futures; + +public class AsyncWriteQueryInTx extends AbstractAsyncQuery { + private final AbstractStressTestBase stressTest; + + public AsyncWriteQueryInTx(AbstractStressTestBase stressTest, Driver driver, boolean useBookmark) { + super(driver, useBookmark); + this.stressTest = stressTest; + } + + @Override + @SuppressWarnings("deprecation") + public CompletionStage execute(C context) { + var session = newSession(AccessMode.WRITE, context); + + var txCommitted = session.beginTransactionAsync() + .thenCompose(tx -> tx.runAsync("CREATE ()").thenCompose(cursor -> cursor.consumeAsync() + .thenCompose(summary -> tx.commitAsync().thenApply(ignore -> { + context.setBookmark(session.lastBookmark()); + return summary; + })))); + + return txCommitted.handle((summary, error) -> { + session.closeAsync(); + + if (error != null) { + handleError(Futures.completionExceptionCause(error), context); + } else { + assertEquals(1, summary.counters().nodesCreated()); + context.nodeCreated(); + } + + return null; + }); + } + + private void handleError(Throwable error, C context) { + if (!stressTest.handleWriteFailure(error, context)) { + throw new RuntimeException(error); + } + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java new file mode 100644 index 0000000000..992d74b693 --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQuery.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.junit.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.exceptions.Neo4jException; +import org.neo4j.driver.internal.util.Futures; + +public class AsyncWrongQuery extends AbstractAsyncQuery { + public AsyncWrongQuery(Driver driver) { + super(driver, false); + } + + @Override + public CompletionStage execute(C context) { + var session = newSession(AccessMode.READ, context); + + return session.runAsync("RETURN Wrong") + .thenCompose(ResultCursor::nextAsync) + .handle((record, error) -> { + session.closeAsync(); + assertNull(record); + + var cause = Futures.completionExceptionCause(error); + assertNotNull(cause); + assertThat(cause, instanceOf(ClientException.class)); + assertThat(((Neo4jException) cause).code(), containsString("SyntaxError")); + + return null; + }); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java b/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java new file mode 100644 index 0000000000..bb57b1ad1b --- /dev/null +++ b/driver/src/test/java/org/neo4j/driver/stress/AsyncWrongQueryInTx.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [http://neo4j.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.stress; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.junit.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.concurrent.CompletionStage; +import org.neo4j.driver.AccessMode; +import org.neo4j.driver.Driver; +import org.neo4j.driver.async.AsyncTransaction; +import org.neo4j.driver.async.ResultCursor; +import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.exceptions.Neo4jException; +import org.neo4j.driver.internal.util.Futures; + +public class AsyncWrongQueryInTx extends AbstractAsyncQuery { + public AsyncWrongQueryInTx(Driver driver) { + super(driver, false); + } + + @Override + public CompletionStage execute(C context) { + var session = newSession(AccessMode.READ, context); + + return session.beginTransactionAsync() + .thenCompose(tx -> tx.runAsync("RETURN Wrong") + .thenCompose(ResultCursor::nextAsync) + .handle((record, error) -> { + assertNull(record); + + var cause = Futures.completionExceptionCause(error); + assertNotNull(cause); + assertThat(cause, instanceOf(ClientException.class)); + assertThat(((Neo4jException) cause).code(), containsString("SyntaxError")); + + return tx; + })) + .thenCompose(AsyncTransaction::rollbackAsync) + .whenComplete((ignore, error) -> session.closeAsync()); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java b/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java index 31ffb7cd51..cb9c1823f7 100644 --- a/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java +++ b/driver/src/test/java/org/neo4j/driver/stress/SingleInstanceStressIT.java @@ -83,6 +83,23 @@ List> createTestSpecificBlockingCommands() { new BlockingFailingQueryInTx<>(driver)); } + @Override + List> createTestSpecificAsyncCommands() { + return Arrays.asList( + new AsyncReadQuery<>(driver, false), + new AsyncReadQuery<>(driver, true), + new AsyncReadQueryInTx<>(driver, false), + new AsyncReadQueryInTx<>(driver, true), + new AsyncWriteQuery<>(this, driver, false), + new AsyncWriteQuery<>(this, driver, true), + new AsyncWriteQueryInTx<>(this, driver, false), + new AsyncWriteQueryInTx<>(this, driver, true), + new AsyncWrongQuery<>(driver), + new AsyncWrongQueryInTx<>(driver), + new AsyncFailingQuery<>(driver), + new AsyncFailingQueryInTx<>(driver)); + } + @Override List> createTestSpecificRxCommands() { return Arrays.asList(