diff --git a/benchkit-backend/pom.xml b/benchkit-backend/pom.xml index 8fe8a737c5..b1afa937e5 100644 --- a/benchkit-backend/pom.xml +++ b/benchkit-backend/pom.xml @@ -27,6 +27,30 @@ neo4j-java-driver ${project.version} + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-netty + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-pooled + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-routed + ${project.version} + true + io.netty netty-handler diff --git a/bolt-api-netty/LICENSES.txt b/bolt-api-netty/LICENSES.txt new file mode 100644 index 0000000000..71c74a8f0f --- /dev/null +++ b/bolt-api-netty/LICENSES.txt @@ -0,0 +1,221 @@ +This file contains the full license text of the included third party +libraries. For an overview of the licenses see the NOTICE.txt file. + + +------------------------------------------------------------------------------ +Apache Software License, Version 2.0 + Netty/Buffer + Netty/Codec + Netty/Common + Netty/Handler + Netty/Resolver + Netty/TomcatNative [OpenSSL - Classes] + Netty/Transport + Netty/Transport/Native/Unix/Common +------------------------------------------------------------------------------ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + + + diff --git a/bolt-api-netty/NOTICE.txt b/bolt-api-netty/NOTICE.txt new file mode 100644 index 0000000000..2cebea3b44 --- /dev/null +++ b/bolt-api-netty/NOTICE.txt @@ -0,0 +1,30 @@ +Copyright (c) "Neo4j" +Neo4j Sweden AB [https://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. + +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. + +Full license texts are found in LICENSES.txt. + + +Third-party licenses +-------------------- + +Apache Software License, Version 2.0 + Netty/Buffer + Netty/Codec + Netty/Common + Netty/Handler + Netty/Resolver + Netty/TomcatNative [OpenSSL - Classes] + Netty/Transport + Netty/Transport/Native/Unix/Common + diff --git a/bolt-api-netty/pom.xml b/bolt-api-netty/pom.xml new file mode 100644 index 0000000000..f9978828f8 --- /dev/null +++ b/bolt-api-netty/pom.xml @@ -0,0 +1,85 @@ + + 4.0.0 + + + org.neo4j.driver + neo4j-java-driver-parent + 5.27-SNAPSHOT + + + neo4j-bolt-api-netty + + jar + Neo4j Bolt API Netty + https://github.com/neo4j/neo4j-java-driver + + + ${project.basedir}/.. + ,-try + --add-opens org.neo4j.bolt.netty/org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging=ALL-UNNAMED + + + + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + + + io.netty + netty-handler + + + io.netty + netty-tcnative-classes + + + + org.neo4j.driver + neo4j-bolt-api-test-values + ${project.version} + test + + + org.mockito + mockito-core + + + org.junit.jupiter + junit-jupiter + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire.and.failsafe.version} + + + + + + + + scm:git:git://github.com/neo4j/neo4j-java-driver.git + scm:git:git@github.com:neo4j/neo4j-java-driver.git + https://github.com/neo4j/neo4j-java-driver + + + diff --git a/bolt-api-netty/src/main/java/module-info.java b/bolt-api-netty/src/main/java/module-info.java new file mode 100644 index 0000000000..5be9054deb --- /dev/null +++ b/bolt-api-netty/src/main/java/module-info.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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. + */ +/** + * The Neo4j Bolt API Netty implementation module. + */ +@SuppressWarnings({"requires-automatic", "requires-transitive-automatic"}) +module org.neo4j.bolt.netty { + exports org.neo4j.driver.internal.bolt.basicimpl; + + requires transitive org.neo4j.bolt.api; + requires io.netty.common; + requires io.netty.handler; + requires transitive io.netty.transport; + requires io.netty.buffer; + requires io.netty.codec; + requires io.netty.resolver; + requires transitive java.logging; +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BootstrapFactory.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/BootstrapFactory.java similarity index 90% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BootstrapFactory.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/BootstrapFactory.java index aa4271fc13..1d8ef311db 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BootstrapFactory.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/BootstrapFactory.java @@ -14,11 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.EventLoopGroupFactory; public final class BootstrapFactory { private BootstrapFactory() {} diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/EventLoopThread.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/EventLoopThread.java new file mode 100644 index 0000000000..c124a5f01b --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/EventLoopThread.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl; + +public interface EventLoopThread {} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyBoltConnectionProvider.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyBoltConnectionProvider.java similarity index 89% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyBoltConnectionProvider.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyBoltConnectionProvider.java index d78bb52444..ed71fc77d2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyBoltConnectionProvider.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyBoltConnectionProvider.java @@ -30,7 +30,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Supplier; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltConnection; @@ -45,9 +44,16 @@ import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.SecurityPlan; import org.neo4j.driver.internal.bolt.api.exception.MinVersionAcquisitionException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v51.BoltProtocolV51; -import org.neo4j.driver.internal.bolt.basicimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltConnectionImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.ConnectionProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.ConnectionProviders; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NettyLogging; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopMetricsListener; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.BoltProtocolV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51.BoltProtocolV51; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.FutureUtil; public final class NettyBoltConnectionProvider implements BoltConnectionProvider { private final LoggingProvider logging; @@ -64,19 +70,22 @@ public final class NettyBoltConnectionProvider implements BoltConnectionProvider private CompletableFuture closeFuture; private MetricsListener metricsListener; private final Clock clock; + private final ValueFactory valueFactory; public NettyBoltConnectionProvider( EventLoopGroup eventLoopGroup, Clock clock, DomainNameResolver domainNameResolver, LocalAddress localAddress, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { Objects.requireNonNull(eventLoopGroup); this.clock = Objects.requireNonNull(clock); this.logging = Objects.requireNonNull(logging); this.log = logging.getLog(getClass()); - this.connectionProvider = - ConnectionProviders.netty(eventLoopGroup, clock, domainNameResolver, localAddress, logging); + this.connectionProvider = ConnectionProviders.netty( + eventLoopGroup, clock, domainNameResolver, localAddress, logging, valueFactory); + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -163,7 +172,8 @@ public CompletionStage connect( latestAuthMillisFuture, routingContext, clock, - logging); + logging, + valueFactory); } }); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/BoltConnectionImpl.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/BoltConnectionImpl.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/BoltConnectionImpl.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/BoltConnectionImpl.java index cf38d92668..df49d7b65b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/BoltConnectionImpl.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/BoltConnectionImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import io.netty.channel.EventLoop; import io.netty.handler.codec.CodecException; @@ -32,8 +32,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Collectors; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.AuthData; import org.neo4j.driver.internal.bolt.api.BoltConnection; @@ -64,11 +62,13 @@ import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; -import org.neo4j.driver.internal.bolt.basicimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.FutureUtil; public final class BoltConnectionImpl implements BoltConnection { private final LoggingProvider logging; @@ -85,6 +85,7 @@ public final class BoltConnectionImpl implements BoltConnection { private final Map routingContext; private final Queue>> messageWriters; private final Clock clock; + private final ValueFactory valueFactory; public BoltConnectionImpl( BoltProtocol protocol, @@ -94,7 +95,8 @@ public BoltConnectionImpl( CompletableFuture latestAuthMillisFuture, RoutingContext routingContext, Clock clock, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { this.protocol = Objects.requireNonNull(protocol); this.connection = Objects.requireNonNull(connection); this.eventLoop = Objects.requireNonNull(eventLoop); @@ -104,9 +106,10 @@ public BoltConnectionImpl( this.telemetrySupported = connection.isTelemetryEnabled(); this.authDataRef = new AtomicReference<>( CompletableFuture.completedFuture(new AuthDataImpl(authMap, latestAuthMillisFuture.join()))); + this.valueFactory = Objects.requireNonNull(valueFactory); this.routingContext = routingContext.toMap().entrySet().stream() .collect(Collectors.toUnmodifiableMap( - Map.Entry::getKey, entry -> Values.value(entry.getValue()), (a, b) -> b)); + Map.Entry::getKey, entry -> valueFactory.value(entry.getValue()), (a, b) -> b)); this.messageWriters = new ArrayDeque<>(); this.clock = Objects.requireNonNull(clock); this.logging = Objects.requireNonNull(logging); @@ -140,7 +143,8 @@ public void onSummary(RouteSummary summary) { } }, clock, - logging))) + logging, + valueFactory))) .thenApply(ignored -> this); } @@ -177,7 +181,8 @@ public void onSummary(Void summary) { handler.onBeginSummary(BeginSummaryImpl.INSTANCE); } }, - logging))) + logging, + valueFactory))) .thenApply(ignored -> this); } @@ -215,7 +220,8 @@ public void onSummary(RunSummary summary) { handler.onRunSummary(summary); } }, - logging))) + logging, + valueFactory))) .thenApply(ignored -> this); } @@ -239,8 +245,11 @@ public void onSummary(RunSummary summary) { @Override public CompletionStage pull(long qid, long request) { - return executeInEventLoop(() -> - messageWriters.add(handler -> protocol.pull(connection, qid, request, new PullMessageHandler() { + return executeInEventLoop(() -> messageWriters.add(handler -> protocol.pull( + connection, + qid, + request, + new PullMessageHandler() { @Override public void onRecord(Value[] fields) { handler.onRecord(fields); @@ -256,14 +265,18 @@ public void onError(Throwable throwable) { public void onSummary(PullSummary success) { handler.onPullSummary(success); } - }))) + }, + valueFactory))) .thenApply(ignored -> this); } @Override public CompletionStage discard(long qid, long number) { - return executeInEventLoop(() -> messageWriters.add( - handler -> protocol.discard(this.connection, qid, number, new MessageHandler<>() { + return executeInEventLoop(() -> messageWriters.add(handler -> protocol.discard( + this.connection, + qid, + number, + new MessageHandler<>() { @Override public void onError(Throwable throwable) { updateState(throwable); @@ -274,7 +287,8 @@ public void onError(Throwable throwable) { public void onSummary(DiscardSummary summary) { handler.onDiscardSummary(summary); } - }))) + }, + valueFactory))) .thenApply(ignored -> this); } @@ -354,8 +368,11 @@ public void onSummary(Void summary) { @Override public CompletionStage logon(Map authMap) { - return executeInEventLoop(() -> messageWriters.add( - handler -> protocol.logon(connection, authMap, clock, new MessageHandler<>() { + return executeInEventLoop(() -> messageWriters.add(handler -> protocol.logon( + connection, + authMap, + clock, + new MessageHandler<>() { @Override public void onError(Throwable throwable) { updateState(throwable); @@ -367,7 +384,8 @@ public void onSummary(Void summary) { authDataRef.get().complete(new AuthDataImpl(authMap, clock.millis())); handler.onLogonSummary(null); } - }))) + }, + valueFactory))) .thenApply(ignored -> this); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/ConnectionProvider.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/ConnectionProvider.java similarity index 90% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/ConnectionProvider.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/ConnectionProvider.java index 683755f6d8..5492aa638f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/ConnectionProvider.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/ConnectionProvider.java @@ -14,12 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; @@ -27,7 +26,8 @@ import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public interface ConnectionProvider { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/ConnectionProviders.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/ConnectionProviders.java similarity index 79% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/ConnectionProviders.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/ConnectionProviders.java index b572452af6..13ee068023 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/ConnectionProviders.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/ConnectionProviders.java @@ -14,21 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import io.netty.channel.EventLoopGroup; import io.netty.channel.local.LocalAddress; import java.time.Clock; import org.neo4j.driver.internal.bolt.api.DomainNameResolver; import org.neo4j.driver.internal.bolt.api.LoggingProvider; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class ConnectionProviders { - static ConnectionProvider netty( + public static ConnectionProvider netty( EventLoopGroup group, Clock clock, DomainNameResolver domainNameResolver, LocalAddress localAddress, - LoggingProvider logging) { - return new NettyConnectionProvider(group, clock, domainNameResolver, localAddress, logging); + LoggingProvider logging, + ValueFactory valueFactory) { + return new NettyConnectionProvider(group, clock, domainNameResolver, localAddress, logging, valueFactory); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/MessageIgnoredException.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/MessageIgnoredException.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/MessageIgnoredException.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/MessageIgnoredException.java index 5c0e46e08d..05a192ed00 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/MessageIgnoredException.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/MessageIgnoredException.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import java.io.Serial; import org.neo4j.driver.internal.bolt.api.exception.BoltException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyConnectionProvider.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyConnectionProvider.java similarity index 81% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyConnectionProvider.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyConnectionProvider.java index e5fcf7ae3a..904370470c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyConnectionProvider.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyConnectionProvider.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import static java.util.Objects.requireNonNull; @@ -33,7 +33,6 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; @@ -43,14 +42,16 @@ import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.bolt.basicimpl.async.NetworkConnection; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelConnectedListener; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelPipelineBuilderImpl; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.NettyChannelInitializer; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.NettyDomainNameResolverGroup; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ConnectTimeoutHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.NetworkConnection; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelConnectedListener; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelPipelineBuilderImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.NettyChannelInitializer; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.NettyDomainNameResolverGroup; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ConnectTimeoutHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public final class NettyConnectionProvider implements ConnectionProvider { private final EventLoopGroup eventLoopGroup; @@ -60,19 +61,22 @@ public final class NettyConnectionProvider implements ConnectionProvider { private final LocalAddress localAddress; private final LoggingProvider logging; + private final ValueFactory valueFactory; public NettyConnectionProvider( EventLoopGroup eventLoopGroup, Clock clock, DomainNameResolver domainNameResolver, LocalAddress localAddress, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { this.eventLoopGroup = eventLoopGroup; this.clock = requireNonNull(clock); this.domainNameResolver = requireNonNull(domainNameResolver); this.addressResolverGroup = new NettyDomainNameResolverGroup(this.domainNameResolver); this.localAddress = localAddress; this.logging = logging; + this.valueFactory = requireNonNull(valueFactory); } @Override @@ -120,7 +124,8 @@ public CompletionStage acquireConnection( routingContext, notificationConfig, clock, - latestAuthMillisFuture)) + latestAuthMillisFuture, + valueFactory)) .thenApply(channel -> new NetworkConnection(channel, logging)); } @@ -136,8 +141,8 @@ private CompletionStage installChannelConnectedListeners( // add listener that sends Bolt handshake bytes when channel is connected var handshakeCompleted = new CompletableFuture(); - channelConnected.addListener( - new ChannelConnectedListener(address, new ChannelPipelineBuilderImpl(), handshakeCompleted, logging)); + channelConnected.addListener(new ChannelConnectedListener( + address, new ChannelPipelineBuilderImpl(), handshakeCompleted, logging, valueFactory)); return handshakeCompleted.whenComplete((channel, throwable) -> { if (throwable == null) { // remove timeout handler from the pipeline once TLS and Bolt handshakes are diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLogger.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLogger.java similarity index 99% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLogger.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLogger.java index a55f0c1b39..cb47dace96 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLogger.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLogger.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import static java.lang.String.format; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLogging.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLogging.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLogging.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLogging.java index 531e23a32a..2bf3a94cb5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLogging.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLogging.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NoopMetricsListener.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NoopMetricsListener.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NoopMetricsListener.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NoopMetricsListener.java index d36a1ed5d8..60b657b277 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/NoopMetricsListener.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NoopMetricsListener.java @@ -14,17 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import java.util.function.IntSupplier; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.ListenerEvent; import org.neo4j.driver.internal.bolt.api.MetricsListener; -final class NoopMetricsListener implements MetricsListener { +public final class NoopMetricsListener implements MetricsListener { private static final NoopMetricsListener INSTANCE = new NoopMetricsListener(); - static NoopMetricsListener getInstance() { + public static NoopMetricsListener getInstance() { return INSTANCE; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/NetworkConnection.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/NetworkConnection.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/NetworkConnection.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/NetworkConnection.java index cfc2268550..0033847d44 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/NetworkConnection.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/NetworkConnection.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setTerminationReason; -import static org.neo4j.driver.internal.bolt.basicimpl.util.LockUtil.executeWithLock; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setTerminationReason; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.LockUtil.executeWithLock; import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; @@ -31,15 +31,15 @@ import java.util.concurrent.locks.ReentrantLock; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ConnectionReadTimeoutHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.NoOpResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ConnectionReadTimeoutHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.NoOpResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; /** * This connection represents a simple network connection to a remote server. It wraps a channel obtained from a connection pool. The life cycle of this diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/AuthorizationStateListener.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/AuthorizationStateListener.java similarity index 92% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/AuthorizationStateListener.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/AuthorizationStateListener.java index bf223c9e9a..004779ffa4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/AuthorizationStateListener.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/AuthorizationStateListener.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; /** * Listener for authorization info state maintained on the server side. diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BoltProtocolUtil.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/BoltProtocolUtil.java similarity index 81% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BoltProtocolUtil.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/BoltProtocolUtil.java index 3a6a530bde..bf44606aef 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BoltProtocolUtil.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/BoltProtocolUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static io.netty.buffer.Unpooled.copyInt; import static io.netty.buffer.Unpooled.unreleasableBuffer; @@ -22,12 +22,12 @@ import io.netty.buffer.ByteBuf; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v41.BoltProtocolV41; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v42.BoltProtocolV42; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v44.BoltProtocolV44; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.BoltProtocolV5; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v57.BoltProtocolV57; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41.BoltProtocolV41; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42.BoltProtocolV42; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44.BoltProtocolV44; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.BoltProtocolV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57.BoltProtocolV57; public final class BoltProtocolUtil { public static final int BOLT_MAGIC_PREAMBLE = 0x6060B017; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelAttributes.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelAttributes.java similarity index 96% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelAttributes.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelAttributes.java index cf774dc4d6..6243e66265 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelAttributes.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelAttributes.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static io.netty.util.AttributeKey.newInstance; @@ -26,8 +26,8 @@ import java.util.Set; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltPatchesListener; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltPatchesListener; public final class ChannelAttributes { private static final AttributeKey CONNECTION_ID = newInstance("connectionId"); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelConnectedListener.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelConnectedListener.java similarity index 85% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelConnectedListener.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelConnectedListener.java index c5960da681..7359f9b1d5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelConnectedListener.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelConnectedListener.java @@ -14,36 +14,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static java.lang.String.format; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.handshakeString; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.handshakeString; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import javax.net.ssl.SSLHandshakeException; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; public class ChannelConnectedListener implements ChannelFutureListener { private final BoltServerAddress address; private final ChannelPipelineBuilder pipelineBuilder; private final CompletableFuture handshakeCompletedFuture; private final LoggingProvider logging; + private final ValueFactory valueFactory; public ChannelConnectedListener( BoltServerAddress address, ChannelPipelineBuilder pipelineBuilder, CompletableFuture handshakeCompletedFuture, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { this.address = address; this.pipelineBuilder = pipelineBuilder; this.handshakeCompletedFuture = handshakeCompletedFuture; this.logging = logging; + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -54,7 +59,7 @@ public void operationComplete(ChannelFuture future) { log.log(System.Logger.Level.TRACE, "Channel %s connected, initiating bolt handshake", channel); var pipeline = channel.pipeline(); - pipeline.addLast(new HandshakeHandler(pipelineBuilder, handshakeCompletedFuture, logging)); + pipeline.addLast(new HandshakeHandler(pipelineBuilder, handshakeCompletedFuture, logging, valueFactory)); log.log(System.Logger.Level.DEBUG, "C: [Bolt Handshake] %s", handshakeString()); channel.writeAndFlush(BoltProtocolUtil.handshakeBuf()).addListener(f -> { if (!f.isSuccess()) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilder.java similarity index 68% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilder.java index 99079b7145..986905b0be 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilder.java @@ -14,12 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import io.netty.channel.ChannelPipeline; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; public interface ChannelPipelineBuilder { - void build(MessageFormat messageFormat, ChannelPipeline pipeline, LoggingProvider logging); + void build( + MessageFormat messageFormat, ChannelPipeline pipeline, LoggingProvider logging, ValueFactory valueFactory); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilderImpl.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilderImpl.java similarity index 60% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilderImpl.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilderImpl.java index 1b4f905ea7..cce79c4ae9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilderImpl.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilderImpl.java @@ -14,32 +14,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.addBoltPatchesListener; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.addBoltPatchesListener; import io.netty.channel.ChannelPipeline; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChannelErrorHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChunkDecoder; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.MessageDecoder; -import org.neo4j.driver.internal.bolt.basicimpl.async.outbound.OutboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChannelErrorHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChunkDecoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.MessageDecoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound.OutboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; public class ChannelPipelineBuilderImpl implements ChannelPipelineBuilder { @Override - public void build(MessageFormat messageFormat, ChannelPipeline pipeline, LoggingProvider logging) { + public void build( + MessageFormat messageFormat, ChannelPipeline pipeline, LoggingProvider logging, ValueFactory valueFactory) { // inbound handlers pipeline.addLast(new ChunkDecoder(logging)); pipeline.addLast(new MessageDecoder()); var channel = pipeline.channel(); - var inboundMessageHandler = new InboundMessageHandler(messageFormat, logging); + var inboundMessageHandler = new InboundMessageHandler(messageFormat, logging, valueFactory); addBoltPatchesListener(channel, inboundMessageHandler); pipeline.addLast(inboundMessageHandler); // outbound handlers - var outboundMessageHandler = new OutboundMessageHandler(messageFormat, logging); + var outboundMessageHandler = new OutboundMessageHandler(messageFormat, logging, valueFactory); addBoltPatchesListener(channel, outboundMessageHandler); pipeline.addLast(OutboundMessageHandler.NAME, outboundMessageHandler); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/EventLoopGroupFactory.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/EventLoopGroupFactory.java similarity index 86% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/EventLoopGroupFactory.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/EventLoopGroupFactory.java index fd3bce6765..e72dc078af 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/EventLoopGroupFactory.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/EventLoopGroupFactory.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; @@ -24,10 +24,8 @@ import io.netty.util.concurrent.DefaultThreadFactory; import io.netty.util.concurrent.FastThreadLocalThread; import java.util.concurrent.Executor; -import java.util.concurrent.Future; import java.util.concurrent.ThreadFactory; -import org.neo4j.driver.Session; -import org.neo4j.driver.async.AsyncSession; +import org.neo4j.driver.internal.bolt.basicimpl.EventLoopThread; /** * Manages creation of Netty {@link EventLoopGroup}s, which are basically {@link Executor}s that perform IO operations. @@ -62,9 +60,8 @@ public static EventLoopGroup newEventLoopGroup(int threadCount) { /** * Assert that current thread is not an event loop used for async IO operations. This check is needed because - * blocking API methods like {@link Session#run(String)} are implemented on top of corresponding async API methods - * like {@link AsyncSession#runAsync(String)} using basically {@link Future#get()} calls. Deadlocks might happen when IO - * thread executes blocking API call and has to wait for itself to read from the network. + * blocking API methods are implemented on top of corresponding async API methods. Deadlocks might happen when + * IO thread executes blocking API call and has to wait for itself to read from the network. * * @throws IllegalStateException when current thread is an event loop IO thread. */ @@ -83,16 +80,14 @@ public static void assertNotInEventLoopThread() throws IllegalStateException { * @return {@code true} when given thread belongs to the event loop, {@code false} otherwise. */ public static boolean isEventLoopThread(Thread thread) { - return thread instanceof DriverThread; + return thread instanceof EventLoopThread; } /** * Same as {@link NioEventLoopGroup} but uses a different {@link ThreadFactory} that produces threads of - * {@link DriverThread} class. Such threads can be recognized by {@link #assertNotInEventLoopThread()}. + * {@link EventLoopThread} class. Such threads can be recognized by {@link #assertNotInEventLoopThread()}. */ private static class DriverEventLoopGroup extends NioEventLoopGroup { - DriverEventLoopGroup() {} - DriverEventLoopGroup(int nThreads) { super(nThreads); } @@ -123,7 +118,7 @@ protected Thread newThread(Runnable r, String name) { * Same as default thread created by {@link DefaultThreadFactory} except this dedicated class can be easily * recognized by {@link #assertNotInEventLoopThread()}. */ - private static class DriverThread extends FastThreadLocalThread { + private static class DriverThread extends FastThreadLocalThread implements EventLoopThread { DriverThread(ThreadGroup group, Runnable target, String name) { super(group, target, name); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/HandshakeHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/HandshakeHandler.java similarity index 90% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/HandshakeHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/HandshakeHandler.java index b8281d7ce7..77c5c2814f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/HandshakeHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/HandshakeHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static org.neo4j.driver.internal.bolt.api.BoltProtocolVersion.isHttp; @@ -24,21 +24,24 @@ import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.ReplayingDecoder; import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import javax.net.ssl.SSLHandshakeException; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelErrorLogger; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelErrorLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; public class HandshakeHandler extends ReplayingDecoder { private final ChannelPipelineBuilder pipelineBuilder; private final CompletableFuture handshakeCompletedFuture; private final LoggingProvider logging; + private final ValueFactory valueFactory; private boolean failed; private ChannelActivityLogger log; @@ -47,10 +50,12 @@ public class HandshakeHandler extends ReplayingDecoder { public HandshakeHandler( ChannelPipelineBuilder pipelineBuilder, CompletableFuture handshakeCompletedFuture, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { this.pipelineBuilder = pipelineBuilder; this.handshakeCompletedFuture = handshakeCompletedFuture; this.logging = logging; + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -119,7 +124,7 @@ private BoltProtocol protocolForVersion(BoltProtocolVersion version) { private void protocolSelected(BoltProtocolVersion version, MessageFormat messageFormat, ChannelHandlerContext ctx) { ChannelAttributes.setProtocolVersion(ctx.channel(), version); - pipelineBuilder.build(messageFormat, ctx.pipeline(), logging); + pipelineBuilder.build(messageFormat, ctx.pipeline(), logging, valueFactory); handshakeCompletedFuture.complete(ctx.channel()); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyChannelInitializer.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyChannelInitializer.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyChannelInitializer.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyChannelInitializer.java index 8634f772a4..2f36b1da87 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyChannelInitializer.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyChannelInitializer.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; @@ -24,7 +24,7 @@ import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; public class NettyChannelInitializer extends ChannelInitializer { private final BoltServerAddress address; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyDomainNameResolver.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyDomainNameResolver.java similarity index 96% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyDomainNameResolver.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyDomainNameResolver.java index d4c98d2086..445641b3c9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyDomainNameResolver.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyDomainNameResolver.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import io.netty.resolver.InetNameResolver; import io.netty.util.concurrent.EventExecutor; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyDomainNameResolverGroup.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyDomainNameResolverGroup.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyDomainNameResolverGroup.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyDomainNameResolverGroup.java index 818438ee8f..3e1c970b5c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyDomainNameResolverGroup.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyDomainNameResolverGroup.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import io.netty.resolver.AddressResolver; import io.netty.resolver.AddressResolverGroup; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ByteBufInput.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ByteBufInput.java similarity index 92% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ByteBufInput.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ByteBufInput.java index 32565ed586..22f8fcb73a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ByteBufInput.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ByteBufInput.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static java.util.Objects.requireNonNull; import io.netty.buffer.ByteBuf; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; public class ByteBufInput implements PackInput { private ByteBuf buf; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChannelErrorHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChannelErrorHandler.java similarity index 92% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChannelErrorHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChannelErrorHandler.java index 5307ce8ead..e23cfae19a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChannelErrorHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChannelErrorHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static java.util.Objects.requireNonNull; @@ -25,9 +25,9 @@ import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltConnectionReadTimeoutException; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelErrorLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelErrorLogger; public class ChannelErrorHandler extends ChannelInboundHandlerAdapter { private final LoggingProvider logging; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChunkDecoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChunkDecoder.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChunkDecoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChunkDecoder.java index b25431c924..d8bf92e4e8 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChunkDecoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChunkDecoder.java @@ -14,14 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.LengthFieldBasedFrameDecoder; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; public class ChunkDecoder extends LengthFieldBasedFrameDecoder { private static final int MAX_FRAME_BODY_LENGTH = 0xFFFF; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectTimeoutHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectTimeoutHandler.java similarity index 96% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectTimeoutHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectTimeoutHandler.java index ed85423eef..de305ad6ea 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectTimeoutHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectTimeoutHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.timeout.ReadTimeoutHandler; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectionReadTimeoutHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectionReadTimeoutHandler.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectionReadTimeoutHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectionReadTimeoutHandler.java index 0b659d248d..998bf5da82 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectionReadTimeoutHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectionReadTimeoutHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.timeout.ReadTimeoutHandler; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageDispatcher.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageDispatcher.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageDispatcher.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageDispatcher.java index d99f9a519a..cc80334eec 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageDispatcher.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageDispatcher.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static java.util.Objects.requireNonNull; @@ -23,16 +23,16 @@ import java.util.LinkedList; import java.util.Map; import java.util.Queue; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltFailureException; import org.neo4j.driver.internal.bolt.api.exception.BoltGqlErrorException; -import org.neo4j.driver.internal.bolt.basicimpl.MessageIgnoredException; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelErrorLogger; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ResponseMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.MessageIgnoredException; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelErrorLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ResponseMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class InboundMessageDispatcher implements ResponseMessageHandler { private final Channel channel; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageHandler.java similarity index 79% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageHandler.java index 0a224f7f6b..7d2e2c80d3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static io.netty.buffer.ByteBufUtil.hexDump; import static java.util.Objects.requireNonNull; @@ -25,25 +25,28 @@ import io.netty.handler.codec.DecoderException; import java.util.Set; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltPatchesListener; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltPatchesListener; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; public class InboundMessageHandler extends SimpleChannelInboundHandler implements BoltPatchesListener { private final ByteBufInput input; private final MessageFormat messageFormat; private final LoggingProvider logging; + private final ValueFactory valueFactory; private InboundMessageDispatcher messageDispatcher; private MessageFormat.Reader reader; private System.Logger log; - public InboundMessageHandler(MessageFormat messageFormat, LoggingProvider logging) { + public InboundMessageHandler(MessageFormat messageFormat, LoggingProvider logging, ValueFactory valueFactory) { this.input = new ByteBufInput(); this.messageFormat = messageFormat; this.logging = logging; - this.reader = messageFormat.newReader(input); + this.reader = messageFormat.newReader(input, valueFactory); + this.valueFactory = requireNonNull(valueFactory); } @Override @@ -87,7 +90,7 @@ protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) { public void handle(Set patches) { if (patches.contains(DATE_TIME_UTC_PATCH)) { messageFormat.enableDateTimeUtc(); - reader = messageFormat.newReader(input); + reader = messageFormat.newReader(input, valueFactory); } } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/MessageDecoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/MessageDecoder.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/MessageDecoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/MessageDecoder.java index 13dc6c3074..1215878a0c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/MessageDecoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/MessageDecoder.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/ChunkAwareByteBufOutput.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/ChunkAwareByteBufOutput.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/ChunkAwareByteBufOutput.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/ChunkAwareByteBufOutput.java index 1c0ef82e81..e722c1539e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/ChunkAwareByteBufOutput.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/ChunkAwareByteBufOutput.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.outbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound; import static java.util.Objects.requireNonNull; import io.netty.buffer.ByteBuf; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class ChunkAwareByteBufOutput implements PackOutput { private final int maxChunkSize; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/OutboundMessageHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/OutboundMessageHandler.java similarity index 76% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/OutboundMessageHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/OutboundMessageHandler.java index e32ee53fdf..18cdc37a12 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/OutboundMessageHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/OutboundMessageHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.outbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound; import static io.netty.buffer.ByteBufUtil.hexDump; @@ -22,28 +22,32 @@ import io.netty.handler.codec.EncoderException; import io.netty.handler.codec.MessageToMessageEncoder; import java.util.List; +import java.util.Objects; import java.util.Set; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltPatchesListener; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltPatchesListener; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; public class OutboundMessageHandler extends MessageToMessageEncoder implements BoltPatchesListener { public static final String NAME = OutboundMessageHandler.class.getSimpleName(); private final ChunkAwareByteBufOutput output; private final MessageFormat messageFormat; private final LoggingProvider logging; + private final ValueFactory valueFactory; private MessageFormat.Writer writer; private System.Logger log; - public OutboundMessageHandler(MessageFormat messageFormat, LoggingProvider logging) { + public OutboundMessageHandler(MessageFormat messageFormat, LoggingProvider logging, ValueFactory valueFactory) { this.output = new ChunkAwareByteBufOutput(); this.messageFormat = messageFormat; this.logging = logging; - this.writer = messageFormat.newWriter(output); + this.writer = messageFormat.newWriter(output, valueFactory); + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -84,7 +88,7 @@ protected void encode(ChannelHandlerContext ctx, Message msg, List out) public void handle(Set patches) { if (patches.contains(DATE_TIME_UTC_PATCH)) { messageFormat.enableDateTimeUtc(); - writer = messageFormat.newWriter(output); + writer = messageFormat.newWriter(output, valueFactory); } } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/BeginTxResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/BeginTxResponseHandler.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/BeginTxResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/BeginTxResponseHandler.java index cb2e4d66c3..cde25493e5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/BeginTxResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/BeginTxResponseHandler.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; import java.util.Arrays; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class BeginTxResponseHandler implements ResponseHandler { private final CompletableFuture beginTxFuture; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/CommitTxResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/CommitTxResponseHandler.java similarity index 85% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/CommitTxResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/CommitTxResponseHandler.java index ce48a39c13..09cd51afcd 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/CommitTxResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/CommitTxResponseHandler.java @@ -14,16 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; -import static org.neo4j.driver.internal.types.InternalTypeSystem.TYPE_SYSTEM; import java.util.Arrays; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class CommitTxResponseHandler implements ResponseHandler { private final CompletableFuture commitFuture; @@ -36,7 +36,7 @@ public CommitTxResponseHandler(CompletableFuture commitFuture) { public void onSuccess(Map metadata) { var bookmarkValue = metadata.get("bookmark"); String bookmark = null; - if (bookmarkValue != null && !bookmarkValue.isNull() && bookmarkValue.hasType(TYPE_SYSTEM.STRING())) { + if (bookmarkValue != null && !bookmarkValue.isNull() && Type.STRING.equals(bookmarkValue.type())) { bookmark = bookmarkValue.asString(); if (bookmark.isEmpty()) { bookmark = null; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/DiscardResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/DiscardResponseHandler.java similarity index 84% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/DiscardResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/DiscardResponseHandler.java index 51c5cfc6dd..71d6886359 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/DiscardResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/DiscardResponseHandler.java @@ -14,15 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import java.util.Map; import java.util.Objects; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; -import org.neo4j.driver.internal.value.BooleanValue; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class DiscardResponseHandler implements ResponseHandler { private final CompletableFuture future; @@ -33,7 +32,6 @@ public DiscardResponseHandler(CompletableFuture future) { @Override public void onSuccess(Map metadata) { - var hasMore = metadata.getOrDefault("has_more", BooleanValue.FALSE).asBoolean(); this.future.complete(new DiscardSummaryImpl(metadata)); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloResponseHandler.java similarity index 78% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloResponseHandler.java index b405df2f19..3d4459091e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloResponseHandler.java @@ -14,16 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.boltPatchesListeners; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.protocolVersion; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setConnectionId; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setConnectionReadTimeout; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setServerAgent; -import static org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor.extractBoltPatches; -import static org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor.extractServer; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.boltPatchesListeners; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.protocolVersion; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setConnectionId; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setConnectionReadTimeout; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setServerAgent; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor.extractBoltPatches; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor.extractServer; import io.netty.channel.Channel; import java.time.Clock; @@ -32,10 +32,10 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v43.BoltProtocolV43; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v44.BoltProtocolV44; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43.BoltProtocolV43; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44.BoltProtocolV44; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class HelloResponseHandler implements ResponseHandler { private static final String CONNECTION_ID_METADATA_KEY = "connection_id"; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloV51ResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloV51ResponseHandler.java similarity index 78% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloV51ResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloV51ResponseHandler.java index 93d9ba2700..5162e5eac4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloV51ResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloV51ResponseHandler.java @@ -14,21 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setConnectionId; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setConnectionReadTimeout; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setServerAgent; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setTelemetryEnabled; -import static org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor.extractServer; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setConnectionId; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setConnectionReadTimeout; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setServerAgent; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setTelemetryEnabled; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor.extractServer; import io.netty.channel.Channel; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class HelloV51ResponseHandler implements ResponseHandler { private static final String CONNECTION_ID_METADATA_KEY = "connection_id"; @@ -80,8 +80,10 @@ private void processConfigurationHints(Map metadata) { .asLong()) .ifPresent(timeout -> setConnectionReadTimeout(channel, timeout)); - getFromSupplierOrEmptyOnException( - () -> configurationHints.get(TELEMETRY_ENABLED_KEY).asBoolean(false)) + getFromSupplierOrEmptyOnException(() -> { + var value = configurationHints.get(TELEMETRY_ENABLED_KEY); + return !value.isNull() && value.asBoolean(); + }) .ifPresent(telemetryEnabled -> setTelemetryEnabled(channel, telemetryEnabled)); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/LogoffResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/LogoffResponseHandler.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/LogoffResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/LogoffResponseHandler.java index 4125652977..6d71303523 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/LogoffResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/LogoffResponseHandler.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.exception.BoltProtocolException; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class LogoffResponseHandler implements ResponseHandler { private final CompletableFuture future; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/LogonResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/LogonResponseHandler.java similarity index 91% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/LogonResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/LogonResponseHandler.java index e774cf4ed4..aefaa9b6d0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/LogonResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/LogonResponseHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; @@ -22,9 +22,9 @@ import java.time.Clock; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.exception.BoltProtocolException; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class LogonResponseHandler implements ResponseHandler { private final CompletableFuture future; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/NoOpResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/NoOpResponseHandler.java similarity index 83% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/NoOpResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/NoOpResponseHandler.java index 158e2a5850..47596800b0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/NoOpResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/NoOpResponseHandler.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class NoOpResponseHandler implements ResponseHandler { public static final NoOpResponseHandler INSTANCE = new NoOpResponseHandler(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/PullResponseCompletionListener.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/PullResponseCompletionListener.java similarity index 86% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/PullResponseCompletionListener.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/PullResponseCompletionListener.java index d5b0b83d19..fb302bd84a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/PullResponseCompletionListener.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/PullResponseCompletionListener.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface PullResponseCompletionListener { void afterSuccess(Map metadata); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/PullResponseHandlerImpl.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/PullResponseHandlerImpl.java similarity index 66% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/PullResponseHandlerImpl.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/PullResponseHandlerImpl.java index 4563129fd7..ded72125b7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/PullResponseHandlerImpl.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/PullResponseHandlerImpl.java @@ -14,26 +14,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import java.util.Map; -import org.neo4j.driver.Value; +import java.util.Objects; import org.neo4j.driver.internal.bolt.api.summary.PullSummary; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; -import org.neo4j.driver.internal.value.BooleanValue; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class PullResponseHandlerImpl implements ResponseHandler { - private final PullMessageHandler handler; + private final ValueFactory valueFactory; - public PullResponseHandlerImpl(PullMessageHandler handler) { + public PullResponseHandlerImpl(PullMessageHandler handler, ValueFactory valueFactory) { this.handler = handler; + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override public void onSuccess(Map metadata) { - var hasMore = metadata.getOrDefault("has_more", BooleanValue.FALSE).asBoolean(); + var hasMore = + metadata.getOrDefault("has_more", valueFactory.value(false)).asBoolean(); handler.onSummary(new PullSummaryImpl(hasMore, metadata)); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/ResetResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/ResetResponseHandler.java similarity index 90% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/ResetResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/ResetResponseHandler.java index c230900d84..f31d0a426f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/ResetResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/ResetResponseHandler.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class ResetResponseHandler implements ResponseHandler { private final CompletableFuture completionFuture; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RollbackTxResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RollbackTxResponseHandler.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RollbackTxResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RollbackTxResponseHandler.java index 8ad08f3eb8..36cd9c7cb9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RollbackTxResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RollbackTxResponseHandler.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; import java.util.Arrays; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; public class RollbackTxResponseHandler implements ResponseHandler { private final CompletableFuture rollbackFuture; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RouteMessageResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RouteMessageResponseHandler.java similarity index 80% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RouteMessageResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RouteMessageResponseHandler.java index 5871ee0b53..b5dc67cb31 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RouteMessageResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RouteMessageResponseHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; @@ -22,9 +22,9 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; /** * Handles the RouteMessage response getting the success response @@ -32,15 +32,18 @@ */ public class RouteMessageResponseHandler implements ResponseHandler { private final CompletableFuture> completableFuture; + private final ValueFactory valueFactory; - public RouteMessageResponseHandler(final CompletableFuture> completableFuture) { + public RouteMessageResponseHandler( + final CompletableFuture> completableFuture, ValueFactory valueFactory) { this.completableFuture = requireNonNull(completableFuture); + this.valueFactory = requireNonNull(valueFactory); } @Override public void onSuccess(Map metadata) { try { - completableFuture.complete(metadata.get("rt").asMap(Values::value)); + completableFuture.complete(metadata.get("rt").asMap(valueFactory::value)); } catch (Exception ex) { completableFuture.completeExceptionally(ex); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RunResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RunResponseHandler.java similarity index 87% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RunResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RunResponseHandler.java index 7f045b7144..10ba283760 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RunResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RunResponseHandler.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor; public class RunResponseHandler implements ResponseHandler { private final CompletableFuture runFuture; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/TelemetryResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/TelemetryResponseHandler.java similarity index 84% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/TelemetryResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/TelemetryResponseHandler.java index 4a7633b12e..b02cd9d14a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/TelemetryResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/TelemetryResponseHandler.java @@ -14,16 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Objects.requireNonNull; import java.util.Arrays; import java.util.Map; import java.util.concurrent.CompletableFuture; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; /** * Handles {@link TelemetryMessage} responses. diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelActivityLogger.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelActivityLogger.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelActivityLogger.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelActivityLogger.java index ee26425e25..22e65cfab2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelActivityLogger.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelActivityLogger.java @@ -14,14 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.logging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.logging; import static java.lang.String.format; import io.netty.channel.Channel; import java.util.ResourceBundle; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; public class ChannelActivityLogger implements System.Logger { private final Channel channel; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelErrorLogger.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelErrorLogger.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelErrorLogger.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelErrorLogger.java index 357ce34102..21e3b768f2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelErrorLogger.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelErrorLogger.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.logging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.logging; import io.netty.channel.Channel; import org.neo4j.driver.internal.bolt.api.LoggingProvider; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/AbstractMessageWriter.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/AbstractMessageWriter.java similarity index 76% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/AbstractMessageWriter.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/AbstractMessageWriter.java index b49e4c2c78..5793673012 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/AbstractMessageWriter.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/AbstractMessageWriter.java @@ -14,20 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import static java.util.Objects.requireNonNull; import java.io.IOException; import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public abstract class AbstractMessageWriter implements MessageFormat.Writer { private final ValuePacker packer; private final Map encodersByMessageSignature; + private final ValueFactory valueFactory; - protected AbstractMessageWriter(ValuePacker packer, Map encodersByMessageSignature) { + protected AbstractMessageWriter( + ValuePacker packer, Map encodersByMessageSignature, ValueFactory valueFactory) { this.packer = requireNonNull(packer); this.encodersByMessageSignature = requireNonNull(encodersByMessageSignature); + this.valueFactory = requireNonNull(valueFactory); } @Override @@ -37,6 +41,6 @@ public final void write(Message msg) throws IOException { if (encoder == null) { throw new IOException("No encoder found for message " + msg + " with signature " + signature); } - encoder.encode(msg, packer); + encoder.encode(msg, packer, valueFactory); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltPatchesListener.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltPatchesListener.java similarity index 92% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltPatchesListener.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltPatchesListener.java index fb0977bb33..6584400b3d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltPatchesListener.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltPatchesListener.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import java.util.Set; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocol.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocol.java similarity index 71% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocol.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocol.java index f9c7105908..334e511680 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocol.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocol.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.protocolVersion; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.protocolVersion; import io.netty.channel.Channel; import java.time.Clock; @@ -25,7 +25,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; @@ -38,21 +37,23 @@ import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v41.BoltProtocolV41; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v42.BoltProtocolV42; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v43.BoltProtocolV43; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v44.BoltProtocolV44; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.BoltProtocolV5; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v51.BoltProtocolV51; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v52.BoltProtocolV52; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v53.BoltProtocolV53; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.BoltProtocolV54; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v55.BoltProtocolV55; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v56.BoltProtocolV56; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v57.BoltProtocolV57; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.BoltProtocolV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41.BoltProtocolV41; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42.BoltProtocolV42; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43.BoltProtocolV43; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44.BoltProtocolV44; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.BoltProtocolV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51.BoltProtocolV51; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v52.BoltProtocolV52; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v53.BoltProtocolV53; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.BoltProtocolV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v55.BoltProtocolV55; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56.BoltProtocolV56; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57.BoltProtocolV57; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public interface BoltProtocol { MessageFormat createMessageFormat(); @@ -65,7 +66,8 @@ CompletionStage initializeChannel( RoutingContext routingContext, NotificationConfig notificationConfig, Clock clock, - CompletableFuture latestAuthMillisFuture); + CompletableFuture latestAuthMillisFuture, + ValueFactory valueFactory); CompletionStage route( Connection connection, @@ -75,7 +77,8 @@ CompletionStage route( String impersonatedUser, MessageHandler handler, Clock clock, - LoggingProvider logging); + LoggingProvider logging, + ValueFactory valueFactory); CompletionStage beginTransaction( Connection connection, @@ -88,7 +91,8 @@ CompletionStage beginTransaction( String txType, NotificationConfig notificationConfig, MessageHandler handler, - LoggingProvider logging); + LoggingProvider logging, + ValueFactory valueFactory); CompletionStage commitTransaction(Connection connection, MessageHandler handler); @@ -108,14 +112,21 @@ CompletionStage runAuto( Map txMetadata, NotificationConfig notificationConfig, MessageHandler handler, - LoggingProvider logging); + LoggingProvider logging, + ValueFactory valueFactory); CompletionStage run( Connection connection, String query, Map parameters, MessageHandler handler); - CompletionStage pull(Connection connection, long qid, long request, PullMessageHandler handler); + CompletionStage pull( + Connection connection, long qid, long request, PullMessageHandler handler, ValueFactory valueFactory); - CompletionStage discard(Connection connection, long qid, long number, MessageHandler handler); + CompletionStage discard( + Connection connection, + long qid, + long number, + MessageHandler handler, + ValueFactory valueFactory); CompletionStage reset(Connection connection, MessageHandler handler); @@ -124,7 +135,11 @@ default CompletionStage logoff(Connection connection, MessageHandler } default CompletionStage logon( - Connection connection, Map authMap, Clock clock, MessageHandler handler) { + Connection connection, + Map authMap, + Clock clock, + MessageHandler handler, + ValueFactory valueFactory) { return CompletableFuture.failedStage(new BoltUnsupportedFeatureException("logon not supported")); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/Message.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/Message.java similarity index 91% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/Message.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/Message.java index 20a05bd7e5..dd77b8e4d6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/Message.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/Message.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; /** * Base class for all protocol messages. diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageEncoder.java similarity index 75% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageEncoder.java index 1b7b78654b..dc1a9a4041 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageEncoder.java @@ -14,10 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import java.io.IOException; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public interface MessageEncoder { - void encode(Message message, ValuePacker packer) throws IOException; + void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageFormat.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageFormat.java similarity index 68% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageFormat.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageFormat.java index b91dfff4bb..218771c1d6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageFormat.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageFormat.java @@ -14,11 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public interface MessageFormat { interface Writer { @@ -29,14 +30,14 @@ interface Reader { void read(ResponseMessageHandler handler) throws IOException; } - Writer newWriter(PackOutput output); + Writer newWriter(PackOutput output, ValueFactory valueFactory); - Reader newReader(PackInput input); + Reader newReader(PackInput input, ValueFactory valueFactory); /** * Enables datetime in UTC if supported by the given message format. This is only for use with formats that support multiple modes. *

- * This only takes effect on subsequent writer and reader creation via {@link #newWriter(PackOutput)} and {@link #newReader(PackInput)}. + * This only takes effect on subsequent writer and reader creation via {@link #newWriter(PackOutput, ValueFactory)} and {@link #newReader(PackInput, ValueFactory)}. */ default void enableDateTimeUtc() {} } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageHandler.java similarity index 91% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageHandler.java index e8fadc1592..7b67fe07ee 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; public interface MessageHandler { void onError(Throwable throwable); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/PullMessageHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/PullMessageHandler.java similarity index 86% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/PullMessageHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/PullMessageHandler.java index 8e3ea17e9a..9ca5346f98 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/PullMessageHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/PullMessageHandler.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.summary.PullSummary; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface PullMessageHandler extends MessageHandler { void onRecord(Value[] fields); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ResponseMessageHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ResponseMessageHandler.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ResponseMessageHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ResponseMessageHandler.java index 8c0deb4637..2cd81da268 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ResponseMessageHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ResponseMessageHandler.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import java.util.Map; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.GqlError; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface ResponseMessageHandler { void handleSuccessMessage(Map meta); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ValuePacker.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ValuePacker.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ValuePacker.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ValuePacker.java index 46d14143b6..b85c6168fa 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ValuePacker.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ValuePacker.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import java.io.IOException; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface ValuePacker { void packStructHeader(int size, byte signature) throws IOException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ValueUnpacker.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ValueUnpacker.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ValueUnpacker.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ValueUnpacker.java index 6fc60ed10f..9e646cfaed 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/ValueUnpacker.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/ValueUnpacker.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import java.io.IOException; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface ValueUnpacker { @SuppressWarnings("UnusedReturnValue") diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonMessageReader.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonMessageReader.java similarity index 66% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonMessageReader.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonMessageReader.java index 207419403b..50844d9c3e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonMessageReader.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonMessageReader.java @@ -14,31 +14,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.common; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common; import java.io.IOException; import java.util.Map; -import org.neo4j.driver.Values; +import java.util.Objects; import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.GqlStatusError; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ResponseMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValueUnpacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ResponseMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValueUnpacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; public class CommonMessageReader implements MessageFormat.Reader { protected final ValueUnpacker unpacker; + protected final ValueFactory valueFactory; - public CommonMessageReader(PackInput input, boolean dateTimeUtcEnabled) { - this(new CommonValueUnpacker(input, dateTimeUtcEnabled)); + public CommonMessageReader(PackInput input, boolean dateTimeUtcEnabled, ValueFactory valueFactory) { + this(new CommonValueUnpacker(input, dateTimeUtcEnabled, valueFactory), valueFactory); } - protected CommonMessageReader(ValueUnpacker unpacker) { + protected CommonMessageReader(ValueUnpacker unpacker, ValueFactory valueFactory) { this.unpacker = unpacker; + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -64,9 +67,9 @@ protected void unpackFailureMessage(ResponseMessageHandler output) throws IOExce var code = params.get("code").asString(); var message = params.get("message").asString(); var diagnosticRecord = Map.ofEntries( - Map.entry("CURRENT_SCHEMA", Values.value("/")), - Map.entry("OPERATION", Values.value("")), - Map.entry("OPERATION_CODE", Values.value("0"))); + Map.entry("CURRENT_SCHEMA", valueFactory.value("/")), + Map.entry("OPERATION", valueFactory.value("")), + Map.entry("OPERATION_CODE", valueFactory.value("0"))); var gqlError = new GqlError( GqlStatusError.UNKNOWN.getStatus(), GqlStatusError.UNKNOWN.getStatusDescription(message), diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonValuePacker.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonValuePacker.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonValuePacker.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonValuePacker.java index 23ebf701ee..bc4475d4e7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonValuePacker.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonValuePacker.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.common; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common; import static java.time.ZoneOffset.UTC; @@ -26,15 +26,12 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackStream; -import org.neo4j.driver.internal.value.InternalValue; -import org.neo4j.driver.types.IsoDuration; -import org.neo4j.driver.types.Point; +import org.neo4j.driver.internal.bolt.api.values.IsoDuration; +import org.neo4j.driver.internal.bolt.api.values.Point; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackStream; public class CommonValuePacker implements ValuePacker { @@ -85,11 +82,7 @@ public final void pack(String string) throws IOException { @Override public final void pack(Value value) throws IOException { - if (value instanceof InternalValue) { - packInternalValue(((InternalValue) value)); - } else { - throw new IllegalArgumentException("Unable to pack: " + value); - } + packInternalValue(value); } @Override @@ -105,8 +98,8 @@ public final void pack(Map map) throws IOException { } } - protected void packInternalValue(InternalValue value) throws IOException { - switch (value.typeConstructor()) { + protected void packInternalValue(Value value) throws IOException { + switch (value.type()) { case DATE -> packDate(value.asLocalDate()); case TIME -> packTime(value.asOffsetTime()); case LOCAL_TIME -> packLocalTime(value.asLocalTime()); @@ -227,12 +220,10 @@ private void packDuration(IsoDuration duration) throws IOException { } private void packPoint(Point point) throws IOException { - if (point instanceof InternalPoint2D) { + if (Double.isNaN(point.z())) { packPoint2D(point); - } else if (point instanceof InternalPoint3D) { - packPoint3D(point); } else { - throw new IOException(String.format("Unknown type: type: %s, value: %s", point.getClass(), point)); + packPoint3D(point); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonValueUnpacker.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonValueUnpacker.java similarity index 74% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonValueUnpacker.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonValueUnpacker.java index a706de2471..1f69c62f98 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/common/CommonValueUnpacker.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/common/CommonValueUnpacker.java @@ -14,12 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.common; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common; import static java.time.ZoneOffset.UTC; -import static org.neo4j.driver.Values.isoDuration; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import java.io.IOException; import java.time.DateTimeException; @@ -37,26 +34,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Supplier; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.InternalNode; -import org.neo4j.driver.internal.InternalPath; -import org.neo4j.driver.internal.InternalRelationship; import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; import org.neo4j.driver.internal.bolt.api.exception.BoltProtocolException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValueUnpacker; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackStream; -import org.neo4j.driver.internal.types.TypeConstructor; -import org.neo4j.driver.internal.value.ListValue; -import org.neo4j.driver.internal.value.MapValue; -import org.neo4j.driver.internal.value.NodeValue; -import org.neo4j.driver.internal.value.PathValue; -import org.neo4j.driver.internal.value.RelationshipValue; -import org.neo4j.driver.internal.value.UnsupportedDateTimeValue; -import org.neo4j.driver.types.Node; -import org.neo4j.driver.types.Path; -import org.neo4j.driver.types.Relationship; +import org.neo4j.driver.internal.bolt.api.values.Node; +import org.neo4j.driver.internal.bolt.api.values.Path; +import org.neo4j.driver.internal.bolt.api.values.Relationship; +import org.neo4j.driver.internal.bolt.api.values.Segment; +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValueUnpacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackStream; public class CommonValueUnpacker implements ValueUnpacker { public static final byte DATE = 'D'; @@ -96,10 +87,12 @@ public class CommonValueUnpacker implements ValueUnpacker { private final boolean dateTimeUtcEnabled; protected final PackStream.Unpacker unpacker; + protected final ValueFactory valueFactory; - public CommonValueUnpacker(PackInput input, boolean dateTimeUtcEnabled) { + public CommonValueUnpacker(PackInput input, boolean dateTimeUtcEnabled, ValueFactory valueFactory) { this.dateTimeUtcEnabled = dateTimeUtcEnabled; this.unpacker = new PackStream.Unpacker(input); + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -140,25 +133,25 @@ protected Value unpack() throws IOException { var type = unpacker.peekNextType(); switch (type) { case NULL -> { - return value(unpacker.unpackNull()); + return valueFactory.value(unpacker.unpackNull()); } case BOOLEAN -> { - return value(unpacker.unpackBoolean()); + return valueFactory.value(unpacker.unpackBoolean()); } case INTEGER -> { - return value(unpacker.unpackLong()); + return valueFactory.value(unpacker.unpackLong()); } case FLOAT -> { - return value(unpacker.unpackDouble()); + return valueFactory.value(unpacker.unpackDouble()); } case BYTES -> { - return value(unpacker.unpackBytes()); + return valueFactory.value(unpacker.unpackBytes()); } case STRING -> { - return value(unpacker.unpackString()); + return valueFactory.value(unpacker.unpackString()); } case MAP -> { - return new MapValue(unpackMap()); + return valueFactory.value(unpackMap()); } case LIST -> { var size = (int) unpacker.unpackListHeader(); @@ -166,7 +159,7 @@ protected Value unpack() throws IOException { for (var j = 0; j < size; j++) { vals[j] = unpack(); } - return new ListValue(vals); + return valueFactory.value(vals); } case STRUCT -> { var size = unpacker.unpackStructHeader(); @@ -180,24 +173,24 @@ protected Value unpack() throws IOException { private Value unpackStruct(long size, byte type) throws IOException { switch (type) { case DATE -> { - ensureCorrectStructSize(TypeConstructor.DATE, DATE_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.DATE, DATE_STRUCT_SIZE, size); return unpackDate(); } case TIME -> { - ensureCorrectStructSize(TypeConstructor.TIME, TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.TIME, TIME_STRUCT_SIZE, size); return unpackTime(); } case LOCAL_TIME -> { - ensureCorrectStructSize(TypeConstructor.LOCAL_TIME, LOCAL_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.LOCAL_TIME, LOCAL_TIME_STRUCT_SIZE, size); return unpackLocalTime(); } case LOCAL_DATE_TIME -> { - ensureCorrectStructSize(TypeConstructor.LOCAL_DATE_TIME, LOCAL_DATE_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.LOCAL_DATE_TIME, LOCAL_DATE_TIME_STRUCT_SIZE, size); return unpackLocalDateTime(); } case DATE_TIME_WITH_ZONE_OFFSET -> { if (!dateTimeUtcEnabled) { - ensureCorrectStructSize(TypeConstructor.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); return unpackDateTime(ZoneMode.OFFSET, BaselineMode.LEGACY); } else { throw instantiateExceptionForUnknownType(type); @@ -205,7 +198,7 @@ private Value unpackStruct(long size, byte type) throws IOException { } case DATE_TIME_WITH_ZONE_OFFSET_UTC -> { if (dateTimeUtcEnabled) { - ensureCorrectStructSize(TypeConstructor.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); return unpackDateTime(ZoneMode.OFFSET, BaselineMode.UTC); } else { throw instantiateExceptionForUnknownType(type); @@ -213,7 +206,7 @@ private Value unpackStruct(long size, byte type) throws IOException { } case DATE_TIME_WITH_ZONE_ID -> { if (!dateTimeUtcEnabled) { - ensureCorrectStructSize(TypeConstructor.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); return unpackDateTime(ZoneMode.ZONE_ID, BaselineMode.LEGACY); } else { throw instantiateExceptionForUnknownType(type); @@ -221,49 +214,48 @@ private Value unpackStruct(long size, byte type) throws IOException { } case DATE_TIME_WITH_ZONE_ID_UTC -> { if (dateTimeUtcEnabled) { - ensureCorrectStructSize(TypeConstructor.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.DATE_TIME, DATE_TIME_STRUCT_SIZE, size); return unpackDateTime(ZoneMode.ZONE_ID, BaselineMode.UTC); } else { throw instantiateExceptionForUnknownType(type); } } case DURATION -> { - ensureCorrectStructSize(TypeConstructor.DURATION, DURATION_TIME_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.DURATION, DURATION_TIME_STRUCT_SIZE, size); return unpackDuration(); } case POINT_2D_STRUCT_TYPE -> { - ensureCorrectStructSize(TypeConstructor.POINT, POINT_2D_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.POINT, POINT_2D_STRUCT_SIZE, size); return unpackPoint2D(); } case POINT_3D_STRUCT_TYPE -> { - ensureCorrectStructSize(TypeConstructor.POINT, POINT_3D_STRUCT_SIZE, size); + ensureCorrectStructSize(Type.POINT, POINT_3D_STRUCT_SIZE, size); return unpackPoint3D(); } case NODE -> { - ensureCorrectStructSize(TypeConstructor.NODE, getNodeFields(), size); - var adapted = unpackNode(); - return new NodeValue(adapted); + ensureCorrectStructSize(Type.NODE, getNodeFields(), size); + return valueFactory.value(unpackNode()); } case RELATIONSHIP -> { - ensureCorrectStructSize(TypeConstructor.RELATIONSHIP, getRelationshipFields(), size); - return unpackRelationship(); + ensureCorrectStructSize(Type.RELATIONSHIP, getRelationshipFields(), size); + return valueFactory.value(unpackRelationship()); } case PATH -> { - ensureCorrectStructSize(TypeConstructor.PATH, 3, size); - return unpackPath(); + ensureCorrectStructSize(Type.PATH, 3, size); + return valueFactory.value(unpackPath()); } default -> throw instantiateExceptionForUnknownType(type); } } - protected Value unpackRelationship() throws IOException { + protected Relationship unpackRelationship() throws IOException { var urn = unpacker.unpackLong(); var startUrn = unpacker.unpackLong(); var endUrn = unpacker.unpackLong(); var relType = unpacker.unpackString(); var props = unpackMap(); - var adapted = new InternalRelationship( + return valueFactory.relationship( urn, String.valueOf(urn), startUrn, @@ -272,11 +264,10 @@ protected Value unpackRelationship() throws IOException { String.valueOf(endUrn), relType, props); - return new RelationshipValue(adapted); } @SuppressWarnings("DuplicatedCode") - protected InternalNode unpackNode() throws IOException { + protected Node unpackNode() throws IOException { var urn = unpacker.unpackLong(); var numLabels = (int) unpacker.unpackListHeader(); @@ -291,29 +282,29 @@ protected InternalNode unpackNode() throws IOException { props.put(key, unpack()); } - return new InternalNode(urn, String.valueOf(urn), labels, props); + return valueFactory.node(urn, String.valueOf(urn), labels, props); } - @SuppressWarnings({"deprecation", "DuplicatedCode"}) - protected Value unpackPath() throws IOException { + @SuppressWarnings("DuplicatedCode") + protected Path unpackPath() throws IOException { // List of unique nodes var uniqNodes = new Node[(int) unpacker.unpackListHeader()]; for (var i = 0; i < uniqNodes.length; i++) { - ensureCorrectStructSize(TypeConstructor.NODE, getNodeFields(), unpacker.unpackStructHeader()); + ensureCorrectStructSize(Type.NODE, getNodeFields(), unpacker.unpackStructHeader()); ensureCorrectStructSignature("NODE", NODE, unpacker.unpackStructSignature()); uniqNodes[i] = unpackNode(); } // List of unique relationships, without start/end information - var uniqRels = new InternalRelationship[(int) unpacker.unpackListHeader()]; + var uniqRels = new Relationship[(int) unpacker.unpackListHeader()]; for (var i = 0; i < uniqRels.length; i++) { - ensureCorrectStructSize(TypeConstructor.RELATIONSHIP, 3, unpacker.unpackStructHeader()); + ensureCorrectStructSize(Type.RELATIONSHIP, 3, unpacker.unpackStructHeader()); ensureCorrectStructSignature( "UNBOUND_RELATIONSHIP", UNBOUND_RELATIONSHIP, unpacker.unpackStructSignature()); var id = unpacker.unpackLong(); var relType = unpacker.unpackString(); var props = unpackMap(); - uniqRels[i] = new InternalRelationship( + uniqRels[i] = valueFactory.relationship( id, String.valueOf(id), -1, String.valueOf(-1), -1, String.valueOf(-1), relType, props); } @@ -322,13 +313,13 @@ protected Value unpackPath() throws IOException { // Knowing the sequence length, we can create the arrays that will represent the nodes, rels and segments in // their "path order" - var segments = new Path.Segment[length / 2]; + var segments = new Segment[length / 2]; var nodes = new Node[segments.length + 1]; var rels = new Relationship[segments.length]; Node prevNode = uniqNodes[0], nextNode; // Start node is always 0, and isn't encoded in the sequence nodes[0] = prevNode; - InternalRelationship rel; + Relationship rel; for (var i = 0; i < segments.length; i++) { var relIdx = (int) unpacker.unpackLong(); nextNode = uniqNodes[(int) unpacker.unpackLong()]; @@ -345,15 +336,15 @@ protected Value unpackPath() throws IOException { nodes[i + 1] = nextNode; rels[i] = rel; - segments[i] = new InternalPath.SelfContainedSegment(prevNode, rel, nextNode); + segments[i] = valueFactory.segment(prevNode, rel, nextNode); prevNode = nextNode; } - return new PathValue(new InternalPath(Arrays.asList(segments), Arrays.asList(nodes), Arrays.asList(rels))); + return valueFactory.path(Arrays.asList(segments), Arrays.asList(nodes), Arrays.asList(rels)); } - protected final void ensureCorrectStructSize(TypeConstructor typeConstructor, int expected, long actual) { + protected final void ensureCorrectStructSize(Type type, int expected, long actual) { if (expected != actual) { - var structName = typeConstructor.toString(); + var structName = type.toString(); throw new BoltClientException(String.format( "Invalid message received, serialized %s structures should have %d fields, " + "received %s structure has %d fields.", @@ -371,7 +362,7 @@ protected void ensureCorrectStructSignature(String structName, byte expected, by private Value unpackDate() throws IOException { var epochDay = unpacker.unpackLong(); - return value(LocalDate.ofEpochDay(epochDay)); + return valueFactory.value(LocalDate.ofEpochDay(epochDay)); } private Value unpackTime() throws IOException { @@ -380,18 +371,18 @@ private Value unpackTime() throws IOException { var localTime = LocalTime.ofNanoOfDay(nanoOfDayLocal); var offset = ZoneOffset.ofTotalSeconds(offsetSeconds); - return value(OffsetTime.of(localTime, offset)); + return valueFactory.value(OffsetTime.of(localTime, offset)); } private Value unpackLocalTime() throws IOException { var nanoOfDayLocal = unpacker.unpackLong(); - return value(LocalTime.ofNanoOfDay(nanoOfDayLocal)); + return valueFactory.value(LocalTime.ofNanoOfDay(nanoOfDayLocal)); } private Value unpackLocalDateTime() throws IOException { var epochSecondUtc = unpacker.unpackLong(); var nano = Math.toIntExact(unpacker.unpackLong()); - return value(LocalDateTime.ofEpochSecond(epochSecondUtc, nano, UTC)); + return valueFactory.value(LocalDateTime.ofEpochSecond(epochSecondUtc, nano, UTC)); } private Value unpackDateTime(ZoneMode unpackOffset, BaselineMode useUtcBaseline) throws IOException { @@ -409,11 +400,11 @@ private Value unpackDateTime(ZoneMode unpackOffset, BaselineMode useUtcBaseline) try { zoneId = zoneIdSupplier.get(); } catch (DateTimeException e) { - return new UnsupportedDateTimeValue(e); + return valueFactory.unsupportedDateTimeValue(e); } return useUtcBaseline == BaselineMode.UTC - ? value(newZonedDateTimeUsingUtcBaseline(epochSecondLocal, nano, zoneId)) - : value(newZonedDateTime(epochSecondLocal, nano, zoneId)); + ? valueFactory.value(newZonedDateTimeUsingUtcBaseline(epochSecondLocal, nano, zoneId)) + : valueFactory.value(newZonedDateTime(epochSecondLocal, nano, zoneId)); } private Value unpackDuration() throws IOException { @@ -421,14 +412,14 @@ private Value unpackDuration() throws IOException { var days = unpacker.unpackLong(); var seconds = unpacker.unpackLong(); var nanoseconds = Math.toIntExact(unpacker.unpackLong()); - return isoDuration(months, days, seconds, nanoseconds); + return valueFactory.isoDuration(months, days, seconds, nanoseconds); } private Value unpackPoint2D() throws IOException { var srid = Math.toIntExact(unpacker.unpackLong()); var x = unpacker.unpackDouble(); var y = unpacker.unpackDouble(); - return point(srid, x, y); + return valueFactory.point(srid, x, y); } private Value unpackPoint3D() throws IOException { @@ -436,7 +427,7 @@ private Value unpackPoint3D() throws IOException { var x = unpacker.unpackDouble(); var y = unpacker.unpackDouble(); var z = unpacker.unpackDouble(); - return point(srid, x, y, z); + return valueFactory.point(srid, x, y, z); } private static ZonedDateTime newZonedDateTime(long epochSecondLocal, long nano, ZoneId zoneId) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/BeginMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/BeginMessageEncoder.java similarity index 59% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/BeginMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/BeginMessageEncoder.java index a16a8f5f6c..3cf233fb22 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/BeginMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/BeginMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; public class BeginMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, BeginMessage.class); var beginMessage = (BeginMessage) message; packer.packStructHeader(1, beginMessage.signature()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/CommitMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/CommitMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/CommitMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/CommitMessageEncoder.java index c3136cff57..d47c1592da 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/CommitMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/CommitMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; public class CommitMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, CommitMessage.class); packer.packStructHeader(0, CommitMessage.SIGNATURE); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardAllMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardAllMessageEncoder.java similarity index 57% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardAllMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardAllMessageEncoder.java index 17903ac19a..6d13df0b27 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardAllMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardAllMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; public class DiscardAllMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, DiscardAllMessage.class); packer.packStructHeader(0, DiscardAllMessage.SIGNATURE); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardMessageEncoder.java similarity index 58% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardMessageEncoder.java index 41e40dfe18..284f3f6f12 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; public class DiscardMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, DiscardMessage.class); packer.packStructHeader(1, DiscardMessage.SIGNATURE); packer.pack(((DiscardMessage) message).metadata()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/GoodbyeMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/GoodbyeMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/GoodbyeMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/GoodbyeMessageEncoder.java index d8907c517e..87e56792c3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/GoodbyeMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/GoodbyeMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; public class GoodbyeMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, GoodbyeMessage.class); packer.packStructHeader(0, GoodbyeMessage.SIGNATURE); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/HelloMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/HelloMessageEncoder.java similarity index 59% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/HelloMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/HelloMessageEncoder.java index ae90cdaf41..ad216c33f8 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/HelloMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/HelloMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; public class HelloMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, HelloMessage.class); var helloMessage = (HelloMessage) message; packer.packStructHeader(1, helloMessage.signature()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/LogoffMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/LogoffMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/LogoffMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/LogoffMessageEncoder.java index 3d1e8e59e7..d98e1f4970 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/LogoffMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/LogoffMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogoffMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogoffMessage; public class LogoffMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, LogoffMessage.class); packer.packStructHeader(0, message.signature()); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/LogonMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/LogonMessageEncoder.java similarity index 59% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/LogonMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/LogonMessageEncoder.java index f4f732f630..387d545c52 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/LogonMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/LogonMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; public class LogonMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, LogonMessage.class); var logonMessage = (LogonMessage) message; packer.packStructHeader(1, logonMessage.signature()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullAllMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullAllMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullAllMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullAllMessageEncoder.java index 51b0a05ae7..10cb3db1b4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullAllMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullAllMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; public class PullAllMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, PullAllMessage.class); packer.packStructHeader(0, PullAllMessage.SIGNATURE); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullMessageEncoder.java similarity index 58% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullMessageEncoder.java index 3c2edd5bc7..ae1a766c33 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; public class PullMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, PullMessage.class); packer.packStructHeader(1, PullMessage.SIGNATURE); packer.pack(((PullMessage) message).metadata()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/ResetMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/ResetMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/ResetMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/ResetMessageEncoder.java index 7fea8b44af..3284f7a31f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/ResetMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/ResetMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; public class ResetMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, ResetMessage.class); packer.packStructHeader(0, ResetMessage.SIGNATURE); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RollbackMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RollbackMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RollbackMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RollbackMessageEncoder.java index e0a223264a..d049b5715b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RollbackMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RollbackMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; public class RollbackMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, RollbackMessage.class); packer.packStructHeader(0, RollbackMessage.SIGNATURE); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteMessageEncoder.java similarity index 59% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteMessageEncoder.java index 80d1d79492..cf9e6d95fe 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteMessageEncoder.java @@ -14,28 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; /** * Encodes the ROUTE message to the stream */ public class RouteMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, RouteMessage.class); var routeMessage = (RouteMessage) message; packer.packStructHeader(3, message.signature()); packer.pack(routeMessage.routingContext()); - packer.pack(value(routeMessage.bookmarks())); + packer.pack(valueFactory.value(routeMessage.bookmarks())); packer.pack(routeMessage.databaseName()); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteV44MessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteV44MessageEncoder.java similarity index 57% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteV44MessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteV44MessageEncoder.java index cc396be5b8..661002bca1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteV44MessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteV44MessageEncoder.java @@ -14,37 +14,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; import java.util.Collections; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; /** * Encodes the ROUTE message to the stream */ public class RouteV44MessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, RouteMessage.class); var routeMessage = (RouteMessage) message; packer.packStructHeader(3, message.signature()); packer.pack(routeMessage.routingContext()); - packer.pack(value(routeMessage.bookmarks())); + packer.pack(valueFactory.value(routeMessage.bookmarks())); Map params; if (routeMessage.impersonatedUser() != null && routeMessage.databaseName() == null) { - params = Collections.singletonMap("imp_user", value(routeMessage.impersonatedUser())); + params = Collections.singletonMap("imp_user", valueFactory.value(routeMessage.impersonatedUser())); } else if (routeMessage.databaseName() != null) { - params = Collections.singletonMap("db", value(routeMessage.databaseName())); + params = Collections.singletonMap("db", valueFactory.value(routeMessage.databaseName())); } else { params = Collections.emptyMap(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RunWithMetadataMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RunWithMetadataMessageEncoder.java similarity index 61% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RunWithMetadataMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RunWithMetadataMessageEncoder.java index 226c4b8acd..9757c7e4e4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RunWithMetadataMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RunWithMetadataMessageEncoder.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; public class RunWithMetadataMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, RunWithMetadataMessage.class); var runMessage = (RunWithMetadataMessage) message; packer.packStructHeader(3, runMessage.signature()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/TelemetryMessageEncoder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/TelemetryMessageEncoder.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/TelemetryMessageEncoder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/TelemetryMessageEncoder.java index 75f96f3e23..4d3ff8ae9a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/TelemetryMessageEncoder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/TelemetryMessageEncoder.java @@ -14,23 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; -import static org.neo4j.driver.internal.bolt.basicimpl.util.Preconditions.checkArgument; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.Preconditions.checkArgument; import java.io.IOException; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; public class TelemetryMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { checkArgument(message, TelemetryMessage.class); var telemetryMessage = (TelemetryMessage) message; packer.packStructHeader(1, TelemetryMessage.SIGNATURE); - packer.pack(Values.value(telemetryMessage.api())); + packer.pack(valueFactory.value(telemetryMessage.api())); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/AbstractStreamingMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/AbstractStreamingMessage.java similarity index 73% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/AbstractStreamingMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/AbstractStreamingMessage.java index 0afa65b82c..5636aa2a99 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/AbstractStreamingMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/AbstractStreamingMessage.java @@ -14,25 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import static org.neo4j.driver.internal.util.MetadataExtractor.ABSENT_QUERY_ID; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor.ABSENT_QUERY_ID; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public abstract class AbstractStreamingMessage implements Message { private final Map metadata = new HashMap<>(); - public static final long STREAM_LIMIT_UNLIMITED = -1; - AbstractStreamingMessage(long n, long id) { - this.metadata.put("n", Values.value(n)); + AbstractStreamingMessage(long n, long id, ValueFactory valueFactory) { + this.metadata.put("n", valueFactory.value(n)); if (id != ABSENT_QUERY_ID) { - this.metadata.put("qid", Values.value(id)); + this.metadata.put("qid", valueFactory.value(id)); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/BeginMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/BeginMessage.java similarity index 83% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/BeginMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/BeginMessage.java index a2367481e7..2124136e9f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/BeginMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/BeginMessage.java @@ -14,19 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TransactionMetadataBuilder.buildMetadata; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TransactionMetadataBuilder.buildMetadata; import java.time.Duration; import java.util.Map; import java.util.Objects; import java.util.Set; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.NotificationConfig; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class BeginMessage extends MessageWithMetadata { public static final byte SIGNATURE = 0x11; @@ -41,7 +42,8 @@ public BeginMessage( String txType, NotificationConfig notificationConfig, boolean legacyNotifications, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { this( bookmarks, txTimeout, @@ -52,7 +54,8 @@ public BeginMessage( txType, notificationConfig, legacyNotifications, - logging); + logging, + valueFactory); } public BeginMessage( @@ -65,7 +68,8 @@ public BeginMessage( String txType, NotificationConfig notificationConfig, boolean legacyNotifications, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { super(buildMetadata( txTimeout, txMetadata, @@ -76,7 +80,8 @@ public BeginMessage( txType, notificationConfig, legacyNotifications, - logging)); + logging, + valueFactory)); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/CommitMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/CommitMessage.java similarity index 87% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/CommitMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/CommitMessage.java index f862eafd8b..7e5a00dd87 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/CommitMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/CommitMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public class CommitMessage implements Message { public static final byte SIGNATURE = 0x12; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/DiscardAllMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/DiscardAllMessage.java similarity index 87% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/DiscardAllMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/DiscardAllMessage.java index fc8d1026b9..6f2c2b2d7e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/DiscardAllMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/DiscardAllMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public class DiscardAllMessage implements Message { public static final byte SIGNATURE = 0x2F; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/DiscardMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/DiscardMessage.java similarity index 77% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/DiscardMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/DiscardMessage.java index aef81d260d..281e9de82c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/DiscardMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/DiscardMessage.java @@ -14,17 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; + +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class DiscardMessage extends AbstractStreamingMessage { public static final byte SIGNATURE = 0x2F; - public static DiscardMessage newDiscardAllMessage(long id) { - return new DiscardMessage(STREAM_LIMIT_UNLIMITED, id); - } - - public DiscardMessage(long n, long id) { - super(n, id); + public DiscardMessage(long n, long id, ValueFactory valueFactory) { + super(n, id, valueFactory); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/GoodbyeMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/GoodbyeMessage.java similarity index 87% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/GoodbyeMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/GoodbyeMessage.java index e50630731e..da29e1c3d0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/GoodbyeMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/GoodbyeMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public class GoodbyeMessage implements Message { public static final byte SIGNATURE = 0x02; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/HelloMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/HelloMessage.java similarity index 77% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/HelloMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/HelloMessage.java index 3a5191bb30..fea034ff9a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/HelloMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/HelloMessage.java @@ -14,19 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; - -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.security.InternalAuthToken.CREDENTIALS_KEY; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.NotificationConfig; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class HelloMessage extends MessageWithMetadata { public static final byte SIGNATURE = 0x01; @@ -39,9 +36,12 @@ public class HelloMessage extends MessageWithMetadata { private static final String BOLT_AGENT_LANGUAGE_DETAIL_KEY = "language_details"; private static final String ROUTING_CONTEXT_METADATA_KEY = "routing"; private static final String PATCH_BOLT_METADATA_KEY = "patch_bolt"; + private static final String CREDENTIALS_KEY = "credentials"; private static final String DATE_TIME_UTC_PATCH_VALUE = "utc"; + private final ValueFactory valueFactory; + public HelloMessage( String userAgent, BoltAgent boltAgent, @@ -49,7 +49,8 @@ public HelloMessage( Map routingContext, boolean includeDateTimeUtc, NotificationConfig notificationConfig, - boolean legacyNotifications) { + boolean legacyNotifications, + ValueFactory valueFactory) { super(buildMetadata( userAgent, boltAgent, @@ -57,7 +58,9 @@ public HelloMessage( routingContext, includeDateTimeUtc, notificationConfig, - legacyNotifications)); + legacyNotifications, + valueFactory)); + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -85,7 +88,7 @@ public int hashCode() { @Override public String toString() { Map metadataCopy = new HashMap<>(metadata()); - metadataCopy.replace(CREDENTIALS_KEY, value("******")); + metadataCopy.replace(CREDENTIALS_KEY, valueFactory.value("******")); return "HELLO " + metadataCopy; } @@ -96,25 +99,26 @@ private static Map buildMetadata( Map routingContext, boolean includeDateTimeUtc, NotificationConfig notificationConfig, - boolean legacyNotifications) { + boolean legacyNotifications, + ValueFactory valueFactory) { Map result = new HashMap<>(); for (var entry : authMap.entrySet()) { - result.put(entry.getKey(), Values.value(entry.getValue())); + result.put(entry.getKey(), valueFactory.value(entry.getValue())); } if (userAgent != null) { - result.put(USER_AGENT_METADATA_KEY, value(userAgent)); + result.put(USER_AGENT_METADATA_KEY, valueFactory.value(userAgent)); } if (boltAgent != null) { var boltAgentMap = toMap(boltAgent); - result.put(BOLT_AGENT_METADATA_KEY, value(boltAgentMap)); + result.put(BOLT_AGENT_METADATA_KEY, valueFactory.value(boltAgentMap)); } if (routingContext != null) { - result.put(ROUTING_CONTEXT_METADATA_KEY, value(routingContext)); + result.put(ROUTING_CONTEXT_METADATA_KEY, valueFactory.value(routingContext)); } if (includeDateTimeUtc) { - result.put(PATCH_BOLT_METADATA_KEY, value(Collections.singleton(DATE_TIME_UTC_PATCH_VALUE))); + result.put(PATCH_BOLT_METADATA_KEY, valueFactory.value(Collections.singleton(DATE_TIME_UTC_PATCH_VALUE))); } - MessageWithMetadata.appendNotificationConfig(result, notificationConfig, legacyNotifications); + MessageWithMetadata.appendNotificationConfig(result, notificationConfig, legacyNotifications, valueFactory); return result; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/LogoffMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/LogoffMessage.java similarity index 87% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/LogoffMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/LogoffMessage.java index ba36290444..c07dd60378 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/LogoffMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/LogoffMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public class LogoffMessage implements Message { public static final byte SIGNATURE = 0x6B; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/LogonMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/LogonMessage.java similarity index 65% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/LogonMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/LogonMessage.java index 94ae98dd8b..bd78b83dc0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/LogonMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/LogonMessage.java @@ -14,20 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; - -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.security.InternalAuthToken.CREDENTIALS_KEY; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import java.util.HashMap; import java.util.Map; -import org.neo4j.driver.Value; +import java.util.Objects; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class LogonMessage extends MessageWithMetadata { public static final byte SIGNATURE = 0x6A; + private static final String CREDENTIALS_KEY = "credentials"; + + private final ValueFactory valueFactory; - public LogonMessage(Map authMap) { + public LogonMessage(Map authMap, ValueFactory valueFactory) { super(authMap); + this.valueFactory = Objects.requireNonNull(valueFactory); } @Override @@ -38,7 +41,7 @@ public byte signature() { @Override public String toString() { Map metadataCopy = new HashMap<>(metadata()); - metadataCopy.replace(CREDENTIALS_KEY, value("******")); + metadataCopy.replace(CREDENTIALS_KEY, valueFactory.value("******")); return "LOGON " + metadataCopy; } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/MessageWithMetadata.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/MessageWithMetadata.java similarity index 76% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/MessageWithMetadata.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/MessageWithMetadata.java index f950dbfd69..de03325f40 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/MessageWithMetadata.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/MessageWithMetadata.java @@ -14,15 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; - -import static org.neo4j.driver.Values.value; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import java.util.Map; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.NotificationClassification; import org.neo4j.driver.internal.bolt.api.NotificationConfig; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; abstract class MessageWithMetadata implements Message { static final String NOTIFICATIONS_MINIMUM_SEVERITY = "notifications_minimum_severity"; @@ -39,11 +38,16 @@ public Map metadata() { } static void appendNotificationConfig( - Map result, NotificationConfig config, boolean legacyNotifications) { + Map result, + NotificationConfig config, + boolean legacyNotifications, + ValueFactory valueFactory) { if (config != null) { var severity = config.minimumSeverity(); if (severity != null) { - result.put(NOTIFICATIONS_MINIMUM_SEVERITY, value(severity.type().toString())); + result.put( + NOTIFICATIONS_MINIMUM_SEVERITY, + valueFactory.value(severity.type().toString())); } var disabledClassifications = config.disabledClassifications(); if (disabledClassifications != null) { @@ -55,7 +59,7 @@ static void appendNotificationConfig( legacyNotifications ? NOTIFICATIONS_DISABLED_CATEGORIES : NOTIFICATIONS_DISABLED_CLASSIFICATIONS, - value(list)); + valueFactory.value(list)); } } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/MultiDatabaseUtil.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/MultiDatabaseUtil.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/MultiDatabaseUtil.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/MultiDatabaseUtil.java index 7f4e8720bf..d55b663e6a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/MultiDatabaseUtil.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/MultiDatabaseUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.DatabaseName; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/PullAllMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/PullAllMessage.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/PullAllMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/PullAllMessage.java index 6abadd1cde..ff85872147 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/PullAllMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/PullAllMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * PULL_ALL request message diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/PullMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/PullMessage.java similarity index 76% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/PullMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/PullMessage.java index 7c5c4ff2c0..8690fc549a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/PullMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/PullMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import static org.neo4j.driver.internal.util.MetadataExtractor.ABSENT_QUERY_ID; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; /** * PULL request message @@ -25,10 +25,9 @@ */ public class PullMessage extends AbstractStreamingMessage { public static final byte SIGNATURE = 0x3F; - public static final PullMessage PULL_ALL = new PullMessage(STREAM_LIMIT_UNLIMITED, ABSENT_QUERY_ID); - public PullMessage(long n, long id) { - super(n, id); + public PullMessage(long n, long id, ValueFactory valueFactory) { + super(n, id, valueFactory); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/ResetMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/ResetMessage.java similarity index 92% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/ResetMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/ResetMessage.java index 4fc1a61fa5..59f5b35ea3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/ResetMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/ResetMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * RESET request message diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RollbackMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RollbackMessage.java similarity index 87% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RollbackMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RollbackMessage.java index 58030e218f..a60197b6d6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RollbackMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RollbackMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public class RollbackMessage implements Message { public static final byte SIGNATURE = 0x13; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RouteMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RouteMessage.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RouteMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RouteMessage.java index 8bcfa1b91c..01f3aeca64 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RouteMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RouteMessage.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import static java.util.Collections.unmodifiableMap; import java.util.Map; import java.util.Objects; import java.util.Set; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * From the application point of view it is not interesting to know about the role a member plays in the cluster. Instead, the application needs to know which diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RunWithMetadataMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RunWithMetadataMessage.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RunWithMetadataMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RunWithMetadataMessage.java index 72ddf8d2a7..592643c180 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/RunWithMetadataMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/RunWithMetadataMessage.java @@ -14,20 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import static java.util.Collections.emptyMap; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TransactionMetadataBuilder.buildMetadata; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TransactionMetadataBuilder.buildMetadata; import java.time.Duration; import java.util.Map; import java.util.Objects; import java.util.Set; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.NotificationConfig; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class RunWithMetadataMessage extends MessageWithMetadata { public static final byte SIGNATURE = 0x10; @@ -46,7 +47,8 @@ public static RunWithMetadataMessage autoCommitTxRunMessage( String impersonatedUser, NotificationConfig notificationConfig, boolean legacyNotifications, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { var metadata = buildMetadata( txTimeout, txMetadata, @@ -57,7 +59,8 @@ public static RunWithMetadataMessage autoCommitTxRunMessage( null, notificationConfig, legacyNotifications, - logging); + logging, + valueFactory); return new RunWithMetadataMessage(query, parameters, metadata); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TelemetryMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TelemetryMessage.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TelemetryMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TelemetryMessage.java index 12109368ee..fa43367bb5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TelemetryMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TelemetryMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * TELEMETRY message diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TransactionMetadataBuilder.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TransactionMetadataBuilder.java similarity index 81% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TransactionMetadataBuilder.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TransactionMetadataBuilder.java index 527f73aa4d..b52626b87b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TransactionMetadataBuilder.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TransactionMetadataBuilder.java @@ -14,20 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import static java.util.Collections.emptyMap; -import static org.neo4j.driver.Values.value; import java.time.Duration; import java.util.HashMap; import java.util.Map; import java.util.Set; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.NotificationConfig; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; public class TransactionMetadataBuilder { private static final String BOOKMARKS_METADATA_KEY = "bookmarks"; @@ -49,7 +49,8 @@ public static Map buildMetadata( String txType, NotificationConfig notificationConfig, boolean legacyNotifications, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { var bookmarksPresent = !bookmarks.isEmpty(); var txTimeoutPresent = txTimeout != null; var txMetadataPresent = txMetadata != null && !txMetadata.isEmpty(); @@ -73,7 +74,7 @@ public static Map buildMetadata( Map result = new HashMap<>(5); if (bookmarksPresent) { - result.put(BOOKMARKS_METADATA_KEY, value(bookmarks)); + result.put(BOOKMARKS_METADATA_KEY, valueFactory.value(bookmarks)); } if (txTimeoutPresent) { var millis = txTimeout.toMillis(); @@ -84,23 +85,23 @@ public static Map buildMetadata( System.Logger.Level.INFO, "The transaction timeout has been rounded up to next millisecond value since the config had a fractional millisecond value"); } - result.put(TX_TIMEOUT_METADATA_KEY, value(millis)); + result.put(TX_TIMEOUT_METADATA_KEY, valueFactory.value(millis)); } if (txMetadataPresent) { - result.put(TX_METADATA_METADATA_KEY, value(txMetadata)); + result.put(TX_METADATA_METADATA_KEY, valueFactory.value(txMetadata)); } if (accessModePresent) { - result.put(MODE_KEY, value(MODE_READ_VALUE)); + result.put(MODE_KEY, valueFactory.value(MODE_READ_VALUE)); } if (impersonatedUserPresent) { - result.put(IMPERSONATED_USER_KEY, value(impersonatedUser)); + result.put(IMPERSONATED_USER_KEY, valueFactory.value(impersonatedUser)); } if (txTypePresent) { - result.put(TX_TYPE_KEY, value(txType)); + result.put(TX_TYPE_KEY, valueFactory.value(txType)); } - MessageWithMetadata.appendNotificationConfig(result, notificationConfig, legacyNotifications); + MessageWithMetadata.appendNotificationConfig(result, notificationConfig, legacyNotifications, valueFactory); - databaseName.databaseName().ifPresent(name -> result.put(DATABASE_NAME_KEY, value(name))); + databaseName.databaseName().ifPresent(name -> result.put(DATABASE_NAME_KEY, valueFactory.value(name))); return result; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/FailureMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/FailureMessage.java similarity index 88% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/FailureMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/FailureMessage.java index 8c367df7fc..40e40d76fe 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/FailureMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/FailureMessage.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.response; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response; import static java.lang.String.format; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * FAILURE response message diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/IgnoredMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/IgnoredMessage.java similarity index 90% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/IgnoredMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/IgnoredMessage.java index e6358a75f3..705a605d96 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/IgnoredMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/IgnoredMessage.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.response; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * IGNORED response message diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/RecordMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/RecordMessage.java similarity index 86% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/RecordMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/RecordMessage.java index a0e061a9b2..caf98c190b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/RecordMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/RecordMessage.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.response; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response; import java.util.Arrays; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public record RecordMessage(Value[] fields) implements Message { public static final byte SIGNATURE = 0x71; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/SuccessMessage.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/SuccessMessage.java similarity index 86% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/SuccessMessage.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/SuccessMessage.java index 9192e4a12c..d400b548a2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/SuccessMessage.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/SuccessMessage.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.response; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response; import static java.lang.String.format; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; /** * SUCCESS response message diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/BoltProtocolV3.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/BoltProtocolV3.java similarity index 72% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/BoltProtocolV3.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/BoltProtocolV3.java index a0293a40c5..e17398e060 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/BoltProtocolV3.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/BoltProtocolV3.java @@ -14,27 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v3; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.messageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.messageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; import io.netty.channel.Channel; import java.time.Clock; import java.time.Duration; -import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Record; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalRecord; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; @@ -51,28 +46,29 @@ import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.DiscardResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.HelloResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.ResetResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.MultiDatabaseUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; -import org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor; -import org.neo4j.driver.types.MapAccessor; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.DiscardResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.HelloResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.ResetResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.MultiDatabaseUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor; public class BoltProtocolV3 implements BoltProtocol { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(3, 0); @@ -99,7 +95,8 @@ public CompletionStage initializeChannel( RoutingContext routingContext, NotificationConfig notificationConfig, Clock clock, - CompletableFuture latestAuthMillisFuture) { + CompletableFuture latestAuthMillisFuture, + ValueFactory valueFactory) { var exception = verifyNotificationConfigSupported(notificationConfig); if (exception != null) { return CompletableFuture.failedStage(exception); @@ -114,7 +111,8 @@ public CompletionStage initializeChannel( routingContext.toMap(), includeDateTimeUtcPatchInHello(), notificationConfig, - useLegacyNotifications()); + useLegacyNotifications(), + valueFactory); } else { message = new HelloMessage( userAgent, @@ -123,7 +121,8 @@ public CompletionStage initializeChannel( null, includeDateTimeUtcPatchInHello(), notificationConfig, - useLegacyNotifications()); + useLegacyNotifications(), + valueFactory); } var future = new CompletableFuture(); @@ -143,9 +142,9 @@ public CompletionStage route( String impersonatedUser, MessageHandler handler, Clock clock, - LoggingProvider logging) { - var query = new Query( - GET_ROUTING_TABLE, parameters(ROUTING_CONTEXT, routingContext).asMap(Values::value)); + LoggingProvider logging, + ValueFactory valueFactory) { + var query = new Query(GET_ROUTING_TABLE, Map.of(ROUTING_CONTEXT, valueFactory.value(routingContext))); var runMessage = RunWithMetadataMessage.autoCommitTxRunMessage( query.query(), @@ -158,16 +157,15 @@ public CompletionStage route( null, NotificationConfig.defaultConfig(), useLegacyNotifications(), - logging); + logging, + valueFactory); var runFuture = new CompletableFuture(); var runHandler = new RunResponseHandler(runFuture, METADATA_EXTRACTOR); - var pullFuture = new CompletableFuture(); - var records = new ArrayList(); + var pullFuture = new CompletableFuture>(); runFuture .thenCompose(ignored -> pullFuture) - .thenApply(ignored -> { - var map = records.get(0); + .thenApply(map -> { var ttl = map.get("ttl").asLong(); var expirationTimestamp = clock.millis() + ttl * 1000; if (ttl < 0 || ttl >= Long.MAX_VALUE / 1000L || expirationTimestamp < 0) { @@ -178,12 +176,10 @@ public CompletionStage route( Set writers = new LinkedHashSet<>(); Set routers = new LinkedHashSet<>(); - for (var serversMap : map.get("servers").asList(MapAccessor::asMap)) { - var role = (Values.value(serversMap.get("role")).asString()); - for (var server : - Values.value(serversMap.get("addresses")).asList()) { - var address = - new BoltServerAddress(Values.value(server).asString()); + for (var serversMap : map.get("servers").values()) { + var role = serversMap.get("role").asString(); + for (var server : serversMap.get("addresses").values()) { + var address = new BoltServerAddress(server.asString()); switch (role) { case "WRITE" -> writers.add(address); case "READ" -> readers.add(address); @@ -192,7 +188,10 @@ public CompletionStage route( } } var db = map.get("db"); - var name = db != null ? db.computeOrDefault(Value::asString, null) : null; + String name = null; + if (db != null && !db.isNull()) { + name = db.asString(); + } var clusterComposition = new ClusterComposition(expirationTimestamp, readers, writers, routers, name); @@ -208,23 +207,33 @@ public CompletionStage route( return connection.write(runMessage, runHandler).thenCompose(ignored -> { var pullMessage = PullAllMessage.PULL_ALL; - var pullHandler = new PullResponseHandlerImpl(new PullMessageHandler() { - @Override - public void onRecord(Value[] fields) { - var keys = runFuture.join().keys(); - records.add(new InternalRecord(keys, fields)); - } - - @Override - public void onError(Throwable throwable) { - pullFuture.completeExceptionally(throwable); - } - - @Override - public void onSummary(PullSummary success) { - pullFuture.complete(success); - } - }); + var pullHandler = new PullResponseHandlerImpl( + new PullMessageHandler() { + private Map routingTable; + + @Override + public void onRecord(Value[] fields) { + if (routingTable == null) { + var keys = runFuture.join().keys(); + routingTable = new HashMap<>(keys.size()); + for (var i = 0; i < keys.size(); i++) { + routingTable.put(keys.get(i), fields[i]); + } + routingTable = Collections.unmodifiableMap(routingTable); + } + } + + @Override + public void onError(Throwable throwable) { + pullFuture.completeExceptionally(throwable); + } + + @Override + public void onSummary(PullSummary success) { + pullFuture.complete(routingTable); + } + }, + valueFactory); return connection.write(pullMessage, pullHandler); }); } @@ -241,7 +250,8 @@ public CompletionStage beginTransaction( String txType, NotificationConfig notificationConfig, MessageHandler handler, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { var exception = verifyNotificationConfigSupported(notificationConfig); if (exception != null) { return CompletableFuture.failedStage(exception); @@ -263,7 +273,8 @@ public CompletionStage beginTransaction( txType, notificationConfig, useLegacyNotifications(), - logging); + logging, + valueFactory); beginTxFuture.whenComplete((ignored, throwable) -> { if (throwable != null) { handler.onError(throwable); @@ -333,7 +344,8 @@ public CompletionStage runAuto( Map txMetadata, NotificationConfig notificationConfig, MessageHandler handler, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { try { verifyDatabaseNameBeforeTransaction(databaseName); } catch (Exception error) { @@ -351,7 +363,8 @@ public CompletionStage runAuto( impersonatedUser, notificationConfig, useLegacyNotifications(), - logging); + logging, + valueFactory); var runFuture = new CompletableFuture(); runFuture.whenComplete((summary, throwable) -> { if (throwable != null) { @@ -382,16 +395,21 @@ public CompletionStage run( } @Override - public CompletionStage pull(Connection connection, long qid, long request, PullMessageHandler handler) { + public CompletionStage pull( + Connection connection, long qid, long request, PullMessageHandler handler, ValueFactory valueFactory) { var pullMessage = PullAllMessage.PULL_ALL; - var pullHandler = new PullResponseHandlerImpl(handler); + var pullHandler = new PullResponseHandlerImpl(handler, valueFactory); return connection.write(pullMessage, pullHandler); } @Override public CompletionStage discard( - Connection connection, long qid, long number, MessageHandler handler) { - var discardMessage = new DiscardMessage(number, qid); + Connection connection, + long qid, + long number, + MessageHandler handler, + ValueFactory valueFactory) { + var discardMessage = new DiscardMessage(number, qid, valueFactory); var discardFuture = new CompletableFuture(); discardFuture.whenComplete((ignored, throwable) -> { if (throwable != null) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageFormatV3.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageFormatV3.java similarity index 50% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageFormatV3.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageFormatV3.java index 510579e1ee..18898e51fe 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageFormatV3.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageFormatV3.java @@ -14,21 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v3; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV3 implements MessageFormat { @Override - public Writer newWriter(PackOutput output) { - return new MessageWriterV3(output); + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV3(output, valueFactory); } @Override - public Reader newReader(PackInput input) { - return new CommonMessageReader(input, false); + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new CommonMessageReader(input, false, valueFactory); } } diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageWriterV3.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageWriterV3.java new file mode 100644 index 0000000000..6c4e313f07 --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageWriterV3.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v3; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardAllMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullAllMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +public class MessageWriterV3 extends AbstractMessageWriter { + public MessageWriterV3(PackOutput output, ValueFactory valueFactory) { + super(new CommonValuePacker(output, false), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.of( + HelloMessage.SIGNATURE, new HelloMessageEncoder(), + GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), + RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), + DiscardAllMessage.SIGNATURE, new DiscardAllMessageEncoder(), + PullAllMessage.SIGNATURE, new PullAllMessageEncoder(), + BeginMessage.SIGNATURE, new BeginMessageEncoder(), + CommitMessage.SIGNATURE, new CommitMessageEncoder(), + RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), + ResetMessage.SIGNATURE, new ResetMessageEncoder()); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/BoltProtocolV4.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/BoltProtocolV4.java similarity index 58% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/BoltProtocolV4.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/BoltProtocolV4.java index fbccc8ff83..2e78a0935c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/BoltProtocolV4.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/BoltProtocolV4.java @@ -14,12 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v4; - -import static org.neo4j.driver.Values.value; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4; import java.time.Clock; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; @@ -27,10 +24,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Record; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalRecord; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; @@ -42,17 +35,18 @@ import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; -import org.neo4j.driver.types.MapAccessor; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV4 extends BoltProtocolV3 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(4, 0); @@ -77,11 +71,15 @@ public CompletionStage route( String impersonatedUser, MessageHandler handler, Clock clock, - LoggingProvider logging) { - var parameters = new HashMap(); - parameters.put(ROUTING_CONTEXT, value(routingContext)); - parameters.put(DATABASE_NAME, value((Object) databaseName)); - var query = new Query(MULTI_DB_GET_ROUTING_TABLE, parameters); + LoggingProvider logging, + ValueFactory valueFactory) { + var query = new Query( + MULTI_DB_GET_ROUTING_TABLE, + Map.of( + ROUTING_CONTEXT, + valueFactory.value(routingContext), + DATABASE_NAME, + valueFactory.value(databaseName))); var runMessage = RunWithMetadataMessage.autoCommitTxRunMessage( query.query(), @@ -94,17 +92,15 @@ public CompletionStage route( null, NotificationConfig.defaultConfig(), useLegacyNotifications(), - logging); + logging, + valueFactory); var runFuture = new CompletableFuture(); var runHandler = new RunResponseHandler(runFuture, METADATA_EXTRACTOR); - - var pullFuture = new CompletableFuture(); - var records = new ArrayList(); + var pullFuture = new CompletableFuture>(); runFuture .thenCompose(ignored -> pullFuture) - .thenApply(ignored -> { - var map = records.get(0); + .thenApply(map -> { var ttl = map.get("ttl").asLong(); var expirationTimestamp = clock.millis() + ttl * 1000; if (ttl < 0 || ttl >= Long.MAX_VALUE / 1000L || expirationTimestamp < 0) { @@ -115,12 +111,10 @@ public CompletionStage route( Set writers = new LinkedHashSet<>(); Set routers = new LinkedHashSet<>(); - for (var serversMap : map.get("servers").asList(MapAccessor::asMap)) { - var role = (Values.value(serversMap.get("role")).asString()); - for (var server : - Values.value(serversMap.get("addresses")).asList()) { - var address = - new BoltServerAddress(Values.value(server).asString()); + for (var serversMap : map.get("servers").values()) { + var role = serversMap.get("role").asString(); + for (var server : serversMap.get("addresses").values()) { + var address = new BoltServerAddress(server.asString()); switch (role) { case "WRITE" -> writers.add(address); case "READ" -> readers.add(address); @@ -129,7 +123,10 @@ public CompletionStage route( } } var db = map.get("db"); - var name = db != null ? db.computeOrDefault(Value::asString, null) : null; + String name = null; + if (db != null && !db.isNull()) { + name = db.asString(); + } var clusterComposition = new ClusterComposition(expirationTimestamp, readers, writers, routers, name); @@ -144,33 +141,43 @@ public CompletionStage route( }); return connection.write(runMessage, runHandler).thenCompose(ignored -> { - var pullMessage = new PullMessage(-1, -1); - var pullHandler = new PullResponseHandlerImpl(new PullMessageHandler() { - @Override - public void onRecord(Value[] fields) { - var keys = runFuture.join().keys(); - records.add(new InternalRecord(keys, fields)); - } - - @Override - public void onError(Throwable throwable) { - pullFuture.completeExceptionally(throwable); - } - - @Override - public void onSummary(PullSummary success) { - pullFuture.complete(success); - } - }); + var pullMessage = new PullMessage(-1, -1, valueFactory); + var pullHandler = new PullResponseHandlerImpl( + new PullMessageHandler() { + private Map routingTable; + + @Override + public void onRecord(Value[] fields) { + if (routingTable == null) { + var keys = runFuture.join().keys(); + routingTable = new HashMap<>(keys.size()); + for (var i = 0; i < keys.size(); i++) { + routingTable.put(keys.get(i), fields[i]); + } + routingTable = Collections.unmodifiableMap(routingTable); + } + } + + @Override + public void onError(Throwable throwable) { + pullFuture.completeExceptionally(throwable); + } + + @Override + public void onSummary(PullSummary success) { + pullFuture.complete(routingTable); + } + }, + valueFactory); return connection.write(pullMessage, pullHandler); }); } @Override - public CompletionStage pull(Connection connection, long qid, long request, PullMessageHandler handler) { - var pullMessage = new PullMessage(request, qid); - var pullFuture = new CompletableFuture(); - var pullHandler = new PullResponseHandlerImpl(handler); + public CompletionStage pull( + Connection connection, long qid, long request, PullMessageHandler handler, ValueFactory valueFactory) { + var pullMessage = new PullMessage(request, qid, valueFactory); + var pullHandler = new PullResponseHandlerImpl(handler, valueFactory); return connection.write(pullMessage, pullHandler); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageFormatV4.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageFormatV4.java similarity index 50% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageFormatV4.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageFormatV4.java index 7b08533586..662b736697 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageFormatV4.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageFormatV4.java @@ -14,21 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v4; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV4 implements MessageFormat { @Override - public Writer newWriter(PackOutput output) { - return new MessageWriterV4(output); + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV4(output, valueFactory); } @Override - public Reader newReader(PackInput input) { - return new CommonMessageReader(input, false); + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new CommonMessageReader(input, false, valueFactory); } } diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageWriterV4.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageWriterV4.java new file mode 100644 index 0000000000..47d8829dc5 --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageWriterV4.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v4; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +public class MessageWriterV4 extends AbstractMessageWriter { + public MessageWriterV4(PackOutput output, ValueFactory valueFactory) { + super(new CommonValuePacker(output, false), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.of( + HelloMessage.SIGNATURE, new HelloMessageEncoder(), + GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), + RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), + DiscardMessage.SIGNATURE, new DiscardMessageEncoder(), + PullMessage.SIGNATURE, new PullMessageEncoder(), + BeginMessage.SIGNATURE, new BeginMessageEncoder(), + CommitMessage.SIGNATURE, new CommitMessageEncoder(), + RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), + ResetMessage.SIGNATURE, new ResetMessageEncoder()); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/BoltProtocolV41.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/BoltProtocolV41.java similarity index 81% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/BoltProtocolV41.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/BoltProtocolV41.java index 4e58990515..de0f603b75 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/BoltProtocolV41.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/BoltProtocolV41.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v41; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.BoltProtocolV4; public class BoltProtocolV41 extends BoltProtocolV4 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(4, 1); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/BoltProtocolV42.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/BoltProtocolV42.java similarity index 81% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/BoltProtocolV42.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/BoltProtocolV42.java index 632eae463e..8fc19182a9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/BoltProtocolV42.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/BoltProtocolV42.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v42; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v41.BoltProtocolV41; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41.BoltProtocolV41; /** * Bolt V4.2 is identical to V4.1 diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/BoltProtocolV43.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/BoltProtocolV43.java similarity index 75% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/BoltProtocolV43.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/BoltProtocolV43.java index b4ec0fdbed..8715ed1218 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/BoltProtocolV43.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/BoltProtocolV43.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v43; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43; import java.time.Clock; import java.util.LinkedHashSet; @@ -22,21 +22,20 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.ClusterComposition; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RouteMessageResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v42.BoltProtocolV42; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; -import org.neo4j.driver.types.MapAccessor; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RouteMessageResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42.BoltProtocolV42; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; /** * Definition of the Bolt Protocol 4.3 @@ -62,7 +61,8 @@ public CompletionStage route( String impersonatedUser, MessageHandler handler, Clock clock, - LoggingProvider logging) { + LoggingProvider logging, + ValueFactory valueFactory) { var routeMessage = new RouteMessage(routingContext, bookmarks, databaseName, impersonatedUser); var routeFuture = new CompletableFuture>(); routeFuture @@ -77,12 +77,10 @@ public CompletionStage route( Set writers = new LinkedHashSet<>(); Set routers = new LinkedHashSet<>(); - for (var serversMap : map.get("servers").asList(MapAccessor::asMap)) { - var role = (Values.value(serversMap.get("role")).asString()); - for (var server : - Values.value(serversMap.get("addresses")).asList()) { - var address = - new BoltServerAddress(Values.value(server).asString()); + for (var serversMap : map.get("servers").values()) { + var role = serversMap.get("role").asString(); + for (var server : serversMap.get("addresses").values()) { + var address = new BoltServerAddress(server.asString()); switch (role) { case "WRITE" -> writers.add(address); case "READ" -> readers.add(address); @@ -91,7 +89,10 @@ public CompletionStage route( } } var db = map.get("db"); - var name = db != null ? db.computeOrDefault(Value::asString, null) : null; + String name = null; + if (db != null && !db.isNull()) { + name = db.asString(); + } var clusterComposition = new ClusterComposition(expirationTimestamp, readers, writers, routers, name); @@ -104,7 +105,7 @@ public CompletionStage route( handler.onSummary(summary); } }); - var routeHandler = new RouteMessageResponseHandler(routeFuture); + var routeHandler = new RouteMessageResponseHandler(routeFuture, valueFactory); return connection.write(routeMessage, routeHandler); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageFormatV43.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageFormatV43.java similarity index 58% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageFormatV43.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageFormatV43.java index f56a50d9c7..ef74222f35 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageFormatV43.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageFormatV43.java @@ -14,12 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v43; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * Bolt message format v4.3 @@ -28,13 +29,13 @@ public class MessageFormatV43 implements MessageFormat { private boolean dateTimeUtcEnabled; @Override - public Writer newWriter(PackOutput output) { - return new MessageWriterV43(output, dateTimeUtcEnabled); + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV43(output, dateTimeUtcEnabled, valueFactory); } @Override - public Reader newReader(PackInput input) { - return new CommonMessageReader(input, dateTimeUtcEnabled); + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new CommonMessageReader(input, dateTimeUtcEnabled, valueFactory); } @Override diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageWriterV43.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageWriterV43.java new file mode 100644 index 0000000000..07863eec61 --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageWriterV43.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v43; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RouteMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +/** + * Bolt message writer v4.3 + *

+ * This version is able to encode all the versions existing on v4.2, but it encodes + * new messages such as ROUTE + */ +public class MessageWriterV43 extends AbstractMessageWriter { + public MessageWriterV43(PackOutput output, boolean dateTimeUtcEnabled, ValueFactory valueFactory) { + super(new CommonValuePacker(output, dateTimeUtcEnabled), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.of( + HelloMessage.SIGNATURE, new HelloMessageEncoder(), + GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), + RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), + RouteMessage.SIGNATURE, new RouteMessageEncoder(), + DiscardMessage.SIGNATURE, new DiscardMessageEncoder(), + PullMessage.SIGNATURE, new PullMessageEncoder(), + BeginMessage.SIGNATURE, new BeginMessageEncoder(), + CommitMessage.SIGNATURE, new CommitMessageEncoder(), + RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), + ResetMessage.SIGNATURE, new ResetMessageEncoder()); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/BoltProtocolV44.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/BoltProtocolV44.java similarity index 78% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/BoltProtocolV44.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/BoltProtocolV44.java index 8a5f442634..5a122e51dc 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/BoltProtocolV44.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/BoltProtocolV44.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v44; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v43.BoltProtocolV43; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43.BoltProtocolV43; /** * Definition of the Bolt Protocol 4.4 diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageFormatV44.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageFormatV44.java similarity index 57% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageFormatV44.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageFormatV44.java index 603a6bfd2c..c0f7ef44f6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageFormatV44.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageFormatV44.java @@ -14,12 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v44; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * Bolt message format v4.4 @@ -28,13 +29,13 @@ public class MessageFormatV44 implements MessageFormat { private boolean dateTimeUtcEnabled; @Override - public MessageFormat.Writer newWriter(PackOutput output) { - return new MessageWriterV44(output, dateTimeUtcEnabled); + public MessageFormat.Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV44(output, dateTimeUtcEnabled, valueFactory); } @Override - public MessageFormat.Reader newReader(PackInput input) { - return new CommonMessageReader(input, dateTimeUtcEnabled); + public MessageFormat.Reader newReader(PackInput input, ValueFactory valueFactory) { + return new CommonMessageReader(input, dateTimeUtcEnabled, valueFactory); } @Override diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageWriterV44.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageWriterV44.java new file mode 100644 index 0000000000..a4b4920714 --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageWriterV44.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v44; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RouteV44MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +/** + * Bolt message writer v4.4 + */ +public class MessageWriterV44 extends AbstractMessageWriter { + public MessageWriterV44(PackOutput output, boolean dateTimeUtcEnabled, ValueFactory valueFactory) { + super(new CommonValuePacker(output, dateTimeUtcEnabled), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.of( + HelloMessage.SIGNATURE, new HelloMessageEncoder(), + GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), + RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), + RouteMessage.SIGNATURE, new RouteV44MessageEncoder(), + DiscardMessage.SIGNATURE, new DiscardMessageEncoder(), + PullMessage.SIGNATURE, new PullMessageEncoder(), + BeginMessage.SIGNATURE, new BeginMessageEncoder(), + CommitMessage.SIGNATURE, new CommitMessageEncoder(), + RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), + ResetMessage.SIGNATURE, new ResetMessageEncoder()); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/BoltProtocolV5.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/BoltProtocolV5.java similarity index 79% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/BoltProtocolV5.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/BoltProtocolV5.java index 736f4895a8..e88de83238 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/BoltProtocolV5.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/BoltProtocolV5.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v44.BoltProtocolV44; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44.BoltProtocolV44; public class BoltProtocolV5 extends BoltProtocolV44 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 0); diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageFormatV5.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageFormatV5.java new file mode 100644 index 0000000000..22ecfc1286 --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageFormatV5.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v5; + +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +public class MessageFormatV5 implements MessageFormat { + @Override + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV5(output, valueFactory); + } + + @Override + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new MessageReaderV5(input, valueFactory); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageReaderV5.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageReaderV5.java similarity index 61% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageReaderV5.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageReaderV5.java index 473de2ad7d..314a4ff628 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageReaderV5.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageReaderV5.java @@ -14,13 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; public class MessageReaderV5 extends CommonMessageReader { - public MessageReaderV5(PackInput input) { - super(new ValueUnpackerV5(input)); + public MessageReaderV5(PackInput input, ValueFactory valueFactory) { + super(new ValueUnpackerV5(input, valueFactory), valueFactory); } } diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageWriterV5.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageWriterV5.java new file mode 100644 index 0000000000..b5e5e2a80d --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageWriterV5.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v5; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RouteV44MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +public class MessageWriterV5 extends AbstractMessageWriter { + public MessageWriterV5(PackOutput output, ValueFactory valueFactory) { + super(new CommonValuePacker(output, true), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.ofEntries( + Map.entry(HelloMessage.SIGNATURE, new HelloMessageEncoder()), + Map.entry(GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder()), + Map.entry(RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder()), + Map.entry(RouteMessage.SIGNATURE, new RouteV44MessageEncoder()), + Map.entry(DiscardMessage.SIGNATURE, new DiscardMessageEncoder()), + Map.entry(PullMessage.SIGNATURE, new PullMessageEncoder()), + Map.entry(BeginMessage.SIGNATURE, new BeginMessageEncoder()), + Map.entry(CommitMessage.SIGNATURE, new CommitMessageEncoder()), + Map.entry(RollbackMessage.SIGNATURE, new RollbackMessageEncoder()), + Map.entry(ResetMessage.SIGNATURE, new ResetMessageEncoder())); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/ValueUnpackerV5.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/ValueUnpackerV5.java similarity index 67% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/ValueUnpackerV5.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/ValueUnpackerV5.java index 8480656715..dfb0034584 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/ValueUnpackerV5.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/ValueUnpackerV5.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5; import java.io.IOException; import java.util.ArrayList; @@ -22,25 +22,22 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.InternalNode; -import org.neo4j.driver.internal.InternalPath; -import org.neo4j.driver.internal.InternalRelationship; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValueUnpacker; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.types.TypeConstructor; -import org.neo4j.driver.internal.value.PathValue; -import org.neo4j.driver.internal.value.RelationshipValue; -import org.neo4j.driver.types.Node; -import org.neo4j.driver.types.Path; -import org.neo4j.driver.types.Relationship; +import org.neo4j.driver.internal.bolt.api.values.Node; +import org.neo4j.driver.internal.bolt.api.values.Path; +import org.neo4j.driver.internal.bolt.api.values.Relationship; +import org.neo4j.driver.internal.bolt.api.values.Segment; +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValueUnpacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; public class ValueUnpackerV5 extends CommonValueUnpacker { private static final int NODE_FIELDS = 4; private static final int RELATIONSHIP_FIELDS = 8; - public ValueUnpackerV5(PackInput input) { - super(input, true); + public ValueUnpackerV5(PackInput input, ValueFactory valueFactory) { + super(input, true, valueFactory); } @Override @@ -55,7 +52,7 @@ protected int getRelationshipFields() { @SuppressWarnings("DuplicatedCode") @Override - protected InternalNode unpackNode() throws IOException { + protected Node unpackNode() throws IOException { var urn = unpacker.unpackLong(); var numLabels = (int) unpacker.unpackListHeader(); @@ -72,31 +69,31 @@ protected InternalNode unpackNode() throws IOException { var elementId = unpacker.unpackString(); - return new InternalNode(urn, elementId, labels, props); + return valueFactory.node(urn, elementId, labels, props); } @SuppressWarnings("DuplicatedCode") @Override - protected Value unpackPath() throws IOException { + protected Path unpackPath() throws IOException { // List of unique nodes - var uniqNodes = new InternalNode[(int) unpacker.unpackListHeader()]; + var uniqNodes = new Node[(int) unpacker.unpackListHeader()]; for (var i = 0; i < uniqNodes.length; i++) { - ensureCorrectStructSize(TypeConstructor.NODE, getNodeFields(), unpacker.unpackStructHeader()); + ensureCorrectStructSize(Type.NODE, getNodeFields(), unpacker.unpackStructHeader()); ensureCorrectStructSignature("NODE", NODE, unpacker.unpackStructSignature()); uniqNodes[i] = unpackNode(); } // List of unique relationships, without start/end information - var uniqRels = new InternalRelationship[(int) unpacker.unpackListHeader()]; + var uniqRels = new Relationship[(int) unpacker.unpackListHeader()]; for (var i = 0; i < uniqRels.length; i++) { - ensureCorrectStructSize(TypeConstructor.RELATIONSHIP, 4, unpacker.unpackStructHeader()); + ensureCorrectStructSize(Type.RELATIONSHIP, 4, unpacker.unpackStructHeader()); ensureCorrectStructSignature( "UNBOUND_RELATIONSHIP", UNBOUND_RELATIONSHIP, unpacker.unpackStructSignature()); var id = unpacker.unpackLong(); var relType = unpacker.unpackString(); var props = unpackMap(); var elementId = unpacker.unpackString(); - uniqRels[i] = new InternalRelationship( + uniqRels[i] = valueFactory.relationship( id, elementId, -1, String.valueOf(-1), -1, String.valueOf(-1), relType, props); } @@ -105,13 +102,13 @@ protected Value unpackPath() throws IOException { // Knowing the sequence length, we can create the arrays that will represent the nodes, rels and segments in // their "path order" - var segments = new Path.Segment[length / 2]; + var segments = new Segment[length / 2]; var nodes = new Node[segments.length + 1]; var rels = new Relationship[segments.length]; - InternalNode prevNode = uniqNodes[0], nextNode; // Start node is always 0, and isn't encoded in the sequence + Node prevNode = uniqNodes[0], nextNode; // Start node is always 0, and isn't encoded in the sequence nodes[0] = prevNode; - InternalRelationship rel; + Relationship rel; for (var i = 0; i < segments.length; i++) { var relIdx = (int) unpacker.unpackLong(); nextNode = uniqNodes[(int) unpacker.unpackLong()]; @@ -126,19 +123,18 @@ protected Value unpackPath() throws IOException { nodes[i + 1] = nextNode; rels[i] = rel; - segments[i] = new InternalPath.SelfContainedSegment(prevNode, rel, nextNode); + segments[i] = valueFactory.segment(prevNode, rel, nextNode); prevNode = nextNode; } - return new PathValue(new InternalPath(Arrays.asList(segments), Arrays.asList(nodes), Arrays.asList(rels))); + return valueFactory.path(Arrays.asList(segments), Arrays.asList(nodes), Arrays.asList(rels)); } - @SuppressWarnings("deprecation") - private void setStartAndEnd(InternalRelationship rel, InternalNode start, InternalNode end) { + private void setStartAndEnd(Relationship rel, Node start, Node end) { rel.setStartAndEnd(start.id(), start.elementId(), end.id(), end.elementId()); } @Override - protected Value unpackRelationship() throws IOException { + protected Relationship unpackRelationship() throws IOException { var urn = unpacker.unpackLong(); var startUrn = unpacker.unpackLong(); var endUrn = unpacker.unpackLong(); @@ -148,8 +144,7 @@ protected Value unpackRelationship() throws IOException { var startElementId = unpacker.unpackString(); var endElementId = unpacker.unpackString(); - var adapted = new InternalRelationship( + return valueFactory.relationship( urn, elementId, startUrn, startElementId, endUrn, endElementId, relType, props); - return new RelationshipValue(adapted); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/BoltProtocolV51.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/BoltProtocolV51.java similarity index 67% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/BoltProtocolV51.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/BoltProtocolV51.java index 1c83aa17f9..184cc274d9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/BoltProtocolV51.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/BoltProtocolV51.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v51; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.messageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.messageDispatcher; import io.netty.channel.Channel; import java.time.Clock; @@ -24,22 +24,23 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.RoutingContext; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.HelloV51ResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.LogoffResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.LogonResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogoffMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.BoltProtocolV5; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.HelloV51ResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.LogoffResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.LogonResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogoffMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.BoltProtocolV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV51 extends BoltProtocolV5 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 1); @@ -55,7 +56,8 @@ public CompletionStage initializeChannel( RoutingContext routingContext, NotificationConfig notificationConfig, Clock clock, - CompletableFuture latestAuthMillisFuture) { + CompletableFuture latestAuthMillisFuture, + ValueFactory valueFactory) { var exception = verifyNotificationConfigSupported(notificationConfig); if (exception != null) { return CompletableFuture.failedStage(exception); @@ -70,10 +72,18 @@ public CompletionStage initializeChannel( routingContext.toMap(), false, notificationConfig, - useLegacyNotifications()); + useLegacyNotifications(), + valueFactory); } else { message = new HelloMessage( - userAgent, null, Collections.emptyMap(), null, false, notificationConfig, useLegacyNotifications()); + userAgent, + null, + Collections.emptyMap(), + null, + false, + notificationConfig, + useLegacyNotifications(), + valueFactory); } var helloFuture = new CompletableFuture(); @@ -81,7 +91,7 @@ public CompletionStage initializeChannel( channel.write(message, channel.voidPromise()); var logonFuture = new CompletableFuture(); - var logon = new LogonMessage(authMap); + var logon = new LogonMessage(authMap, valueFactory); messageDispatcher(channel) .enqueue(new LogonResponseHandler(logonFuture, channel, clock, latestAuthMillisFuture)); channel.writeAndFlush(logon, channel.voidPromise()); @@ -106,8 +116,12 @@ public CompletionStage logoff(Connection connection, MessageHandler @Override public CompletionStage logon( - Connection connection, Map authMap, Clock clock, MessageHandler handler) { - var logonMessage = new LogonMessage(authMap); + Connection connection, + Map authMap, + Clock clock, + MessageHandler handler, + ValueFactory valueFactory) { + var logonMessage = new LogonMessage(authMap, valueFactory); var logonFuture = new CompletableFuture(); logonFuture.whenComplete((ignored, throwable) -> { if (throwable != null) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageFormatV51.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageFormatV51.java similarity index 50% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageFormatV51.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageFormatV51.java index 8fac3f34f2..bd486ecb3f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageFormatV51.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageFormatV51.java @@ -14,21 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v51; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.MessageReaderV5; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.MessageReaderV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV51 implements MessageFormat { @Override - public Writer newWriter(PackOutput output) { - return new MessageWriterV51(output); + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV51(output, valueFactory); } @Override - public Reader newReader(PackInput input) { - return new MessageReaderV5(input); + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new MessageReaderV5(input, valueFactory); } } diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageWriterV51.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageWriterV51.java new file mode 100644 index 0000000000..4b611d8e73 --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageWriterV51.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v51; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.LogoffMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.LogonMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RouteV44MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogoffMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +public class MessageWriterV51 extends AbstractMessageWriter { + public MessageWriterV51(PackOutput output, ValueFactory valueFactory) { + super(new CommonValuePacker(output, true), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.ofEntries( + Map.entry(HelloMessage.SIGNATURE, new HelloMessageEncoder()), + Map.entry(LogonMessage.SIGNATURE, new LogonMessageEncoder()), + Map.entry(LogoffMessage.SIGNATURE, new LogoffMessageEncoder()), + Map.entry(GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder()), + Map.entry(RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder()), + Map.entry(RouteMessage.SIGNATURE, new RouteV44MessageEncoder()), + Map.entry(DiscardMessage.SIGNATURE, new DiscardMessageEncoder()), + Map.entry(PullMessage.SIGNATURE, new PullMessageEncoder()), + Map.entry(BeginMessage.SIGNATURE, new BeginMessageEncoder()), + Map.entry(CommitMessage.SIGNATURE, new CommitMessageEncoder()), + Map.entry(RollbackMessage.SIGNATURE, new RollbackMessageEncoder()), + Map.entry(ResetMessage.SIGNATURE, new ResetMessageEncoder())); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v52/BoltProtocolV52.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v52/BoltProtocolV52.java similarity index 84% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v52/BoltProtocolV52.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v52/BoltProtocolV52.java index 04b23af13d..80ebf865a6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v52/BoltProtocolV52.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v52/BoltProtocolV52.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v52; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v52; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.exception.BoltException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v51.BoltProtocolV51; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51.BoltProtocolV51; public class BoltProtocolV52 extends BoltProtocolV51 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 2); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v53/BoltProtocolV53.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v53/BoltProtocolV53.java similarity index 73% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v53/BoltProtocolV53.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v53/BoltProtocolV53.java index a95b53fe69..4704baa15f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v53/BoltProtocolV53.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v53/BoltProtocolV53.java @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v53; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v53; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.messageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.messageDispatcher; import io.netty.channel.Channel; import java.time.Clock; @@ -24,17 +24,18 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.RoutingContext; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.HelloV51ResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.LogonResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v52.BoltProtocolV52; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.HelloV51ResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.LogonResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v52.BoltProtocolV52; public class BoltProtocolV53 extends BoltProtocolV52 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 3); @@ -50,7 +51,8 @@ public CompletionStage initializeChannel( RoutingContext routingContext, NotificationConfig notificationConfig, Clock clock, - CompletableFuture latestAuthMillisFuture) { + CompletableFuture latestAuthMillisFuture, + ValueFactory valueFactory) { var exception = verifyNotificationConfigSupported(notificationConfig); if (exception != null) { return CompletableFuture.failedStage(exception); @@ -65,7 +67,8 @@ public CompletionStage initializeChannel( routingContext.toMap(), false, notificationConfig, - useLegacyNotifications()); + useLegacyNotifications(), + valueFactory); } else { message = new HelloMessage( userAgent, @@ -74,7 +77,8 @@ public CompletionStage initializeChannel( null, false, notificationConfig, - useLegacyNotifications()); + useLegacyNotifications(), + valueFactory); } var helloFuture = new CompletableFuture(); @@ -82,7 +86,7 @@ public CompletionStage initializeChannel( channel.write(message, channel.voidPromise()); var logonFuture = new CompletableFuture(); - var logon = new LogonMessage(authMap); + var logon = new LogonMessage(authMap, valueFactory); messageDispatcher(channel) .enqueue(new LogonResponseHandler(logonFuture, channel, clock, latestAuthMillisFuture)); channel.writeAndFlush(logon, channel.voidPromise()); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/BoltProtocolV54.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/BoltProtocolV54.java similarity index 73% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/BoltProtocolV54.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/BoltProtocolV54.java index 6dcb0a5226..e4735fca0e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/BoltProtocolV54.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/BoltProtocolV54.java @@ -14,18 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v54; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.TelemetryResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v53.BoltProtocolV53; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.TelemetryResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v53.BoltProtocolV53; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV54 extends BoltProtocolV53 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 4); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageFormatV54.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageFormatV54.java similarity index 50% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageFormatV54.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageFormatV54.java index 2e11093062..435625722f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageFormatV54.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageFormatV54.java @@ -14,21 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v54; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.MessageReaderV5; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.MessageReaderV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV54 implements MessageFormat { @Override - public Writer newWriter(PackOutput output) { - return new MessageWriterV54(output); + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV54(output, valueFactory); } @Override - public Reader newReader(PackInput input) { - return new MessageReaderV5(input); + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new MessageReaderV5(input, valueFactory); } } diff --git a/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageWriterV54.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageWriterV54.java new file mode 100644 index 0000000000..25a5a076bb --- /dev/null +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageWriterV54.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v54; + +import java.util.Map; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.BeginMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.CommitMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.GoodbyeMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.HelloMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.LogoffMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.LogonMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RollbackMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RouteV44MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.RunWithMetadataMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.TelemetryMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogoffMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; + +public class MessageWriterV54 extends AbstractMessageWriter { + public MessageWriterV54(PackOutput output, ValueFactory valueFactory) { + super(new CommonValuePacker(output, true), buildEncoders(), valueFactory); + } + + private static Map buildEncoders() { + return Map.ofEntries( + Map.entry(HelloMessage.SIGNATURE, new HelloMessageEncoder()), + Map.entry(LogonMessage.SIGNATURE, new LogonMessageEncoder()), + Map.entry(LogoffMessage.SIGNATURE, new LogoffMessageEncoder()), + Map.entry(GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder()), + Map.entry(RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder()), + Map.entry(RouteMessage.SIGNATURE, new RouteV44MessageEncoder()), + Map.entry(DiscardMessage.SIGNATURE, new DiscardMessageEncoder()), + Map.entry(PullMessage.SIGNATURE, new PullMessageEncoder()), + Map.entry(BeginMessage.SIGNATURE, new BeginMessageEncoder()), + Map.entry(CommitMessage.SIGNATURE, new CommitMessageEncoder()), + Map.entry(RollbackMessage.SIGNATURE, new RollbackMessageEncoder()), + Map.entry(ResetMessage.SIGNATURE, new ResetMessageEncoder()), + Map.entry(TelemetryMessage.SIGNATURE, new TelemetryMessageEncoder())); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v55/BoltProtocolV55.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v55/BoltProtocolV55.java similarity index 82% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v55/BoltProtocolV55.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v55/BoltProtocolV55.java index c90a249abe..64261ea88b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v55/BoltProtocolV55.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v55/BoltProtocolV55.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v55; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v55; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.BoltProtocolV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.BoltProtocolV54; public class BoltProtocolV55 extends BoltProtocolV54 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 5); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/BoltProtocolV56.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/BoltProtocolV56.java similarity index 81% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/BoltProtocolV56.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/BoltProtocolV56.java index b2b07d11d5..ed35823159 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/BoltProtocolV56.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/BoltProtocolV56.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v56; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v55.BoltProtocolV55; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v55.BoltProtocolV55; public class BoltProtocolV56 extends BoltProtocolV55 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 6); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/BoltProtocolV57.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/BoltProtocolV57.java similarity index 78% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/BoltProtocolV57.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/BoltProtocolV57.java index 7e4672b213..2eb1a86a44 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/BoltProtocolV57.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/BoltProtocolV57.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v56.BoltProtocolV56; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56.BoltProtocolV56; public class BoltProtocolV57 extends BoltProtocolV56 { public static final BoltProtocolVersion VERSION = new BoltProtocolVersion(5, 7); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageFormatV57.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageFormatV57.java similarity index 50% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageFormatV57.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageFormatV57.java index 97cd39522f..5de9ffac24 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageFormatV57.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageFormatV57.java @@ -14,21 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.MessageWriterV54; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.MessageWriterV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV57 implements MessageFormat { @Override - public MessageFormat.Writer newWriter(PackOutput output) { - return new MessageWriterV54(output); + public MessageFormat.Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new MessageWriterV54(output, valueFactory); } @Override - public Reader newReader(PackInput input) { - return new MessageReaderV57(input); + public Reader newReader(PackInput input, ValueFactory valueFactory) { + return new MessageReaderV57(input, valueFactory); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageReaderV57.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageReaderV57.java similarity index 64% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageReaderV57.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageReaderV57.java index a6b3fe638c..10ab30bbff 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageReaderV57.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageReaderV57.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.exception.BoltProtocolException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ResponseMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.MessageReaderV5; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.types.Type; -import org.neo4j.driver.types.TypeSystem; +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ResponseMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.MessageReaderV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; public class MessageReaderV57 extends MessageReaderV5 { - private static final Type MAP_TYPE = TypeSystem.getDefault().MAP(); - - public MessageReaderV57(PackInput input) { - super(input); + public MessageReaderV57(PackInput input, ValueFactory valueFactory) { + super(input, valueFactory); } @Override @@ -44,47 +41,46 @@ protected void unpackFailureMessage(ResponseMessageHandler output) throws IOExce output.handleFailureMessage(gqlError); } - @SuppressWarnings("DuplicatedCode") protected GqlError unpackGqlError(Map params) { var gqlStatus = params.get("gql_status").asString(); var statusDescription = params.get("description").asString(); - var code = params.getOrDefault("neo4j_code", Values.value("N/A")).asString(); + var code = params.getOrDefault("neo4j_code", valueFactory.value("N/A")).asString(); var message = params.get("message").asString(); Map diagnosticRecord; var diagnosticRecordValue = params.get("diagnostic_record"); - if (diagnosticRecordValue != null && MAP_TYPE.isTypeOf(diagnosticRecordValue)) { + if (diagnosticRecordValue != null && Type.MAP.equals(diagnosticRecordValue.type())) { var containsOperation = diagnosticRecordValue.containsKey("OPERATION"); var containsOperationCode = diagnosticRecordValue.containsKey("OPERATION_CODE"); var containsCurrentSchema = diagnosticRecordValue.containsKey("CURRENT_SCHEMA"); if (containsOperation && containsOperationCode && containsCurrentSchema) { - diagnosticRecord = diagnosticRecordValue.asMap(Values::value); + diagnosticRecord = diagnosticRecordValue.asMap(valueFactory::value); } else { - diagnosticRecord = new HashMap<>(diagnosticRecordValue.asMap(Values::value)); + diagnosticRecord = new HashMap<>(diagnosticRecordValue.asMap(valueFactory::value)); if (!containsOperation) { - diagnosticRecord.put("OPERATION", Values.value("")); + diagnosticRecord.put("OPERATION", valueFactory.value("")); } if (!containsOperationCode) { - diagnosticRecord.put("OPERATION_CODE", Values.value("0")); + diagnosticRecord.put("OPERATION_CODE", valueFactory.value("0")); } if (!containsCurrentSchema) { - diagnosticRecord.put("CURRENT_SCHEMA", Values.value("/")); + diagnosticRecord.put("CURRENT_SCHEMA", valueFactory.value("/")); } diagnosticRecord = Collections.unmodifiableMap(diagnosticRecord); } } else { diagnosticRecord = Map.ofEntries( - Map.entry("OPERATION", Values.value("")), - Map.entry("OPERATION_CODE", Values.value("0")), - Map.entry("CURRENT_SCHEMA", Values.value("/"))); + Map.entry("OPERATION", valueFactory.value("")), + Map.entry("OPERATION_CODE", valueFactory.value("0")), + Map.entry("CURRENT_SCHEMA", valueFactory.value("/"))); } GqlError gqlError = null; var cause = params.get("cause"); if (cause != null) { - if (!MAP_TYPE.isTypeOf(cause)) { + if (!Type.MAP.equals(cause.type())) { throw new BoltProtocolException("Unexpected type"); } - gqlError = unpackGqlError(cause.asMap(Values::value)); + gqlError = unpackGqlError(cause.asMap(valueFactory::value)); } return new GqlError(gqlStatus, statusDescription, code, message, diagnosticRecord, gqlError); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackInput.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackInput.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackInput.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackInput.java index bcbdf2ea8d..444945e420 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackInput.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackInput.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.packstream; +package org.neo4j.driver.internal.bolt.basicimpl.impl.packstream; import java.io.IOException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackOutput.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackOutput.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackOutput.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackOutput.java index 5dd7c2e974..d2acb6c3c6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackOutput.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackOutput.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.packstream; +package org.neo4j.driver.internal.bolt.basicimpl.impl.packstream; import java.io.IOException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackStream.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackStream.java similarity index 99% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackStream.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackStream.java index bc85baa6c1..b79c324350 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackStream.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackStream.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.packstream; +package org.neo4j.driver.internal.bolt.basicimpl.impl.packstream; import static java.lang.Integer.toHexString; import static java.lang.String.format; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackType.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackType.java similarity index 91% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackType.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackType.java index 2caf7eb75f..b5ce15b808 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackType.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackType.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.packstream; +package org.neo4j.driver.internal.bolt.basicimpl.impl.packstream; public enum PackType { NULL, diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/spi/Connection.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/spi/Connection.java similarity index 85% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/spi/Connection.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/spi/Connection.java index 01843a0d81..321f2c3066 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/spi/Connection.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/spi/Connection.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.spi; +package org.neo4j.driver.internal.bolt.basicimpl.impl.spi; import io.netty.channel.EventLoop; import java.util.concurrent.CompletionStage; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; public interface Connection { boolean isOpen(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/spi/ResponseHandler.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/spi/ResponseHandler.java similarity index 90% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/spi/ResponseHandler.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/spi/ResponseHandler.java index 486742b6e9..c195137c7e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/spi/ResponseHandler.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/spi/ResponseHandler.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.spi; +package org.neo4j.driver.internal.bolt.basicimpl.impl.spi; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; public interface ResponseHandler { void onSuccess(Map metadata); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/util/FutureUtil.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/FutureUtil.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/util/FutureUtil.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/FutureUtil.java index e3e063a67c..25e7404c26 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/util/FutureUtil.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/FutureUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.pooledimpl.util; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util; import java.util.concurrent.CompletionException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/LockUtil.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/LockUtil.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/LockUtil.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/LockUtil.java index b0e121d946..e9ff10a015 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/LockUtil.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/LockUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util; import java.util.concurrent.locks.Lock; import java.util.function.Supplier; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/MetadataExtractor.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/MetadataExtractor.java similarity index 89% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/MetadataExtractor.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/MetadataExtractor.java index 4da05ad298..0a9b517d0e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/MetadataExtractor.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/MetadataExtractor.java @@ -14,16 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util; import java.util.ArrayList; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import org.neo4j.driver.Value; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.neo4j.driver.internal.bolt.api.exception.BoltUntrustedServerException; +import org.neo4j.driver.internal.bolt.api.values.Value; public class MetadataExtractor { public static final int ABSENT_QUERY_ID = -1; @@ -80,7 +81,9 @@ public static Value extractServer(Map metadata) { public static Set extractBoltPatches(Map metadata) { var boltPatch = metadata.get("patch_bolt"); if (boltPatch != null && !boltPatch.isNull()) { - return new HashSet<>(boltPatch.asList(Value::asString)); + return StreamSupport.stream(boltPatch.values().spliterator(), false) + .map(Value::asString) + .collect(Collectors.toSet()); } else { return Collections.emptySet(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/Preconditions.java b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/Preconditions.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/Preconditions.java rename to bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/Preconditions.java index 4a1ba6d0bc..d663b93bf3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/Preconditions.java +++ b/bolt-api-netty/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/Preconditions.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util; public class Preconditions { public static void checkArgument(Object argument, Class expectedClass) { diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/BoltAgentUtil.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/BoltAgentUtil.java new file mode 100644 index 0000000000..460e297854 --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/BoltAgentUtil.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl; + +import org.neo4j.driver.internal.bolt.api.BoltAgent; + +public interface BoltAgentUtil { + BoltAgent VALUE = new BoltAgent("agent", null, null, null); +} diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/GqlErrorUtil.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/GqlErrorUtil.java new file mode 100644 index 0000000000..9f2471cd8f --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/GqlErrorUtil.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl; + +import java.util.Map; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.GqlError; +import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; + +public class GqlErrorUtil { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + + public static final Map DIAGNOSTIC_RECORD = Map.ofEntries( + Map.entry("OPERATION", valueFactory.value("")), + Map.entry("OPERATION_CODE", valueFactory.value("0")), + Map.entry("CURRENT_SCHEMA", valueFactory.value("/"))); + + public static GqlError gqlError(String code, String message) { + return new GqlError( + GqlStatusError.UNKNOWN.getStatus(), + GqlStatusError.UNKNOWN.getStatusDescription(message), + code, + message, + DIAGNOSTIC_RECORD, + null); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLoggerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLoggerTest.java similarity index 99% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLoggerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLoggerTest.java index b63008ad22..0acebff935 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/NettyLoggerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NettyLoggerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/NoopLoggingProvider.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NoopLoggingProvider.java similarity index 95% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/NoopLoggingProvider.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NoopLoggingProvider.java index d069bc6353..92f1653f8e 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/NoopLoggingProvider.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/NoopLoggingProvider.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt; +package org.neo4j.driver.internal.bolt.basicimpl.impl; import static org.mockito.Mockito.mock; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BoltProtocolUtilTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/BoltProtocolUtilTest.java similarity index 64% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BoltProtocolUtilTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/BoltProtocolUtilTest.java index 210c2a4523..b95c632822 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/BoltProtocolUtilTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/BoltProtocolUtilTest.java @@ -14,23 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.BOLT_MAGIC_PREAMBLE; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.handshakeBuf; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.handshakeString; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.writeChunkHeader; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.writeEmptyChunkHeader; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.writeMessageBoundary; -import static org.neo4j.driver.testutil.TestUtil.assertByteBufContains; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.BOLT_MAGIC_PREAMBLE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.handshakeBuf; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.handshakeString; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.writeChunkHeader; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.writeEmptyChunkHeader; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.writeMessageBoundary; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.assertByteBufContains; import io.netty.buffer.Unpooled; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v41.BoltProtocolV41; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v44.BoltProtocolV44; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v57.BoltProtocolV57; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41.BoltProtocolV41; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44.BoltProtocolV44; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57.BoltProtocolV57; class BoltProtocolUtilTest { @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelAttributesTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelAttributesTest.java similarity index 70% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelAttributesTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelAttributesTest.java index ffe139be6f..d6ff98ecbe 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelAttributesTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelAttributesTest.java @@ -14,39 +14,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.authorizationStateListener; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.connectionId; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.connectionReadTimeout; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.creationTimestamp; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.lastUsedTimestamp; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.messageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.protocolVersion; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.serverAddress; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.serverAgent; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setAuthorizationStateListener; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setConnectionId; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setConnectionReadTimeout; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setCreationTimestamp; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setLastUsedTimestamp; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setMessageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setProtocolVersion; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setServerAddress; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setServerAgent; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setTerminationReason; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.terminationReason; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.authorizationStateListener; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.connectionId; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.connectionReadTimeout; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.creationTimestamp; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.lastUsedTimestamp; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.messageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.protocolVersion; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.serverAddress; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.serverAgent; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setAuthorizationStateListener; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setConnectionId; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setConnectionReadTimeout; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setCreationTimestamp; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setLastUsedTimestamp; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setMessageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setProtocolVersion; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setServerAddress; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setServerAgent; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setTerminationReason; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.terminationReason; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; class ChannelAttributesTest { private final EmbeddedChannel channel = new EmbeddedChannel(); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelConnectedListenerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelConnectedListenerTest.java similarity index 93% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelConnectedListenerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelConnectedListenerTest.java index 8bea85405d..48fba034e5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelConnectedListenerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelConnectedListenerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -23,8 +23,8 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.neo4j.driver.internal.bolt.api.BoltServerAddress.LOCAL_DEFAULT; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.handshakeBuf; -import static org.neo4j.driver.testutil.TestUtil.await; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.handshakeBuf; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.await; import io.netty.channel.Channel; import io.netty.channel.ChannelPromise; @@ -35,11 +35,11 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.TimeUnit; -import org.jetbrains.annotations.NotNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; class ChannelConnectedListenerTest { private final EmbeddedChannel channel = new EmbeddedChannel(); @@ -114,7 +114,8 @@ private static ChannelConnectedListener newListener(CompletableFuture h LOCAL_DEFAULT, new ChannelPipelineBuilderImpl(), handshakeCompletedFuture, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + mock(ValueFactory.class)); } private record FailedPromise(Throwable failure) implements ChannelPromise { @@ -262,7 +263,7 @@ public Void get() { } @Override - public Void get(long timeout, @NotNull TimeUnit unit) { + public Void get(long timeout, TimeUnit unit) { return null; } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelErrorHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelErrorHandlerTest.java similarity index 81% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelErrorHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelErrorHandlerTest.java index c95771d3d5..04b7bbc58b 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelErrorHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelErrorHandlerTest.java @@ -14,18 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.BDDMockito.then; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setMessageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setTerminationReason; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setMessageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setTerminationReason; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.handler.codec.CodecException; @@ -34,10 +32,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChannelErrorHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChannelErrorHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; class ChannelErrorHandlerTest { private EmbeddedChannel channel; @@ -66,8 +64,8 @@ void shouldHandleChannelInactive() { then(messageDispatcher).should().handleChannelInactive(exceptionCaptor.capture()); var error = exceptionCaptor.getValue(); - assertThat(error, instanceOf(BoltServiceUnavailableException.class)); - assertThat(error.getMessage(), startsWith("Connection to the database terminated")); + assertInstanceOf(BoltServiceUnavailableException.class, error); + assertTrue(error.getMessage().startsWith("Connection to the database terminated")); // assertFalse(channel.isOpen()); } @@ -85,8 +83,8 @@ void shouldHandleChannelInactiveAfterExceptionCaught() { var error2 = exception2.getValue(); assertEquals(originalError, error1); - assertThat(error2, instanceOf(BoltServiceUnavailableException.class)); - assertThat(error2.getMessage(), startsWith("Connection to the database terminated")); + assertInstanceOf(BoltServiceUnavailableException.class, error2); + assertTrue(error2.getMessage().startsWith("Connection to the database terminated")); // assertFalse(channel.isOpen()); } @@ -100,9 +98,9 @@ void shouldHandleChannelInactiveWhenTerminationReasonSet() { var exceptionCaptor = ArgumentCaptor.forClass(BoltServiceUnavailableException.class); then(messageDispatcher).should().handleChannelInactive(exceptionCaptor.capture()); var error = exceptionCaptor.getValue(); - assertThat(error, instanceOf(BoltServiceUnavailableException.class)); - assertThat(error.getMessage(), startsWith("Connection to the database terminated")); - assertThat(error.getMessage(), containsString(terminationReason)); + assertInstanceOf(BoltServiceUnavailableException.class, error); + assertTrue(error.getMessage().startsWith("Connection to the database terminated")); + assertTrue(error.getMessage().contains(terminationReason)); // assertFalse(channel.isOpen()); } @@ -142,7 +140,7 @@ void shouldHandleIOException() { var exceptionCaptor = ArgumentCaptor.forClass(RuntimeException.class); then(messageDispatcher).should().handleChannelError(exceptionCaptor.capture()); var error = exceptionCaptor.getValue(); - assertThat(error, instanceOf(BoltServiceUnavailableException.class)); + assertInstanceOf(BoltServiceUnavailableException.class, error); assertEquals(ioException, error.getCause()); // assertFalse(channel.isOpen()); } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilderImplTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilderImplTest.java new file mode 100644 index 0000000000..b1256b9bcb --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/ChannelPipelineBuilderImplTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.async.connection; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.mockito.Mockito.mock; + +import io.netty.channel.embedded.EmbeddedChannel; +import org.junit.jupiter.api.Test; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChannelErrorHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChunkDecoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.MessageDecoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound.OutboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; + +class ChannelPipelineBuilderImplTest { + @Test + void shouldBuildPipeline() { + var channel = new EmbeddedChannel(); + ChannelAttributes.setMessageDispatcher( + channel, new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE)); + + new ChannelPipelineBuilderImpl() + .build( + new MessageFormatV3(), + channel.pipeline(), + NoopLoggingProvider.INSTANCE, + mock(ValueFactory.class)); + + var iterator = channel.pipeline().iterator(); + assertInstanceOf(ChunkDecoder.class, iterator.next().getValue()); + assertInstanceOf(MessageDecoder.class, iterator.next().getValue()); + assertInstanceOf(InboundMessageHandler.class, iterator.next().getValue()); + + assertInstanceOf(OutboundMessageHandler.class, iterator.next().getValue()); + + assertInstanceOf(ChannelErrorHandler.class, iterator.next().getValue()); + + assertFalse(iterator.hasNext()); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/EventLoopGroupFactoryTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/EventLoopGroupFactoryTest.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/EventLoopGroupFactoryTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/EventLoopGroupFactoryTest.java index 431c9b56a6..9070ef983d 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/EventLoopGroupFactoryTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/EventLoopGroupFactoryTest.java @@ -14,23 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static java.util.concurrent.TimeUnit.SECONDS; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.neo4j.driver.internal.util.Iterables.count; -import static org.neo4j.driver.internal.util.Matchers.blockingOperationInEventLoopError; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import java.util.concurrent.ExecutionException; +import java.util.stream.StreamSupport; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -51,8 +48,10 @@ void shouldReturnCorrectChannelClass() { void shouldCreateEventLoopGroupWithSpecifiedThreadCount() { var threadCount = 2; eventLoopGroup = EventLoopGroupFactory.newEventLoopGroup(threadCount); - assertEquals(threadCount, count(eventLoopGroup)); - assertThat(eventLoopGroup, instanceOf(NioEventLoopGroup.class)); + assertEquals( + threadCount, + StreamSupport.stream(eventLoopGroup.spliterator(), false).count()); + assertInstanceOf(NioEventLoopGroup.class, eventLoopGroup); } @Test @@ -66,7 +65,10 @@ void shouldAssertNotInEventLoopThread() { var assertFuture = eventLoopGroup.submit(EventLoopGroupFactory::assertNotInEventLoopThread); var error = assertThrows(ExecutionException.class, () -> assertFuture.get(30, SECONDS)); - assertThat(error.getCause(), is(blockingOperationInEventLoopError())); + var throwable = error.getCause(); + assertTrue(throwable instanceof IllegalStateException + && throwable.getMessage() != null + && throwable.getMessage().startsWith("Blocking operation can't be executed in IO thread")); } @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/HandshakeHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/HandshakeHandlerTest.java similarity index 79% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/HandshakeHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/HandshakeHandlerTest.java index 38e663a15d..c039937c12 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/HandshakeHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/HandshakeHandlerTest.java @@ -14,20 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; import static io.netty.buffer.Unpooled.copyInt; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.params.provider.Arguments.arguments; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil.NO_PROTOCOL_VERSION; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setMessageDispatcher; -import static org.neo4j.driver.testutil.TestUtil.await; +import static org.mockito.Mockito.mock; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil.NO_PROTOCOL_VERSION; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setMessageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.await; import io.netty.channel.Channel; import io.netty.channel.ChannelPipeline; @@ -43,24 +43,24 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChunkDecoder; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.MessageDecoder; -import org.neo4j.driver.internal.bolt.basicimpl.async.outbound.OutboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.MessageFormatV4; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v41.BoltProtocolV41; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v42.BoltProtocolV42; -import org.neo4j.driver.internal.util.ErrorUtil; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChunkDecoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.MessageDecoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound.OutboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.BoltProtocolV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.MessageFormatV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41.BoltProtocolV41; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42.BoltProtocolV42; class HandshakeHandlerTest { private final EmbeddedChannel channel = new EmbeddedChannel(); @@ -193,7 +193,7 @@ public void testProtocolSelection( channel.pipeline().fireChannelRead(copyInt(protocolVersion.toInt())); // expected message format should've been used - assertThat(pipelineBuilder.usedMessageFormat, instanceOf(expectedMessageFormatClass)); + assertInstanceOf(expectedMessageFormatClass, pipelineBuilder.usedMessageFormat); // handshake handler itself should be removed assertNull(channel.pipeline().get(HandshakeHandler.class)); @@ -235,7 +235,9 @@ void shouldFailGivenPromiseWhenChannelInactive() { // promise should fail var error = assertThrows(BoltServiceUnavailableException.class, () -> await(handshakeCompletedFuture)); - assertEquals(ErrorUtil.newConnectionTerminatedError().getMessage(), error.getMessage()); + assertEquals( + "Connection to the database terminated. Please ensure that your database is listening on the correct host and port and that you have compatible encryption settings both on Neo4j server and driver. Note that the default encryption setting has changed in Neo4j 4.0.", + error.getMessage()); // channel should be closed assertNull(await(channel.closeFuture())); @@ -253,8 +255,8 @@ private void testFailure(BoltProtocolVersion serverSuggestedVersion, String expe // promise should fail var error = assertThrows(Exception.class, () -> await(handshakeCompletedFuture)); - assertThat(error, instanceOf(BoltClientException.class)); - assertThat(error.getMessage(), startsWith(expectedMessagePrefix)); + assertInstanceOf(BoltClientException.class, error); + assertTrue(error.getMessage().startsWith(expectedMessagePrefix)); // channel should be closed assertNull(await(channel.closeFuture())); @@ -274,16 +276,21 @@ private static HandshakeHandler newHandler(CompletableFuture handshakeC private static HandshakeHandler newHandler( ChannelPipelineBuilder pipelineBuilder, CompletableFuture handshakeCompletedPromise) { - return new HandshakeHandler(pipelineBuilder, handshakeCompletedPromise, NoopLoggingProvider.INSTANCE); + return new HandshakeHandler( + pipelineBuilder, handshakeCompletedPromise, NoopLoggingProvider.INSTANCE, mock(ValueFactory.class)); } private static class MemorizingChannelPipelineBuilder extends ChannelPipelineBuilderImpl { MessageFormat usedMessageFormat; @Override - public void build(MessageFormat messageFormat, ChannelPipeline pipeline, LoggingProvider logging) { + public void build( + MessageFormat messageFormat, + ChannelPipeline pipeline, + LoggingProvider logging, + ValueFactory valueFactory) { usedMessageFormat = messageFormat; - super.build(messageFormat, pipeline, logging); + super.build(messageFormat, pipeline, logging, valueFactory); } } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyChannelInitializerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyChannelInitializerTest.java similarity index 57% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyChannelInitializerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyChannelInitializerTest.java index a1af2f9403..5b307d4f2d 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/NettyChannelInitializerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/connection/NettyChannelInitializerTest.java @@ -14,37 +14,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.connection; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.neo4j.driver.internal.bolt.api.BoltServerAddress.LOCAL_DEFAULT; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.creationTimestamp; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.messageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.serverAddress; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.creationTimestamp; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.messageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.serverAddress; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.handler.ssl.SslHandler; -import java.security.GeneralSecurityException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; import java.time.Clock; +import javax.net.ssl.KeyManager; import javax.net.ssl.SNIHostName; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -import org.neo4j.driver.RevocationCheckingStrategy; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.logging.DevNullLogging; -import org.neo4j.driver.internal.security.BoltSecurityPlanManager; -import org.neo4j.driver.internal.security.SecurityPlanImpl; -import org.neo4j.driver.internal.util.FakeClock; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; class NettyChannelInitializerTest { private final EmbeddedChannel channel = new EmbeddedChannel(); @@ -55,8 +54,8 @@ void tearDown() { } @Test - void shouldAddSslHandlerWhenRequiresEncryption() throws Exception { - var security = trustAllCertificates(); + void shouldAddSslHandlerWhenRequiresEncryption() { + var security = trustAllCertificates(false); var initializer = newInitializer(security); initializer.initChannel(channel); @@ -75,9 +74,9 @@ void shouldNotAddSslHandlerWhenDoesNotRequireEncryption() { } @Test - void shouldAddSslHandlerWithHandshakeTimeout() throws Exception { + void shouldAddSslHandlerWithHandshakeTimeout() { var timeoutMillis = 424242; - var security = trustAllCertificates(); + var security = trustAllCertificates(false); var initializer = newInitializer(security, timeoutMillis); initializer.initChannel(channel); @@ -102,10 +101,10 @@ void shouldUpdateChannelAttributes() { } @Test - void shouldIncludeSniHostName() throws Exception { + void shouldIncludeSniHostName() { var address = new BoltServerAddress("database.neo4j.com", 8989); var initializer = new NettyChannelInitializer( - address, trustAllCertificates(), 10000, Clock.systemUTC(), NoopLoggingProvider.INSTANCE); + address, trustAllCertificates(false), 10000, Clock.systemUTC(), NoopLoggingProvider.INSTANCE); initializer.initChannel(channel); @@ -113,27 +112,23 @@ void shouldIncludeSniHostName() throws Exception { var sslEngine = sslHandler.engine(); var sslParameters = sslEngine.getSSLParameters(); var sniServerNames = sslParameters.getServerNames(); - assertThat(sniServerNames, hasSize(1)); - assertThat(sniServerNames.get(0), instanceOf(SNIHostName.class)); - assertThat(((SNIHostName) sniServerNames.get(0)).getAsciiName(), equalTo(address.host())); + assertEquals(1, sniServerNames.size()); + assertInstanceOf(SNIHostName.class, sniServerNames.get(0)); + assertEquals(address.host(), ((SNIHostName) sniServerNames.get(0)).getAsciiName()); } @Test - void shouldEnableHostnameVerificationWhenConfigured() throws Exception { + void shouldEnableHostnameVerificationWhenConfigured() { testHostnameVerificationSetting(true, "HTTPS"); } @Test - void shouldNotEnableHostnameVerificationWhenNotConfigured() throws Exception { + void shouldNotEnableHostnameVerificationWhenNotConfigured() { testHostnameVerificationSetting(false, null); } - private void testHostnameVerificationSetting(boolean enabled, String expectedValue) throws Exception { - var initializer = newInitializer(BoltSecurityPlanManager.from(SecurityPlanImpl.forAllCertificates( - enabled, RevocationCheckingStrategy.NO_CHECKS, null, DevNullLogging.DEV_NULL_LOGGING)) - .plan() - .toCompletableFuture() - .join()); + private void testHostnameVerificationSetting(boolean enabled, String expectedValue) { + var initializer = newInitializer(trustAllCertificates(enabled)); initializer.initChannel(channel); @@ -148,7 +143,7 @@ private static NettyChannelInitializer newInitializer(SecurityPlan securityPlan) } private static NettyChannelInitializer newInitializer(SecurityPlan securityPlan, int connectTimeoutMillis) { - return newInitializer(securityPlan, connectTimeoutMillis, new FakeClock()); + return newInitializer(securityPlan, connectTimeoutMillis, Clock.systemUTC()); } private static NettyChannelInitializer newInitializer( @@ -157,11 +152,48 @@ private static NettyChannelInitializer newInitializer( LOCAL_DEFAULT, securityPlan, connectTimeoutMillis, clock, NoopLoggingProvider.INSTANCE); } - private static SecurityPlan trustAllCertificates() throws GeneralSecurityException { - return BoltSecurityPlanManager.from(SecurityPlanImpl.forAllCertificates( - false, RevocationCheckingStrategy.NO_CHECKS, null, DevNullLogging.DEV_NULL_LOGGING)) - .plan() - .toCompletableFuture() - .join(); + private static SecurityPlan trustAllCertificates(boolean enabled) { + return new SecurityPlan() { + @Override + public boolean requiresEncryption() { + return true; + } + + @Override + public boolean requiresClientAuth() { + return false; + } + + @Override + public SSLContext sslContext() { + SSLContext sslContext; + try { + sslContext = SSLContext.getInstance("TLS"); + sslContext.init(new KeyManager[0], new TrustManager[] {new TrustAllTrustManager()}, null); + } catch (NoSuchAlgorithmException | KeyManagementException e) { + throw new RuntimeException(e); + } + return sslContext; + } + + @Override + public boolean requiresHostnameVerification() { + return enabled; + } + + private static class TrustAllTrustManager implements X509TrustManager { + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + throw new CertificateException("All client connections to this client are forbidden."); + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) { + // all fine, pass through + } + + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + } + }; } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ByteBufInputTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ByteBufInputTest.java similarity index 97% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ByteBufInputTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ByteBufInputTest.java index 84887fcf11..b4252e25ea 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ByteBufInputTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ByteBufInputTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChunkDecoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChunkDecoderTest.java similarity index 96% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChunkDecoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChunkDecoderTest.java index 3d8458929a..cf017ca66a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ChunkDecoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ChunkDecoderTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static io.netty.buffer.ByteBufUtil.hexDump; import static io.netty.buffer.Unpooled.buffer; @@ -29,7 +29,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.testutil.TestUtil.assertByteBufEquals; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.assertByteBufEquals; import io.netty.buffer.ByteBuf; import io.netty.channel.embedded.EmbeddedChannel; @@ -37,8 +37,8 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.LoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; class ChunkDecoderTest { private ByteBuf buffer; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectTimeoutHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectTimeoutHandlerTest.java similarity index 97% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectTimeoutHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectTimeoutHandlerTest.java index 44800eca52..acd3efa842 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectTimeoutHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectTimeoutHandlerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectionReadTimeoutHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectionReadTimeoutHandlerTest.java similarity index 95% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectionReadTimeoutHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectionReadTimeoutHandlerTest.java index 03478a6dd6..6bea76e11a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/ConnectionReadTimeoutHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/ConnectionReadTimeoutHandlerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static org.mockito.BDDMockito.any; import static org.mockito.BDDMockito.then; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageDispatcherTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageDispatcherTest.java similarity index 88% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageDispatcherTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageDispatcherTest.java index 61cecee0c9..ff0b19646d 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageDispatcherTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageDispatcherTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static java.util.Collections.emptyMap; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -32,7 +32,6 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import io.netty.channel.Channel; import io.netty.channel.ChannelConfig; @@ -47,23 +46,24 @@ import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.GqlError; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.exception.BoltFailureException; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelErrorLogger; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; -import org.neo4j.driver.internal.value.IntegerValue; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelActivityLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.logging.ChannelErrorLogger; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; class InboundMessageDispatcherTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String FAILURE_CODE = "Neo.ClientError.Security.Unauthorized"; private static final String FAILURE_MESSAGE = "Error Message"; @@ -87,8 +87,8 @@ void shouldDequeHandlerOnSuccess() { assertEquals(1, dispatcher.queuedHandlersCount()); Map metadata = new HashMap<>(); - metadata.put("key1", value(1)); - metadata.put("key2", value("2")); + metadata.put("key1", valueFactory.value(1)); + metadata.put("key2", valueFactory.value("2")); dispatcher.handleSuccessMessage(metadata); assertEquals(0, dispatcher.queuedHandlersCount()); @@ -104,7 +104,7 @@ void shouldDequeHandlerOnFailure() { dispatcher.enqueue(handler); assertEquals(1, dispatcher.queuedHandlersCount()); - dispatcher.handleFailureMessage(new GqlError(FAILURE_CODE, FAILURE_MESSAGE)); + dispatcher.handleFailureMessage(GqlErrorUtil.gqlError(FAILURE_CODE, FAILURE_MESSAGE)); assertEquals(0, dispatcher.queuedHandlersCount()); verifyFailure(handler); @@ -118,9 +118,9 @@ void shouldPeekHandlerOnRecord() { dispatcher.enqueue(handler); assertEquals(1, dispatcher.queuedHandlersCount()); - Value[] fields1 = {new IntegerValue(1)}; - Value[] fields2 = {new IntegerValue(2)}; - Value[] fields3 = {new IntegerValue(3)}; + var fields1 = new Value[] {valueFactory.value(1)}; + var fields2 = new Value[] {valueFactory.value(2)}; + var fields3 = new Value[] {valueFactory.value(3)}; dispatcher.handleRecordMessage(fields1); dispatcher.handleRecordMessage(fields2); @@ -181,7 +181,8 @@ void shouldThrowWhenNoHandlerToHandleRecordMessage() { var dispatcher = newDispatcher(); assertThrows( - IllegalStateException.class, () -> dispatcher.handleRecordMessage(new Value[] {value(1), value(2)})); + IllegalStateException.class, + () -> dispatcher.handleRecordMessage(new Value[] {valueFactory.value(1), valueFactory.value(2)})); } @Test @@ -281,7 +282,7 @@ void shouldCreateChannelActivityLoggerAndLogDebugMessageOnMessageHandling(Class< .log(eq(System.Logger.Level.DEBUG), eq((ResourceBundle) null), anyString(), any(Map.class)); }; } else if (FailureMessage.class.isAssignableFrom(message)) { - dispatcher.handleFailureMessage(new GqlError(FAILURE_CODE, FAILURE_MESSAGE)); + dispatcher.handleFailureMessage(GqlErrorUtil.gqlError(FAILURE_CODE, FAILURE_MESSAGE)); loggerVerification = () -> { verify(logger).isLoggable(System.Logger.Level.DEBUG); verify(logger) @@ -293,7 +294,7 @@ void shouldCreateChannelActivityLoggerAndLogDebugMessageOnMessageHandling(Class< anyString()); }; } else if (RecordMessage.class.isAssignableFrom(message)) { - dispatcher.handleRecordMessage(Values.values()); + dispatcher.handleRecordMessage(new Value[0]); loggerVerification = () -> { verify(logger).isLoggable(System.Logger.Level.DEBUG); verify(logger).log(eq(System.Logger.Level.DEBUG), eq((ResourceBundle) null), anyString(), anyString()); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageHandlerTest.java similarity index 69% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageHandlerTest.java index e0f33bd5fc..ba777a6c22 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/InboundMessageHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/InboundMessageHandlerTest.java @@ -14,19 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; import io.netty.channel.embedded.EmbeddedChannel; import io.netty.handler.codec.DecoderException; @@ -37,21 +35,24 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.exception.BoltFailureException; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.util.io.MessageToByteBufWriter; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.KnowledgeableMessageFormat; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.io.MessageToByteBufWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.KnowledgeableMessageFormat; class InboundMessageHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private EmbeddedChannel channel; private InboundMessageDispatcher messageDispatcher; private MessageToByteBufWriter writer; @@ -63,7 +64,7 @@ void setUp() { writer = new MessageToByteBufWriter(new KnowledgeableMessageFormat(false)); ChannelAttributes.setMessageDispatcher(channel, messageDispatcher); - var handler = new InboundMessageHandler(new MessageFormatV3(), NoopLoggingProvider.INSTANCE); + var handler = new InboundMessageHandler(new MessageFormatV3(), NoopLoggingProvider.INSTANCE, valueFactory); channel.pipeline().addFirst(handler); } @@ -80,8 +81,8 @@ void shouldReadSuccessMessage() { messageDispatcher.enqueue(responseHandler); Map metadata = new HashMap<>(); - metadata.put("key1", value(1)); - metadata.put("key2", value(2)); + metadata.put("key1", valueFactory.value(1)); + metadata.put("key2", valueFactory.value(2)); channel.writeInbound(writer.asByteBuf(new SuccessMessage(metadata))); verify(responseHandler).onSuccess(metadata); @@ -105,7 +106,7 @@ void shouldReadRecordMessage() { var responseHandler = mock(ResponseHandler.class); messageDispatcher.enqueue(responseHandler); - var fields = new Value[] {value(1), value(2), value(3)}; + var fields = new Value[] {valueFactory.value(1), valueFactory.value(2), valueFactory.value(3)}; channel.writeInbound(writer.asByteBuf(new RecordMessage(fields))); verify(responseHandler).onRecord(fields); @@ -126,14 +127,14 @@ void shouldRethrowReadErrors() throws IOException { var reader = mock(MessageFormat.Reader.class); var error = new RuntimeException("Unable to decode!"); doThrow(error).when(reader).read(any()); - when(messageFormat.newReader(any())).thenReturn(reader); + when(messageFormat.newReader(any(), any())).thenReturn(reader); - var handler = new InboundMessageHandler(messageFormat, NoopLoggingProvider.INSTANCE); + var handler = new InboundMessageHandler(messageFormat, NoopLoggingProvider.INSTANCE, valueFactory); channel.pipeline().remove(InboundMessageHandler.class); channel.pipeline().addLast(handler); var e = assertThrows(DecoderException.class, () -> channel.writeInbound(writer.asByteBuf(RESET))); - assertThat(e.getMessage(), startsWith("Failed to read inbound message")); + assertTrue(e.getMessage().startsWith("Failed to read inbound message")); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/MessageDecoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/MessageDecoderTest.java similarity index 94% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/MessageDecoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/MessageDecoderTest.java index 89d2bc48d2..356bbb9308 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/inbound/MessageDecoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/inbound/MessageDecoderTest.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.inbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound; import static io.netty.buffer.Unpooled.wrappedBuffer; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.neo4j.driver.testutil.TestUtil.assertByteBufEquals; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.assertByteBufEquals; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.jupiter.api.AfterEach; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/ChunkAwareByteBufOutputTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/ChunkAwareByteBufOutputTest.java similarity index 98% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/ChunkAwareByteBufOutputTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/ChunkAwareByteBufOutputTest.java index b5b5d566d6..9a33bef917 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/ChunkAwareByteBufOutputTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/ChunkAwareByteBufOutputTest.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.outbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.testutil.TestUtil.assertByteBufContains; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.assertByteBufContains; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/OutboundMessageHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/OutboundMessageHandlerTest.java similarity index 71% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/OutboundMessageHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/OutboundMessageHandlerTest.java index 6246b84537..665327b1ae 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/outbound/OutboundMessageHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/async/outbound/OutboundMessageHandlerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.async.outbound; +package org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -22,9 +22,8 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.testutil.TestUtil.assertByteBufContains; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.assertByteBufContains; import io.netty.buffer.ByteBuf; import io.netty.channel.embedded.EmbeddedChannel; @@ -34,18 +33,20 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Query; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; class OutboundMessageHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final EmbeddedChannel channel = new EmbeddedChannel(); @BeforeEach @@ -91,9 +92,9 @@ void shouldSupportByteArraysByDefault() { channel.pipeline().addLast(handler); Map params = new HashMap<>(); - params.put("array", value(new byte[] {1, 2, 3})); + params.put("array", valueFactory.value(new byte[] {1, 2, 3})); - assertTrue(channel.writeOutbound(new Query("RETURN 1", Values.value(params)))); + assertTrue(channel.writeOutbound(new BoltProtocolV3.Query("RETURN 1", params))); assertTrue(channel.finish()); } @@ -101,7 +102,7 @@ private static MessageFormat mockMessageFormatWithWriter( @SuppressWarnings("SameParameterValue") final int... bytesToWrite) { var messageFormat = mock(MessageFormat.class); - when(messageFormat.newWriter(any(PackOutput.class))).then(invocation -> { + when(messageFormat.newWriter(any(PackOutput.class), any())).then(invocation -> { PackOutput output = invocation.getArgument(0); return mockWriter(output, bytesToWrite); }); @@ -126,6 +127,6 @@ private static MessageFormat.Writer mockWriter(final PackOutput output, final in } private static OutboundMessageHandler newHandler(MessageFormat messageFormat) { - return new OutboundMessageHandler(messageFormat, NoopLoggingProvider.INSTANCE); + return new OutboundMessageHandler(messageFormat, NoopLoggingProvider.INSTANCE, valueFactory); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/CommitTxResponseHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/CommitTxResponseHandlerTest.java similarity index 77% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/CommitTxResponseHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/CommitTxResponseHandlerTest.java index a8394afc2c..727448a2f9 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/CommitTxResponseHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/CommitTxResponseHandlerTest.java @@ -14,21 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.testutil.TestUtil.await; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.TestUtil.await; import java.util.concurrent.CompletableFuture; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; class CommitTxResponseHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final CompletableFuture future = new CompletableFuture<>(); private final CommitTxResponseHandler handler = new CommitTxResponseHandler(future); @@ -43,7 +45,7 @@ void shouldHandleSuccessWithoutBookmark() { void shouldHandleSuccessWithBookmark() { var bookmarkString = "neo4j:bookmark:v1:tx12345"; - handler.onSuccess(singletonMap("bookmark", value(bookmarkString))); + handler.onSuccess(singletonMap("bookmark", valueFactory.value(bookmarkString))); assertEquals(bookmarkString, await(future)); } @@ -60,6 +62,6 @@ void shouldHandleFailure() { @Test void shouldFailToHandleRecord() { - assertThrows(UnsupportedOperationException.class, () -> handler.onRecord(new Value[] {value(42)})); + assertThrows(UnsupportedOperationException.class, () -> handler.onRecord(new Value[] {valueFactory.value(42)})); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloResponseHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloResponseHandlerTest.java similarity index 81% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloResponseHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloResponseHandlerTest.java index c74469ecd3..29e86937e6 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/HelloResponseHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/HelloResponseHandlerTest.java @@ -14,19 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.connectionId; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.connectionReadTimeout; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.serverAgent; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setMessageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.async.outbound.OutboundMessageHandler.NAME; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.connectionId; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.connectionReadTimeout; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.serverAgent; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setMessageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound.OutboundMessageHandler.NAME; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -38,16 +37,18 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.exception.BoltUntrustedServerException; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChannelErrorHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.async.outbound.OutboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ChannelErrorHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound.OutboundMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; class HelloResponseHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String SERVER_AGENT = "Neo4j/4.4.0"; private final EmbeddedChannel channel = new EmbeddedChannel(); @@ -56,7 +57,8 @@ class HelloResponseHandlerTest { void setUp() { setMessageDispatcher(channel, new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE)); var pipeline = channel.pipeline(); - pipeline.addLast(NAME, new OutboundMessageHandler(new MessageFormatV3(), NoopLoggingProvider.INSTANCE)); + pipeline.addLast( + NAME, new OutboundMessageHandler(new MessageFormatV3(), NoopLoggingProvider.INSTANCE, valueFactory)); pipeline.addLast(new ChannelErrorHandler(NoopLoggingProvider.INSTANCE)); } @@ -97,7 +99,7 @@ void shouldThrowWhenServerVersionIsNull() { var latestAuth = new CompletableFuture(); var handler = new HelloResponseHandler(agentFuture, channel, mock(Clock.class), latestAuth); - var metadata = metadata(Values.NULL, "bolt-x"); + var metadata = metadata(valueFactory.value(null), "bolt-x"); assertThrows(BoltUntrustedServerException.class, () -> handler.onSuccess(metadata)); assertTrue(agentFuture.isCompletedExceptionally()); // initialization failed @@ -149,7 +151,7 @@ void shouldThrowWhenConnectionIdIsNull() { var latestAuth = new CompletableFuture(); var handler = new HelloResponseHandler(agentFuture, channel, mock(Clock.class), latestAuth); - var metadata = metadata(SERVER_AGENT, Values.NULL); + var metadata = metadata(SERVER_AGENT, valueFactory.value(null)); assertThrows(IllegalStateException.class, () -> handler.onSuccess(metadata)); assertTrue(agentFuture.isCompletedExceptionally()); // initialization failed @@ -194,7 +196,7 @@ void shouldNotThrowWhenConfigurationHintsAreEmpty() { var latestAuth = new CompletableFuture(); var handler = new HelloResponseHandler(agentFuture, channel, mock(Clock.class), latestAuth); - var metadata = metadata(SERVER_AGENT, "bolt-x", value(new HashMap<>())); + var metadata = metadata(SERVER_AGENT, "bolt-x", valueFactory.value(new HashMap<>())); handler.onSuccess(metadata); assertTrue(agentFuture.isDone() && !agentFuture.isCompletedExceptionally() && !agentFuture.isCancelled()); @@ -207,7 +209,7 @@ void shouldNotThrowWhenConfigurationHintsAreNull() { var latestAuth = new CompletableFuture(); var handler = new HelloResponseHandler(agentFuture, channel, mock(Clock.class), latestAuth); - var metadata = metadata(SERVER_AGENT, "bolt-x", Values.NULL); + var metadata = metadata(SERVER_AGENT, "bolt-x", valueFactory.value(null)); handler.onSuccess(metadata); assertTrue(agentFuture.isDone() && !agentFuture.isCompletedExceptionally() && !agentFuture.isCancelled()); @@ -222,8 +224,8 @@ void shouldSetConnectionTimeoutHint() { var timeout = 15L; Map hints = new HashMap<>(); - hints.put(HelloResponseHandler.CONNECTION_RECEIVE_TIMEOUT_SECONDS_KEY, value(timeout)); - var metadata = metadata(SERVER_AGENT, "bolt-x", value(hints)); + hints.put(HelloResponseHandler.CONNECTION_RECEIVE_TIMEOUT_SECONDS_KEY, valueFactory.value(timeout)); + var metadata = metadata(SERVER_AGENT, "bolt-x", valueFactory.value(hints)); handler.onSuccess(metadata); assertEquals(timeout, connectionReadTimeout(channel).orElse(null)); @@ -241,15 +243,15 @@ private static Map metadata(Object version, Object connectionId, if (version == null) { result.put("server", null); } else if (version instanceof Value && ((Value) version).isNull()) { - result.put("server", Values.NULL); + result.put("server", valueFactory.value(null)); } else { - result.put("server", value(version.toString())); + result.put("server", valueFactory.value(version.toString())); } if (connectionId == null) { result.put("connection_id", null); } else { - result.put("connection_id", value(connectionId)); + result.put("connection_id", valueFactory.value(connectionId)); } result.put(HelloResponseHandler.CONFIGURATION_HINTS_KEY, hints); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/ResetResponseHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/ResetResponseHandlerTest.java similarity index 77% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/ResetResponseHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/ResetResponseHandlerTest.java index a5c0269fcd..ed8ff352b9 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/ResetResponseHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/ResetResponseHandlerTest.java @@ -14,19 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Collections.emptyMap; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.neo4j.driver.Values.values; import java.util.concurrent.CompletableFuture; import org.junit.jupiter.api.Test; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; class ResetResponseHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + @Test void shouldCompleteFutureOnSuccess() throws Exception { var future = new CompletableFuture(); @@ -56,7 +60,10 @@ void shouldCompleteFutureOnFailure() { void shouldThrowWhenOnRecord() { var handler = newHandler(new CompletableFuture<>()); - assertThrows(UnsupportedOperationException.class, () -> handler.onRecord(values(1, 2, 3))); + assertThrows( + UnsupportedOperationException.class, + () -> handler.onRecord( + new Value[] {valueFactory.value(1), valueFactory.value(2), valueFactory.value(3)})); } private static ResetResponseHandler newHandler(CompletableFuture future) { diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RouteMessageResponseHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RouteMessageResponseHandlerTest.java similarity index 84% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RouteMessageResponseHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RouteMessageResponseHandlerTest.java index 4d0682b8e6..f60db3a25e 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RouteMessageResponseHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RouteMessageResponseHandlerTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -27,15 +27,17 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; class RouteMessageResponseHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; @Test void onSuccessShouldSuccessFullyCompleteFutureWithRoutingTable() { var completableFuture = new CompletableFuture>(); - var responseHandler = new RouteMessageResponseHandler(completableFuture); + var responseHandler = new RouteMessageResponseHandler(completableFuture, valueFactory); var routingTable = getRoutingTable(); var metadata = getMetadataWithRoutingTable(routingTable); @@ -47,7 +49,7 @@ void onSuccessShouldSuccessFullyCompleteFutureWithRoutingTable() { @Test void onSuccessShouldExceptionallyCompleteFutureWhenMetadataDoesNotHaveRoutingTable() { var completableFuture = new CompletableFuture>(); - var responseHandler = new RouteMessageResponseHandler(completableFuture); + var responseHandler = new RouteMessageResponseHandler(completableFuture, valueFactory); Map metadata = new HashMap<>(); responseHandler.onSuccess(metadata); @@ -58,7 +60,7 @@ void onSuccessShouldExceptionallyCompleteFutureWhenMetadataDoesNotHaveRoutingTab @Test void onFailureShouldCompleteExceptionallyWithTheOriginalException() { var completableFuture = new CompletableFuture>(); - var responseHandler = new RouteMessageResponseHandler(completableFuture); + var responseHandler = new RouteMessageResponseHandler(completableFuture, valueFactory); var expectedException = new RuntimeException("Test exception"); responseHandler.onFailure(expectedException); @@ -74,7 +76,7 @@ void onFailureShouldCompleteExceptionallyWithTheOriginalException() { @Test void onRecordShouldThrowUnsupportedOperation() { var completableFuture = new CompletableFuture>(); - var responseHandler = new RouteMessageResponseHandler(completableFuture); + var responseHandler = new RouteMessageResponseHandler(completableFuture, valueFactory); responseHandler.onRecord(new Value[0]); @@ -88,14 +90,14 @@ void onRecordShouldThrowUnsupportedOperation() { private Map getMetadataWithRoutingTable(Map routingTable) { Map metadata = new HashMap<>(); - metadata.put("rt", Values.value(routingTable)); + metadata.put("rt", valueFactory.value(routingTable)); return metadata; } private Map getRoutingTable() { Map routingTable = new HashMap<>(); - routingTable.put("ttl", Values.value(300)); - routingTable.put("addresses", Values.value(new ArrayList<>())); + routingTable.put("ttl", valueFactory.value(300)); + routingTable.put("addresses", valueFactory.value(new ArrayList<>())); return routingTable; } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RunResponseHandlerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RunResponseHandlerTest.java similarity index 76% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RunResponseHandlerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RunResponseHandlerTest.java index 1238177757..43080169c4 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/handlers/RunResponseHandlerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/handlers/RunResponseHandlerTest.java @@ -14,24 +14,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.handlers; +package org.neo4j.driver.internal.bolt.basicimpl.impl.handlers; import static java.util.Collections.emptyMap; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.neo4j.driver.Values.values; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.Test; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor; class RunResponseHandlerTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + @Test void shouldNotifyRunFutureOnSuccess() { var runFuture = new CompletableFuture(); @@ -54,14 +57,17 @@ void shouldNotifyRunFutureOnFailure() { assertTrue(runFuture.isCompletedExceptionally()); var executionException = assertThrows(ExecutionException.class, runFuture::get); - assertThat(executionException.getCause(), equalTo(exception)); + assertEquals(exception, executionException.getCause()); } @Test void shouldThrowOnRecord() { var handler = newHandler(); - assertThrows(UnsupportedOperationException.class, () -> handler.onRecord(values("a", "b", "c"))); + assertThrows( + UnsupportedOperationException.class, + () -> handler.onRecord( + new Value[] {valueFactory.value("a"), valueFactory.value("b"), valueFactory.value("c")})); } private static RunResponseHandler newHandler() { diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelActivityLoggerTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelActivityLoggerTest.java similarity index 91% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelActivityLoggerTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelActivityLoggerTest.java index f61713ee97..dc30084066 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/logging/ChannelActivityLoggerTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/logging/ChannelActivityLoggerTest.java @@ -14,15 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.logging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.logging; import static org.junit.jupiter.api.Assertions.assertEquals; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; class ChannelActivityLoggerTest { @Test diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocolTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocolTest.java new file mode 100644 index 0000000000..79509ea1cf --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocolTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setProtocolVersion; + +import io.netty.channel.embedded.EmbeddedChannel; +import org.junit.jupiter.api.Test; +import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; +import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.BoltProtocolV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41.BoltProtocolV41; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42.BoltProtocolV42; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43.BoltProtocolV43; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44.BoltProtocolV44; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.BoltProtocolV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51.BoltProtocolV51; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v52.BoltProtocolV52; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v53.BoltProtocolV53; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.BoltProtocolV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v55.BoltProtocolV55; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56.BoltProtocolV56; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57.BoltProtocolV57; + +class BoltProtocolTest { + @Test + void shouldCreateProtocolForKnownVersions() { + assertAll( + () -> assertInstanceOf(BoltProtocolV3.class, BoltProtocol.forVersion(BoltProtocolV3.VERSION)), + () -> assertInstanceOf(BoltProtocolV4.class, BoltProtocol.forVersion(BoltProtocolV4.VERSION)), + () -> assertInstanceOf(BoltProtocolV41.class, BoltProtocol.forVersion(BoltProtocolV41.VERSION)), + () -> assertInstanceOf(BoltProtocolV42.class, BoltProtocol.forVersion(BoltProtocolV42.VERSION)), + () -> assertInstanceOf(BoltProtocolV43.class, BoltProtocol.forVersion(BoltProtocolV43.VERSION)), + () -> assertInstanceOf(BoltProtocolV44.class, BoltProtocol.forVersion(BoltProtocolV44.VERSION)), + () -> assertInstanceOf(BoltProtocolV5.class, BoltProtocol.forVersion(BoltProtocolV5.VERSION)), + () -> assertInstanceOf(BoltProtocolV51.class, BoltProtocol.forVersion(BoltProtocolV51.VERSION)), + () -> assertInstanceOf(BoltProtocolV52.class, BoltProtocol.forVersion(BoltProtocolV52.VERSION)), + () -> assertInstanceOf(BoltProtocolV53.class, BoltProtocol.forVersion(BoltProtocolV53.VERSION)), + () -> assertInstanceOf(BoltProtocolV54.class, BoltProtocol.forVersion(BoltProtocolV54.VERSION)), + () -> assertInstanceOf(BoltProtocolV55.class, BoltProtocol.forVersion(BoltProtocolV55.VERSION)), + () -> assertInstanceOf(BoltProtocolV56.class, BoltProtocol.forVersion(BoltProtocolV56.VERSION)), + () -> assertInstanceOf(BoltProtocolV57.class, BoltProtocol.forVersion(BoltProtocolV57.VERSION))); + } + + @Test + void shouldThrowForUnknownVersion() { + assertAll( + () -> assertThrows( + BoltClientException.class, () -> BoltProtocol.forVersion(new BoltProtocolVersion(42, 0))), + () -> assertThrows( + BoltClientException.class, () -> BoltProtocol.forVersion(new BoltProtocolVersion(142, 0))), + () -> assertThrows( + BoltClientException.class, () -> BoltProtocol.forVersion(new BoltProtocolVersion(-1, 0)))); + } + + @Test + void shouldThrowForChannelWithUnknownProtocolVersion() { + var channel = new EmbeddedChannel(); + setProtocolVersion(channel, new BoltProtocolVersion(42, 0)); + + assertThrows(BoltClientException.class, () -> BoltProtocol.forChannel(channel)); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocolVersionTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocolVersionTest.java similarity index 98% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocolVersionTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocolVersionTest.java index 39c0d83cc5..7694e82ef2 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocolVersionTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/BoltProtocolVersionTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageFormatTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageFormatTest.java similarity index 64% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageFormatTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageFormatTest.java index 33bb0813c2..6bc629afae 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/MessageFormatTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/MessageFormatTest.java @@ -14,25 +14,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging; import static java.util.Arrays.asList; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.messageDispatcher; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setMessageDispatcher; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.messageDispatcher; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes.setMessageDispatcher; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -42,50 +32,54 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.BoltProtocolUtil; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelPipelineBuilderImpl; -import org.neo4j.driver.internal.bolt.basicimpl.async.outbound.ChunkAwareByteBufOutput; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValueUnpacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackStream; -import org.neo4j.driver.internal.bolt.basicimpl.spi.ResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.KnowledgeableMessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.MemorizingInboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.BoltProtocolUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelPipelineBuilderImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.outbound.ChunkAwareByteBufOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValueUnpacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackStream; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.ResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.KnowledgeableMessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.MemorizingInboundMessageDispatcher; class MessageFormatTest { + private static final TestValueFactory valueFactory = TestValueFactory.INSTANCE; public final MessageFormat format = new MessageFormatV3(); @Test void shouldUnpackAllResponses() { assertSerializes(new FailureMessage("Hello", "World!")); assertSerializes(IgnoredMessage.IGNORED); - assertSerializes(new RecordMessage(new Value[] {value(1337L)})); + assertSerializes(new RecordMessage(new Value[] {valueFactory.value(1337L)})); assertSerializes(new SuccessMessage(new HashMap<>())); } @Test void shouldPackUnpackValidValues() { - assertSerializesValue(value(parameters("cat", null, "dog", null))); - assertSerializesValue(value(parameters("k", 12, "a", "banana"))); - assertSerializesValue(value(asList("k", 12, "a", "banana"))); + assertSerializesValue( + valueFactory.value(Map.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))); + assertSerializesValue( + valueFactory.value(Map.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))); + assertSerializesValue(valueFactory.value(asList("k", 12, "a", "banana"))); } @Test void shouldUnpackNodeRelationshipAndPath() { // Given - assertOnlyDeserializesValue(emptyNodeValue()); - assertOnlyDeserializesValue(filledNodeValue()); - assertOnlyDeserializesValue(emptyRelationshipValue()); - assertOnlyDeserializesValue(filledRelationshipValue()); - assertOnlyDeserializesValue(emptyPathValue()); - assertOnlyDeserializesValue(filledPathValue()); + assertOnlyDeserializesValue(valueFactory.emptyNodeValue()); + assertOnlyDeserializesValue(valueFactory.filledNodeValue()); + assertOnlyDeserializesValue(valueFactory.emptyRelationshipValue()); + assertOnlyDeserializesValue(valueFactory.filledRelationshipValue()); + assertOnlyDeserializesValue(valueFactory.emptyPathValue()); + assertOnlyDeserializesValue(valueFactory.filledPathValue()); } @Test @@ -129,10 +123,10 @@ public void onRecord(Value[] fields) { // Expect Throwable error = assertThrows(CompletionException.class, errorFuture::join); error = assertInstanceOf(BoltClientException.class, error.getCause()); - assertThat( - error.getMessage(), - startsWith("Invalid message received, serialized NODE structures should have 3 fields, " - + "received NODE structure has 0 fields.")); + assertTrue( + error.getMessage() + .startsWith( + "Invalid message received, serialized NODE structures should have 3 fields, received NODE structure has 0 fields.")); } private void assertSerializesValue(Value value) { @@ -155,7 +149,7 @@ private EmbeddedChannel newEmbeddedChannel() { private EmbeddedChannel newEmbeddedChannel(MessageFormat format) { var channel = new EmbeddedChannel(); setMessageDispatcher(channel, new MemorizingInboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE)); - new ChannelPipelineBuilderImpl().build(format, channel.pipeline(), NoopLoggingProvider.INSTANCE); + new ChannelPipelineBuilderImpl().build(format, channel.pipeline(), NoopLoggingProvider.INSTANCE, valueFactory); return channel; } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/BeginMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/BeginMessageEncoderTest.java similarity index 71% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/BeginMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/BeginMessageEncoderTest.java index f10061147a..eef51422e3 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/BeginMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/BeginMessageEncoderTest.java @@ -14,14 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; import java.time.Duration; import java.util.Arrays; @@ -34,15 +33,17 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.DatabaseNameUtil; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; class BeginMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final BeginMessageEncoder encoder = new BeginMessageEncoder(); private final ValuePacker packer = mock(ValuePacker.class); @@ -52,8 +53,8 @@ void shouldEncodeBeginMessage(AccessMode mode, String impersonatedUser, String t var bookmarks = Set.of("neo4j:bookmark:v1:tx42"); Map txMetadata = new HashMap<>(); - txMetadata.put("hello", value("world")); - txMetadata.put("answer", value(42)); + txMetadata.put("hello", valueFactory.value("world")); + txMetadata.put("answer", valueFactory.value(42)); var txTimeout = Duration.ofSeconds(1); @@ -80,25 +81,28 @@ public System.Logger getLog(String name) { txType, null, false, - loggingProvider), - packer); + loggingProvider, + valueFactory), + packer, + valueFactory); var order = inOrder(packer); order.verify(packer).packStructHeader(1, BeginMessage.SIGNATURE); Map expectedMetadata = new HashMap<>(); expectedMetadata.put( - "bookmarks", value(bookmarks.stream().map(Values::value).collect(Collectors.toSet()))); - expectedMetadata.put("tx_timeout", value(1000)); - expectedMetadata.put("tx_metadata", value(txMetadata)); + "bookmarks", + valueFactory.value(bookmarks.stream().map(valueFactory::value).collect(Collectors.toSet()))); + expectedMetadata.put("tx_timeout", valueFactory.value(1000)); + expectedMetadata.put("tx_metadata", valueFactory.value(txMetadata)); if (mode == READ) { - expectedMetadata.put("mode", value("r")); + expectedMetadata.put("mode", valueFactory.value("r")); } if (impersonatedUser != null) { - expectedMetadata.put("imp_user", value(impersonatedUser)); + expectedMetadata.put("imp_user", valueFactory.value(impersonatedUser)); } if (txType != null) { - expectedMetadata.put("tx_type", value(txType)); + expectedMetadata.put("tx_type", valueFactory.value(txType)); } order.verify(packer).pack(expectedMetadata); @@ -112,6 +116,6 @@ private static Stream arguments() { @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(RESET, packer)); + assertThrows(IllegalArgumentException.class, () -> encoder.encode(RESET, packer, valueFactory)); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/CommitMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/CommitMessageEncoderTest.java similarity index 62% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/CommitMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/CommitMessageEncoderTest.java index 38bf5aa3a0..7cac1d20a3 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/CommitMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/CommitMessageEncoderTest.java @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; class CommitMessageEncoderTest { private final CommitMessageEncoder encoder = new CommitMessageEncoder(); @@ -32,13 +33,14 @@ class CommitMessageEncoderTest { @Test void shouldEncodeCommitMessage() throws Exception { - encoder.encode(COMMIT, packer); + encoder.encode(COMMIT, packer, mock(ValueFactory.class)); verify(packer).packStructHeader(0, CommitMessage.SIGNATURE); } @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(DISCARD_ALL, packer)); + assertThrows( + IllegalArgumentException.class, () -> encoder.encode(DISCARD_ALL, packer, mock(ValueFactory.class))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardAllMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardAllMessageEncoderTest.java similarity index 63% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardAllMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardAllMessageEncoderTest.java index 00071f023e..2a71b69b52 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardAllMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardAllMessageEncoderTest.java @@ -14,16 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; class DiscardAllMessageEncoderTest { private final DiscardAllMessageEncoder encoder = new DiscardAllMessageEncoder(); @@ -31,13 +32,16 @@ class DiscardAllMessageEncoderTest { @Test void shouldEncodeDiscardAllMessage() throws Exception { - encoder.encode(DiscardAllMessage.DISCARD_ALL, packer); + encoder.encode(DiscardAllMessage.DISCARD_ALL, packer, mock(ValueFactory.class)); verify(packer).packStructHeader(0, DiscardAllMessage.SIGNATURE); } @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(new DiscardMessage(100, 200), packer)); + assertThrows( + IllegalArgumentException.class, + () -> encoder.encode( + new DiscardMessage(100, 200, mock(ValueFactory.class)), packer, mock(ValueFactory.class))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardMessageEncoderTest.java similarity index 61% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardMessageEncoderTest.java index 5a56e589e7..d8e90a4eed 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/DiscardMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/DiscardMessageEncoderTest.java @@ -14,32 +14,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage.newDiscardAllMessage; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; class DiscardMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final DiscardMessageEncoder encoder = new DiscardMessageEncoder(); private final ValuePacker packer = mock(ValuePacker.class); @Test void shouldDiscardAllCorrectly() throws Throwable { - encoder.encode(newDiscardAllMessage(-1), packer); + encoder.encode(new DiscardMessage(-1, -1, valueFactory), packer, valueFactory); Map meta = new HashMap<>(); - meta.put("n", value(-1)); + meta.put("n", valueFactory.value(-1)); var order = inOrder(packer); order.verify(packer).packStructHeader(1, DiscardMessage.SIGNATURE); @@ -48,11 +49,11 @@ void shouldDiscardAllCorrectly() throws Throwable { @Test void shouldEncodeDiscardMessage() throws Exception { - encoder.encode(new DiscardMessage(100, 200), packer); + encoder.encode(new DiscardMessage(100, 200, valueFactory), packer, valueFactory); Map meta = new HashMap<>(); - meta.put("n", value(100)); - meta.put("qid", value(200)); + meta.put("n", valueFactory.value(100)); + meta.put("qid", valueFactory.value(200)); var order = inOrder(packer); order.verify(packer).packStructHeader(1, DiscardMessage.SIGNATURE); @@ -61,10 +62,10 @@ void shouldEncodeDiscardMessage() throws Exception { @Test void shouldAvoidQueryId() throws Throwable { - encoder.encode(new DiscardMessage(100, -1), packer); + encoder.encode(new DiscardMessage(100, -1, valueFactory), packer, valueFactory); Map meta = new HashMap<>(); - meta.put("n", value(100)); + meta.put("n", valueFactory.value(100)); var order = inOrder(packer); order.verify(packer).packStructHeader(1, DiscardMessage.SIGNATURE); @@ -73,6 +74,8 @@ void shouldAvoidQueryId() throws Throwable { @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(DiscardAllMessage.DISCARD_ALL, packer)); + assertThrows( + IllegalArgumentException.class, + () -> encoder.encode(DiscardAllMessage.DISCARD_ALL, packer, valueFactory)); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/GoodbyeMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/GoodbyeMessageEncoderTest.java similarity index 62% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/GoodbyeMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/GoodbyeMessageEncoderTest.java index 5b3d1bd00b..b906f7dbac 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/GoodbyeMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/GoodbyeMessageEncoderTest.java @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage; class GoodbyeMessageEncoderTest { private final GoodbyeMessageEncoder encoder = new GoodbyeMessageEncoder(); @@ -32,13 +33,14 @@ class GoodbyeMessageEncoderTest { @Test void shouldEncodeGoodbyeMessage() throws Exception { - encoder.encode(GOODBYE, packer); + encoder.encode(GOODBYE, packer, mock(ValueFactory.class)); verify(packer).packStructHeader(0, GoodbyeMessage.SIGNATURE); } @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(DISCARD_ALL, packer)); + assertThrows( + IllegalArgumentException.class, () -> encoder.encode(DISCARD_ALL, packer, mock(ValueFactory.class))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/HelloMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/HelloMessageEncoderTest.java similarity index 54% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/HelloMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/HelloMessageEncoderTest.java index 2c81ad1f3d..50e319a2ab 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/HelloMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/HelloMessageEncoderTest.java @@ -14,68 +14,75 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; class HelloMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final HelloMessageEncoder encoder = new HelloMessageEncoder(); private final ValuePacker packer = mock(ValuePacker.class); @Test void shouldEncodeHelloMessage() throws Exception { Map authToken = new HashMap<>(); - authToken.put("username", value("bob")); - authToken.put("password", value("secret")); + authToken.put("username", valueFactory.value("bob")); + authToken.put("password", valueFactory.value("secret")); - encoder.encode(new HelloMessage("MyDriver", BoltAgentUtil.VALUE, authToken, null, false, null, false), packer); + encoder.encode( + new HelloMessage("MyDriver", BoltAgentUtil.VALUE, authToken, null, false, null, false, valueFactory), + packer, + valueFactory); var order = inOrder(packer); order.verify(packer).packStructHeader(1, HelloMessage.SIGNATURE); Map expectedMetadata = new HashMap<>(authToken); - expectedMetadata.put("user_agent", value("MyDriver")); - expectedMetadata.put("bolt_agent", value(Map.of("product", BoltAgentUtil.VALUE.product()))); + expectedMetadata.put("user_agent", valueFactory.value("MyDriver")); + expectedMetadata.put("bolt_agent", valueFactory.value(Map.of("product", BoltAgentUtil.VALUE.product()))); order.verify(packer).pack(expectedMetadata); } @Test void shouldEncodeHelloMessageWithRoutingContext() throws Exception { Map authToken = new HashMap<>(); - authToken.put("username", value("bob")); - authToken.put("password", value("secret")); + authToken.put("username", valueFactory.value("bob")); + authToken.put("password", valueFactory.value("secret")); Map routingContext = new HashMap<>(); routingContext.put("policy", "eu-fast"); encoder.encode( - new HelloMessage("MyDriver", BoltAgentUtil.VALUE, authToken, routingContext, false, null, false), - packer); + new HelloMessage( + "MyDriver", BoltAgentUtil.VALUE, authToken, routingContext, false, null, false, valueFactory), + packer, + valueFactory); var order = inOrder(packer); order.verify(packer).packStructHeader(1, HelloMessage.SIGNATURE); Map expectedMetadata = new HashMap<>(authToken); - expectedMetadata.put("user_agent", value("MyDriver")); - expectedMetadata.put("bolt_agent", value(Map.of("product", BoltAgentUtil.VALUE.product()))); - expectedMetadata.put("routing", value(routingContext)); + expectedMetadata.put("user_agent", valueFactory.value("MyDriver")); + expectedMetadata.put("bolt_agent", valueFactory.value(Map.of("product", BoltAgentUtil.VALUE.product()))); + expectedMetadata.put("routing", valueFactory.value(routingContext)); order.verify(packer).pack(expectedMetadata); } @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(PULL_ALL, packer)); + assertThrows(IllegalArgumentException.class, () -> encoder.encode(PULL_ALL, packer, valueFactory)); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullAllMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullAllMessageEncoderTest.java similarity index 63% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullAllMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullAllMessageEncoderTest.java index ebd73b1311..e81d255ebb 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullAllMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullAllMessageEncoderTest.java @@ -14,16 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; class PullAllMessageEncoderTest { private final PullAllMessageEncoder encoder = new PullAllMessageEncoder(); @@ -31,13 +32,16 @@ class PullAllMessageEncoderTest { @Test void shouldEncodePullAllMessage() throws Exception { - encoder.encode(PullAllMessage.PULL_ALL, packer); + encoder.encode(PullAllMessage.PULL_ALL, packer, mock(ValueFactory.class)); verify(packer).packStructHeader(0, PullAllMessage.SIGNATURE); } @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(new PullMessage(100, 200), packer)); + assertThrows( + IllegalArgumentException.class, + () -> encoder.encode( + new PullMessage(100, 200, mock(ValueFactory.class)), packer, mock(ValueFactory.class))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullMessageEncoderTest.java similarity index 62% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullMessageEncoderTest.java index df18d72fce..ab49f4fbc5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/PullMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/PullMessageEncoderTest.java @@ -14,31 +14,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; class PullMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final PullMessageEncoder encoder = new PullMessageEncoder(); private final ValuePacker packer = mock(ValuePacker.class); @Test void shouldSendPullAllCorrectly() throws Throwable { - encoder.encode(PullMessage.PULL_ALL, packer); + encoder.encode(new PullMessage(-1, -1, valueFactory), packer, valueFactory); Map meta = new HashMap<>(); - meta.put("n", value(-1)); + meta.put("n", valueFactory.value(-1)); var order = inOrder(packer); order.verify(packer).packStructHeader(1, PullMessage.SIGNATURE); @@ -47,11 +49,11 @@ void shouldSendPullAllCorrectly() throws Throwable { @Test void shouldEncodePullMessage() throws Exception { - encoder.encode(new PullMessage(100, 200), packer); + encoder.encode(new PullMessage(100, 200, valueFactory), packer, valueFactory); Map meta = new HashMap<>(); - meta.put("n", value(100)); - meta.put("qid", value(200)); + meta.put("n", valueFactory.value(100)); + meta.put("qid", valueFactory.value(200)); var order = inOrder(packer); order.verify(packer).packStructHeader(1, PullMessage.SIGNATURE); @@ -60,10 +62,10 @@ void shouldEncodePullMessage() throws Exception { @Test void shouldAvoidQueryId() throws Exception { - encoder.encode(new PullMessage(100, -1), packer); + encoder.encode(new PullMessage(100, -1, valueFactory), packer, valueFactory); Map meta = new HashMap<>(); - meta.put("n", value(100)); + meta.put("n", valueFactory.value(100)); var order = inOrder(packer); order.verify(packer).packStructHeader(1, PullMessage.SIGNATURE); @@ -72,6 +74,7 @@ void shouldAvoidQueryId() throws Exception { @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(PullAllMessage.PULL_ALL, packer)); + assertThrows( + IllegalArgumentException.class, () -> encoder.encode(PullAllMessage.PULL_ALL, packer, valueFactory)); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/ResetMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/ResetMessageEncoderTest.java similarity index 69% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/ResetMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/ResetMessageEncoderTest.java index 5837f1fce9..2cebb74a38 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/ResetMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/ResetMessageEncoderTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; @@ -22,9 +22,10 @@ import java.util.Collections; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; class ResetMessageEncoderTest { private final ResetMessageEncoder encoder = new ResetMessageEncoder(); @@ -32,7 +33,7 @@ class ResetMessageEncoderTest { @Test void shouldEncodeResetMessage() throws Exception { - encoder.encode(ResetMessage.RESET, packer); + encoder.encode(ResetMessage.RESET, packer, mock(ValueFactory.class)); verify(packer).packStructHeader(0, ResetMessage.SIGNATURE); } @@ -42,6 +43,8 @@ void shouldFailToEncodeWrongMessage() { assertThrows( IllegalArgumentException.class, () -> encoder.encode( - RunWithMetadataMessage.unmanagedTxRunMessage("RETURN 2", Collections.emptyMap()), packer)); + RunWithMetadataMessage.unmanagedTxRunMessage("RETURN 2", Collections.emptyMap()), + packer, + mock(ValueFactory.class))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RollbackMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RollbackMessageEncoderTest.java similarity index 67% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RollbackMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RollbackMessageEncoderTest.java index c65014a4ca..1207e6d791 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RollbackMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RollbackMessageEncoderTest.java @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; class RollbackMessageEncoderTest { private final RollbackMessageEncoder encoder = new RollbackMessageEncoder(); @@ -32,13 +33,13 @@ class RollbackMessageEncoderTest { @Test void shouldEncodeRollbackMessage() throws Exception { - encoder.encode(ROLLBACK, packer); + encoder.encode(ROLLBACK, packer, mock(ValueFactory.class)); verify(packer).packStructHeader(0, RollbackMessage.SIGNATURE); } @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(RESET, packer)); + assertThrows(IllegalArgumentException.class, () -> encoder.encode(RESET, packer, mock(ValueFactory.class))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteMessageEncoderTest.java similarity index 69% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteMessageEncoderTest.java index c0c72b4c7e..1ddc407927 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RouteMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RouteMessageEncoderTest.java @@ -14,13 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static java.util.Collections.emptyList; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; import java.io.IOException; import java.util.Collections; @@ -30,13 +29,15 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullSource; import org.junit.jupiter.params.provider.ValueSource; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; class RouteMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final ValuePacker packer = mock(ValuePacker.class); private final RouteMessageEncoder encoder = new RouteMessageEncoder(); @@ -46,13 +47,16 @@ class RouteMessageEncoderTest { void shouldEncodeRouteMessage(String databaseName) throws IOException { var routingContext = getRoutingContext(); - encoder.encode(new RouteMessage(getRoutingContext(), Collections.emptySet(), databaseName, null), packer); + encoder.encode( + new RouteMessage(getRoutingContext(), Collections.emptySet(), databaseName, null), + packer, + valueFactory); var inOrder = inOrder(packer); inOrder.verify(packer).packStructHeader(3, (byte) 0x66); inOrder.verify(packer).pack(routingContext); - inOrder.verify(packer).pack(value(emptyList())); + inOrder.verify(packer).pack(valueFactory.value(emptyList())); inOrder.verify(packer).pack(databaseName); } @@ -64,13 +68,15 @@ void shouldEncodeRouteMessageWithBookmark(String databaseName) throws IOExceptio var bookmark = "somebookmark"; encoder.encode( - new RouteMessage(getRoutingContext(), Collections.singleton(bookmark), databaseName, null), packer); + new RouteMessage(getRoutingContext(), Collections.singleton(bookmark), databaseName, null), + packer, + valueFactory); var inOrder = inOrder(packer); inOrder.verify(packer).packStructHeader(3, (byte) 0x66); inOrder.verify(packer).pack(routingContext); - inOrder.verify(packer).pack(value(Collections.singleton(Values.value(bookmark)))); + inOrder.verify(packer).pack(valueFactory.value(Collections.singleton(valueFactory.value(bookmark)))); inOrder.verify(packer).pack(databaseName); } @@ -78,12 +84,12 @@ void shouldEncodeRouteMessageWithBookmark(String databaseName) throws IOExceptio void shouldThrowIllegalArgumentIfMessageIsNotRouteMessage() { var message = mock(Message.class); - assertThrows(IllegalArgumentException.class, () -> encoder.encode(message, packer)); + assertThrows(IllegalArgumentException.class, () -> encoder.encode(message, packer, valueFactory)); } private Map getRoutingContext() { Map routingContext = new HashMap<>(); - routingContext.put("ip", value("127.0.0.1")); + routingContext.put("ip", valueFactory.value("127.0.0.1")); return routingContext; } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RunWithMetadataMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RunWithMetadataMessageEncoderTest.java similarity index 68% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RunWithMetadataMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RunWithMetadataMessageEncoderTest.java index 264beb7a7f..0c6d8b5c68 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/RunWithMetadataMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/RunWithMetadataMessageEncoderTest.java @@ -14,48 +14,50 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; import java.time.Duration; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; class RunWithMetadataMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final RunWithMetadataMessageEncoder encoder = new RunWithMetadataMessageEncoder(); private final ValuePacker packer = mock(ValuePacker.class); @ParameterizedTest @EnumSource(AccessMode.class) void shouldEncodeRunWithMetadataMessage(AccessMode mode) throws Exception { - var params = singletonMap("answer", value(42)); + var params = singletonMap("answer", valueFactory.value(42)); var bookmarks = Collections.singleton("neo4j:bookmark:v1:tx999"); Map txMetadata = new HashMap<>(); - txMetadata.put("key1", value("value1")); - txMetadata.put("key2", value(1, 2, 3, 4, 5)); - txMetadata.put("key3", value(true)); + txMetadata.put("key1", valueFactory.value("value1")); + txMetadata.put("key2", valueFactory.value(List.of(1, 2, 3, 4, 5))); + txMetadata.put("key3", valueFactory.value(true)); var txTimeout = Duration.ofMillis(42); @@ -81,8 +83,10 @@ public System.Logger getLog(Class cls) { public System.Logger getLog(String name) { return mock(System.Logger.class); } - }), - packer); + }, + valueFactory), + packer, + valueFactory); var order = inOrder(packer); order.verify(packer).packStructHeader(3, RunWithMetadataMessage.SIGNATURE); @@ -91,11 +95,12 @@ public System.Logger getLog(String name) { Map expectedMetadata = new HashMap<>(); expectedMetadata.put( - "bookmarks", value(bookmarks.stream().map(Values::value).collect(Collectors.toSet()))); - expectedMetadata.put("tx_timeout", value(42)); - expectedMetadata.put("tx_metadata", value(txMetadata)); + "bookmarks", + valueFactory.value(bookmarks.stream().map(valueFactory::value).collect(Collectors.toSet()))); + expectedMetadata.put("tx_timeout", valueFactory.value(42)); + expectedMetadata.put("tx_metadata", valueFactory.value(txMetadata)); if (mode == READ) { - expectedMetadata.put("mode", value("r")); + expectedMetadata.put("mode", valueFactory.value("r")); } order.verify(packer).pack(expectedMetadata); @@ -103,6 +108,6 @@ public System.Logger getLog(String name) { @Test void shouldFailToEncodeWrongMessage() { - assertThrows(IllegalArgumentException.class, () -> encoder.encode(DISCARD_ALL, packer)); + assertThrows(IllegalArgumentException.class, () -> encoder.encode(DISCARD_ALL, packer, valueFactory)); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/TelemetryMessageEncoderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/TelemetryMessageEncoderTest.java similarity index 69% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/TelemetryMessageEncoderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/TelemetryMessageEncoderTest.java index bef6eaaac8..7971dd029f 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/encode/TelemetryMessageEncoderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/encode/TelemetryMessageEncoderTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.encode; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -25,23 +25,25 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; -import org.neo4j.driver.Values; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.TelemetryApi; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; class TelemetryMessageEncoderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private final TelemetryMessageEncoder encoder = new TelemetryMessageEncoder(); private final ValuePacker packer = mock(ValuePacker.class); @ParameterizedTest @MethodSource("validApis") void shouldEncodeTelemetryMessage(int api) throws Exception { - encoder.encode(new TelemetryMessage(api), packer); + encoder.encode(new TelemetryMessage(api), packer, valueFactory); verify(packer).packStructHeader(1, TelemetryMessage.SIGNATURE); - verify(packer).pack(Values.value(api)); + verify(packer).pack(valueFactory.value(api)); } @Test @@ -49,7 +51,9 @@ void shouldFailToEncodeWrongMessage() { Assertions.assertThrows( IllegalArgumentException.class, () -> encoder.encode( - RunWithMetadataMessage.unmanagedTxRunMessage("RETURN 2", Collections.emptyMap()), packer)); + RunWithMetadataMessage.unmanagedTxRunMessage("RETURN 2", Collections.emptyMap()), + packer, + valueFactory)); } private static Stream validApis() { diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/HelloMessageTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/HelloMessageTest.java new file mode 100644 index 0000000000..b448e2b015 --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/HelloMessageTest.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.request; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.BoltAgent; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; + +class HelloMessageTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + + @Test + void shouldHaveCorrectMetadata() { + Map authToken = new HashMap<>(); + authToken.put("user", valueFactory.value("Alice")); + authToken.put("credentials", valueFactory.value("SecretPassword")); + + var message = new HelloMessage( + "MyDriver/1.0.2", + BoltAgentUtil.VALUE, + authToken, + Collections.emptyMap(), + false, + null, + false, + valueFactory); + + Map expectedMetadata = new HashMap<>(authToken); + expectedMetadata.put("user_agent", valueFactory.value("MyDriver/1.0.2")); + expectedMetadata.put("bolt_agent", valueFactory.value(Map.of("product", BoltAgentUtil.VALUE.product()))); + expectedMetadata.put("routing", valueFactory.value(Collections.emptyMap())); + assertEquals(expectedMetadata, message.metadata()); + } + + @Test + void shouldHaveCorrectRoutingContext() { + Map authToken = new HashMap<>(); + authToken.put("user", valueFactory.value("Alice")); + authToken.put("credentials", valueFactory.value("SecretPassword")); + + Map routingContext = new HashMap<>(); + routingContext.put("region", "China"); + routingContext.put("speed", "Slow"); + + var message = new HelloMessage( + "MyDriver/1.0.2", BoltAgentUtil.VALUE, authToken, routingContext, false, null, false, valueFactory); + + Map expectedMetadata = new HashMap<>(authToken); + expectedMetadata.put("user_agent", valueFactory.value("MyDriver/1.0.2")); + expectedMetadata.put("bolt_agent", valueFactory.value(Map.of("product", BoltAgentUtil.VALUE.product()))); + expectedMetadata.put("routing", valueFactory.value(routingContext)); + assertEquals(expectedMetadata, message.metadata()); + } + + @Test + void shouldNotExposeCredentialsInToString() { + Map authToken = new HashMap<>(); + authToken.put("principal", valueFactory.value("Alice")); + authToken.put("credentials", valueFactory.value("SecretPassword")); + + var message = new HelloMessage( + "MyDriver/1.0.2", + BoltAgentUtil.VALUE, + authToken, + Collections.emptyMap(), + false, + null, + false, + valueFactory); + + assertFalse(message.toString().contains("SecretPassword")); + } + + @Test + void shouldAcceptNullBoltAgent() { + var authToken = new HashMap(); + authToken.put("user", valueFactory.value("Alice")); + authToken.put("credentials", valueFactory.value("SecretPassword")); + + var message = new HelloMessage( + "MyDriver/1.0.2", null, authToken, Collections.emptyMap(), false, null, false, valueFactory); + + var expectedMetadata = new HashMap<>(authToken); + expectedMetadata.put("user_agent", valueFactory.value("MyDriver/1.0.2")); + expectedMetadata.put("routing", valueFactory.value(Collections.emptyMap())); + assertEquals(expectedMetadata, message.metadata()); + } + + @Test + void shouldAcceptDetailedBoltAgent() { + var authToken = new HashMap(); + authToken.put("user", valueFactory.value("Alice")); + authToken.put("credentials", valueFactory.value("SecretPassword")); + var boltAgent = new BoltAgent("1", "2", "3", "4"); + + var message = new HelloMessage( + "MyDriver/1.0.2", boltAgent, authToken, Collections.emptyMap(), false, null, false, valueFactory); + + var expectedMetadata = new HashMap<>(authToken); + expectedMetadata.put("user_agent", valueFactory.value("MyDriver/1.0.2")); + expectedMetadata.put( + "bolt_agent", + valueFactory.value(Map.of( + "product", + boltAgent.product(), + "platform", + boltAgent.platform(), + "language", + boltAgent.language(), + "language_details", + boltAgent.languageDetails()))); + expectedMetadata.put("routing", valueFactory.value(Collections.emptyMap())); + assertEquals(expectedMetadata, message.metadata()); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TransactionMetadataBuilderTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TransactionMetadataBuilderTest.java similarity index 74% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TransactionMetadataBuilderTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TransactionMetadataBuilderTest.java index a35129ccb0..b195e8e0c4 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/TransactionMetadataBuilderTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/request/TransactionMetadataBuilderTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.request; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request; import static java.util.Arrays.asList; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -22,12 +22,11 @@ import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TransactionMetadataBuilder.buildMetadata; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TransactionMetadataBuilder.buildMetadata; import java.time.Duration; import java.time.LocalDateTime; @@ -41,25 +40,28 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.ValueSource; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.NotificationClassification; import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.NotificationSeverity; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; public class TransactionMetadataBuilderTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + @ParameterizedTest @EnumSource(AccessMode.class) void shouldHaveCorrectMetadata(AccessMode mode) { var bookmarks = new HashSet<>(asList("neo4j:bookmark:v1:tx11", "neo4j:bookmark:v1:tx52")); Map txMetadata = new HashMap<>(); - txMetadata.put("foo", value("bar")); - txMetadata.put("baz", value(111)); - txMetadata.put("time", value(LocalDateTime.now())); + txMetadata.put("foo", valueFactory.value("bar")); + txMetadata.put("baz", valueFactory.value(111)); + txMetadata.put("time", valueFactory.value(LocalDateTime.now())); var txTimeout = Duration.ofSeconds(7); @@ -73,15 +75,17 @@ void shouldHaveCorrectMetadata(AccessMode mode) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); Map expectedMetadata = new HashMap<>(); expectedMetadata.put( - "bookmarks", value(bookmarks.stream().map(Values::value).collect(Collectors.toSet()))); - expectedMetadata.put("tx_timeout", value(7000)); - expectedMetadata.put("tx_metadata", value(txMetadata)); + "bookmarks", + valueFactory.value(bookmarks.stream().map(valueFactory::value).collect(Collectors.toSet()))); + expectedMetadata.put("tx_timeout", valueFactory.value(7000)); + expectedMetadata.put("tx_metadata", valueFactory.value(txMetadata)); if (mode == READ) { - expectedMetadata.put("mode", value("r")); + expectedMetadata.put("mode", valueFactory.value("r")); } assertEquals(expectedMetadata, metadata); @@ -93,9 +97,9 @@ void shouldHaveCorrectMetadataForDatabaseName(String databaseName) { var bookmarks = new HashSet<>(asList("neo4j:bookmark:v1:tx11", "neo4j:bookmark:v1:tx52")); Map txMetadata = new HashMap<>(); - txMetadata.put("foo", value("bar")); - txMetadata.put("baz", value(111)); - txMetadata.put("time", value(LocalDateTime.now())); + txMetadata.put("foo", valueFactory.value("bar")); + txMetadata.put("baz", valueFactory.value(111)); + txMetadata.put("time", valueFactory.value(LocalDateTime.now())); var txTimeout = Duration.ofSeconds(7); @@ -109,14 +113,16 @@ void shouldHaveCorrectMetadataForDatabaseName(String databaseName) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); Map expectedMetadata = new HashMap<>(); expectedMetadata.put( - "bookmarks", value(bookmarks.stream().map(Values::value).collect(Collectors.toSet()))); - expectedMetadata.put("tx_timeout", value(7000)); - expectedMetadata.put("tx_metadata", value(txMetadata)); - expectedMetadata.put("db", value(databaseName)); + "bookmarks", + valueFactory.value(bookmarks.stream().map(valueFactory::value).collect(Collectors.toSet()))); + expectedMetadata.put("tx_timeout", valueFactory.value(7000)); + expectedMetadata.put("tx_metadata", valueFactory.value(txMetadata)); + expectedMetadata.put("db", valueFactory.value(databaseName)); assertEquals(expectedMetadata, metadata); } @@ -133,7 +139,8 @@ void shouldNotHaveMetadataForDatabaseNameWhenIsNull() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertTrue(metadata.isEmpty()); } @@ -152,11 +159,12 @@ void shouldIncludeNotificationConfig() { NotificationSeverity.WARNING, Set.of(NotificationClassification.valueOf("UNSUPPORTED").get())), false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); var expectedMetadata = new HashMap(); - expectedMetadata.put("notifications_minimum_severity", value("WARNING")); - expectedMetadata.put("notifications_disabled_classifications", value(Set.of("UNSUPPORTED"))); + expectedMetadata.put("notifications_minimum_severity", valueFactory.value("WARNING")); + expectedMetadata.put("notifications_disabled_classifications", valueFactory.value(Set.of("UNSUPPORTED"))); assertEquals(expectedMetadata, metadata); } @@ -179,12 +187,13 @@ void shouldRoundUpFractionalTimeoutAndLog(long nanosValue) { null, null, false, - logging); + logging, + valueFactory); // then var expectedMetadata = new HashMap(); var expectedMillis = nanosValue / 1_000_000 + 1; - expectedMetadata.put("tx_timeout", value(expectedMillis)); + expectedMetadata.put("tx_timeout", valueFactory.value(expectedMillis)); assertEquals(expectedMetadata, metadata); then(logging).should().getLog(TransactionMetadataBuilder.class); then(logger) @@ -213,11 +222,12 @@ void shouldNotLogWhenRoundingDoesNotHappen() { null, null, false, - logging); + logging, + valueFactory); // then var expectedMetadata = new HashMap(); - expectedMetadata.put("tx_timeout", value(timeout)); + expectedMetadata.put("tx_timeout", valueFactory.value(timeout)); assertEquals(expectedMetadata, metadata); then(logging).shouldHaveNoInteractions(); then(logger).shouldHaveNoInteractions(); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/RecordMessageTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/RecordMessageTest.java similarity index 64% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/RecordMessageTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/RecordMessageTest.java index a2c39c3cb6..2f96a83e50 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/response/RecordMessageTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/response/RecordMessageTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.response; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -23,10 +23,13 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; class RecordMessageTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + @ParameterizedTest @MethodSource("equalsArgs") void shouldEquals(RecordMessage message1, Object message2, boolean equals) { @@ -34,10 +37,14 @@ void shouldEquals(RecordMessage message1, Object message2, boolean equals) { } static Stream equalsArgs() { - var message = new RecordMessage(new Value[] {Values.value(1), Values.value("1")}); + var message = new RecordMessage(new Value[] {valueFactory.value(1), valueFactory.value("1")}); return Stream.of( - Arguments.of(message, new RecordMessage(new Value[] {Values.value(1), Values.value("1")}), true), - Arguments.of(message, new RecordMessage(new Value[] {Values.value(2), Values.value("2")}), false), + Arguments.of( + message, new RecordMessage(new Value[] {valueFactory.value(1), valueFactory.value("1")}), true), + Arguments.of( + message, + new RecordMessage(new Value[] {valueFactory.value(2), valueFactory.value("2")}), + false), Arguments.of(message, new SuccessMessage(Collections.emptyMap()), false), Arguments.of(message, message, true), Arguments.of(message, null, false)); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/BoltProtocolV3Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/BoltProtocolV3Test.java similarity index 83% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/BoltProtocolV3Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/BoltProtocolV3Test.java index dda71f1291..0081874961 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/BoltProtocolV3Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/BoltProtocolV3Test.java @@ -14,17 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v3; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -34,12 +31,11 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -58,34 +54,36 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV3Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -118,7 +116,7 @@ protected Class expectedMessageFormatType() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -133,15 +131,16 @@ void shouldInitializeChannel() { channel, "MyDriver/0.0.1", null, - Collections.emptyMap(), + emptyMap(), RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -168,16 +167,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -190,29 +190,29 @@ void shouldSendRoute() { given(connection.write(any(), any())) .willAnswer((Answer>) invocation -> { var handler = (RunResponseHandler) invocation.getArgument(1); - handler.onSuccess(Map.of("fields", Values.value(List.of("ttl", "servers")))); + handler.onSuccess(Map.of("fields", value(List.of("ttl", "servers")))); return CompletableFuture.completedStage(null); }) .willAnswer((Answer>) invocation -> { var handler = (PullResponseHandlerImpl) invocation.getArgument(1); handler.onRecord(new Value[] { - Values.value(1000), - Values.value(List.of( - Values.value(Map.of( + value(1000), + value(List.of( + value(Map.of( "role", - Values.value("ROUTE"), + value("ROUTE"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))), - Values.value(Map.of( + value(List.of(value("192.168.0.1:7867"))))), + value(Map.of( "role", - Values.value("WRITE"), + value("WRITE"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))), - Values.value(Map.of( + value(List.of(value("192.168.0.1:7867"))))), + value(Map.of( "role", - Values.value("READ"), + value("READ"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))))) + value(List.of(value("192.168.0.1:7867"))))))) }); handler.onSuccess(emptyMap()); return CompletableFuture.completedStage(null); @@ -238,7 +238,8 @@ public void onSummary(RouteSummary summary) { null, handler, mock(Clock.class), - NoopLoggingProvider.INSTANCE) + NoopLoggingProvider.INSTANCE, + valueFactory) .toCompletableFuture() .join(); @@ -273,7 +274,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -286,7 +288,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -316,7 +319,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -329,7 +333,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -358,7 +363,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -371,7 +377,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -401,7 +408,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -414,7 +422,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -563,7 +572,8 @@ protected void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE) + NoopLoggingProvider.INSTANCE, + valueFactory) .toCompletableFuture(); e = (BoltClientException) assertThrows(CompletionException.class, future::join).getCause(); @@ -590,13 +600,14 @@ protected void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE) + NoopLoggingProvider.INSTANCE, + valueFactory) .toCompletableFuture(); e = (BoltClientException) assertThrows(CompletionException.class, future::join).getCause(); } - assertThat(e.getMessage(), startsWith("Database name parameter for selecting database is not supported")); + assertTrue(e.getMessage().startsWith("Database name parameter for selecting database is not supported")); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -655,7 +666,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -668,7 +680,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -697,8 +710,7 @@ protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -717,8 +729,9 @@ protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -733,14 +746,15 @@ protected void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); then(connection).should().write(eq(PullAllMessage.PULL_ALL), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testFailedRunInAutoCommitTxWithWaitingForResponse( @@ -769,7 +783,8 @@ protected void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -782,8 +797,13 @@ protected void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageFormatV3Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageFormatV3Test.java similarity index 65% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageFormatV3Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageFormatV3Test.java index 395b6a1360..9c61d1f466 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageFormatV3Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageFormatV3Test.java @@ -14,17 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v3; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * The MessageFormat under tests is the one provided by the {@link BoltProtocolV3} and not an specific class implementation. @@ -36,15 +36,15 @@ class MessageFormatV3Test { @Test void shouldCreateCorrectWriter() { - var writer = messageFormat.newWriter(mock(PackOutput.class)); + var writer = messageFormat.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV3.class)); + assertInstanceOf(MessageWriterV3.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = messageFormat.newReader(mock(PackInput.class)); + var reader = messageFormat.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(CommonMessageReader.class)); + assertInstanceOf(CommonMessageReader.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageReaderV3Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageReaderV3Test.java new file mode 100644 index 0000000000..05983f756a --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageReaderV3Test.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v3; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV3} and not an specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV3Test extends AbstractMessageReaderTestBase { + + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV3.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageWriterV3Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageWriterV3Test.java similarity index 57% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageWriterV3Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageWriterV3Test.java index f1aad6b316..89de1b1037 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageWriterV3Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v3/MessageWriterV3Test.java @@ -14,26 +14,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v3; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -43,16 +40,16 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Collections; +import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV3} and not an specific class @@ -63,92 +60,109 @@ class MessageWriterV3Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV3.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV3.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), PULL_ALL, DISCARD_ALL, @@ -157,7 +171,7 @@ protected Stream supportedMessages() { // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -166,10 +180,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -178,8 +193,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3)))); + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3)))); } @Override diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/BoltProtocolV4Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/BoltProtocolV4Test.java similarity index 84% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/BoltProtocolV4Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/BoltProtocolV4Test.java index 18c0c4325a..62ebcc4eba 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/BoltProtocolV4Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/BoltProtocolV4Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v4; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -54,33 +51,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public final class BoltProtocolV4Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -104,7 +103,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -123,11 +122,12 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -154,16 +154,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -176,29 +177,29 @@ void shouldSendRoute() { given(connection.write(any(), any())) .willAnswer((Answer>) invocation -> { var handler = (RunResponseHandler) invocation.getArgument(1); - handler.onSuccess(Map.of("fields", Values.value(List.of("ttl", "servers")))); + handler.onSuccess(Map.of("fields", value(List.of("ttl", "servers")))); return CompletableFuture.completedStage(null); }) .willAnswer((Answer>) invocation -> { var handler = (PullResponseHandlerImpl) invocation.getArgument(1); handler.onRecord(new Value[] { - Values.value(1000), - Values.value(List.of( - Values.value(Map.of( + value(1000), + value(List.of( + value(Map.of( "role", - Values.value("ROUTE"), + value("ROUTE"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))), - Values.value(Map.of( + value(List.of(value("192.168.0.1:7867"))))), + value(Map.of( "role", - Values.value("WRITE"), + value("WRITE"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))), - Values.value(Map.of( + value(List.of(value("192.168.0.1:7867"))))), + value(Map.of( "role", - Values.value("READ"), + value("READ"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))))) + value(List.of(value("192.168.0.1:7867"))))))) }); handler.onSuccess(emptyMap()); return CompletableFuture.completedStage(null); @@ -224,7 +225,8 @@ public void onSummary(RouteSummary summary) { null, handler, mock(Clock.class), - NoopLoggingProvider.INSTANCE) + NoopLoggingProvider.INSTANCE, + valueFactory) .toCompletableFuture() .join(); @@ -259,7 +261,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -272,7 +275,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -302,7 +306,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -315,7 +320,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -344,7 +350,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -357,7 +364,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -387,7 +395,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -400,7 +409,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -527,7 +537,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -550,7 +561,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -606,7 +618,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -619,7 +632,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -642,8 +656,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -662,8 +675,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -678,15 +692,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } private void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -748,7 +763,8 @@ private void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -761,7 +777,8 @@ private void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -800,7 +817,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -813,7 +831,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -836,7 +855,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -849,9 +869,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageFormatV4Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageFormatV4Test.java similarity index 59% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageFormatV4Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageFormatV4Test.java index edc45ece20..4d90c5a0b1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageFormatV4Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageFormatV4Test.java @@ -14,17 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v4; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * The MessageFormat under tests is the one provided by the {@link BoltProtocolV4} and not an specific class implementation. @@ -36,15 +36,15 @@ class MessageFormatV4Test { @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV4.class)); + assertInstanceOf(MessageWriterV4.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(CommonMessageReader.class)); + assertInstanceOf(CommonMessageReader.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageReaderV4Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageReaderV4Test.java new file mode 100644 index 0000000000..9d246a1232 --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageReaderV4Test.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v4; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV4} and not an specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV4Test extends AbstractMessageReaderTestBase { + + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV4.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageWriterV4Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageWriterV4Test.java similarity index 55% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageWriterV4Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageWriterV4Test.java index 9e351eebf7..3cb42eabe2 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageWriterV4Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v4/MessageWriterV4Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v4; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -44,19 +41,19 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Collections; +import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV3} and not an specific class @@ -67,70 +64,85 @@ class MessageWriterV4Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV4.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV4.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -138,32 +150,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -172,10 +186,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -184,8 +199,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3)))); + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3)))); } @Override diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/BoltProtocolV41Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/BoltProtocolV41Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/BoltProtocolV41Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/BoltProtocolV41Test.java index 8acc4d3e34..858cd67592 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/BoltProtocolV41Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/BoltProtocolV41Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v41; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,33 +49,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.MessageFormatV4; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.MessageFormatV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public final class BoltProtocolV41Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -107,7 +106,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -126,11 +125,12 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -157,16 +157,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -196,7 +197,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -209,7 +211,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -239,7 +242,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -252,7 +256,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -281,7 +286,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -294,7 +300,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -324,7 +331,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -337,7 +345,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -464,7 +473,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -487,7 +497,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -538,7 +549,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -551,7 +563,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -574,8 +587,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -594,8 +606,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -610,15 +623,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } private void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -680,7 +694,8 @@ private void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -693,7 +708,8 @@ private void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -732,7 +748,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -745,7 +762,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -768,7 +786,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -781,9 +800,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageFormatV41Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageFormatV41Test.java similarity index 54% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageFormatV41Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageFormatV41Test.java index d17dc46e5c..02d1b64c04 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageFormatV41Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageFormatV41Test.java @@ -14,19 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v41; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.MessageWriterV4; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.MessageWriterV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * The MessageFormat under tests is the one provided by the {@link BoltProtocolV3} and not an specific class implementation. @@ -38,15 +38,15 @@ class MessageFormatV41Test { @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV4.class)); + assertInstanceOf(MessageWriterV4.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(CommonMessageReader.class)); + assertInstanceOf(CommonMessageReader.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageReaderV41Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageReaderV41Test.java new file mode 100644 index 0000000000..a1a9c0385d --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageReaderV41Test.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v41; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV41} and not an specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV41Test extends AbstractMessageReaderTestBase { + + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV41.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageWriterV41Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageWriterV41Test.java similarity index 56% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageWriterV41Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageWriterV41Test.java index b100515cb2..6e2be6622c 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageWriterV41Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v41/MessageWriterV41Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v41; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v41; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -44,18 +41,18 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Collections; +import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV41} and not an specific class @@ -66,70 +63,85 @@ class MessageWriterV41Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV41.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV41.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -137,32 +149,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -171,10 +185,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -183,8 +198,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3)))); + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3)))); } @Override diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/BoltProtocolV42Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/BoltProtocolV42Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/BoltProtocolV42Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/BoltProtocolV42Test.java index 6e9c923898..82e7d97780 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/BoltProtocolV42Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/BoltProtocolV42Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v42; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,33 +49,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.MessageFormatV4; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.MessageFormatV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public final class BoltProtocolV42Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -107,7 +106,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -126,11 +125,12 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -157,16 +157,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -196,7 +197,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -209,7 +211,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -239,7 +242,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -252,7 +256,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -281,7 +286,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -294,7 +300,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -324,7 +331,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -337,7 +345,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -464,7 +473,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -487,7 +497,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -538,7 +549,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -551,7 +563,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -574,8 +587,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -594,8 +606,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -610,15 +623,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } private void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -680,7 +694,8 @@ private void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -693,7 +708,8 @@ private void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -732,7 +748,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -745,7 +762,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -768,7 +786,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -781,9 +800,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageFormatV42Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageFormatV42Test.java similarity index 57% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageFormatV42Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageFormatV42Test.java index b27ed2d308..a59e480efe 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageFormatV42Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageFormatV42Test.java @@ -14,18 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v42; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.MessageWriterV4; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v4.MessageWriterV4; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * The MessageFormat under tests is the one provided by the {@link BoltProtocolV42} and not an specific class implementation. @@ -37,15 +37,15 @@ class MessageFormatV42Test { @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV4.class)); + assertInstanceOf(MessageWriterV4.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(CommonMessageReader.class)); + assertInstanceOf(CommonMessageReader.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageReaderV42Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageReaderV42Test.java new file mode 100644 index 0000000000..ba8a859627 --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageReaderV42Test.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v42; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV42} and not an specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV42Test extends AbstractMessageReaderTestBase { + + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV42.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageWriterV42Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageWriterV42Test.java similarity index 56% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageWriterV42Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageWriterV42Test.java index ff4330e452..09ca4a76b9 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageWriterV42Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v42/MessageWriterV42Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v42; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -44,18 +41,18 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.Collections; +import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV42} and not an specific class @@ -66,70 +63,85 @@ class MessageWriterV42Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV42.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV42.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -137,32 +149,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -171,10 +185,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -183,8 +198,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3)))); + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3)))); } @Override diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/BoltProtocolV43Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/BoltProtocolV43Test.java similarity index 84% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/BoltProtocolV43Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/BoltProtocolV43Test.java index 36c0d708ba..2eb9610ace 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/BoltProtocolV43Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/BoltProtocolV43Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v43; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -54,34 +51,36 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RouteMessageResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RouteMessageResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public final class BoltProtocolV43Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -110,7 +109,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -129,11 +128,12 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -160,16 +160,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -183,25 +184,25 @@ void shouldSendRoute() { var handler = (RouteMessageResponseHandler) invocation.getArgument(1); handler.onSuccess(Map.of( "rt", - Values.value(Map.of( - "ttl", Values.value(1000), + value(Map.of( + "ttl", value(1000), "servers", - Values.value(List.of( - Values.value(Map.of( + value(List.of( + value(Map.of( "role", - Values.value("ROUTE"), + value("ROUTE"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))), - Values.value(Map.of( + value(List.of(value("192.168.0.1:7867"))))), + value(Map.of( "role", - Values.value("WRITE"), + value("WRITE"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))), - Values.value(Map.of( + value(List.of(value("192.168.0.1:7867"))))), + value(Map.of( "role", - Values.value("READ"), + value("READ"), "addresses", - Values.value(List.of(Values.value("192.168.0.1:7867"))))))))))); + value(List.of(value("192.168.0.1:7867"))))))))))); return CompletableFuture.completedStage(null); }); var routeFuture = new CompletableFuture(); @@ -225,7 +226,8 @@ public void onSummary(RouteSummary summary) { null, handler, mock(Clock.class), - NoopLoggingProvider.INSTANCE) + NoopLoggingProvider.INSTANCE, + valueFactory) .toCompletableFuture() .join(); @@ -260,7 +262,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -273,7 +276,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -303,7 +307,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -316,7 +321,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -345,7 +351,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -358,7 +365,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -388,7 +396,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -401,7 +410,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -528,7 +538,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -551,7 +562,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -602,7 +614,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -615,7 +628,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -638,8 +652,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -658,8 +671,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -674,15 +688,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } private void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -744,7 +759,8 @@ private void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -757,7 +773,8 @@ private void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -796,7 +813,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -809,7 +827,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -832,7 +851,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -845,9 +865,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageFormatV43Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageFormatV43Test.java similarity index 59% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageFormatV43Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageFormatV43Test.java index e4e222bd22..d053f2b854 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageFormatV43Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageFormatV43Test.java @@ -14,17 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v43; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * The MessageFormat under tests is the one provided by the {@link BoltProtocolV43} and not an specific class implementation. @@ -36,15 +36,15 @@ class MessageFormatV43Test { @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV43.class)); + assertInstanceOf(MessageWriterV43.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(CommonMessageReader.class)); + assertInstanceOf(CommonMessageReader.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageReaderV43Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageReaderV43Test.java new file mode 100644 index 0000000000..639ddfb22e --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageReaderV43Test.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v43; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v42.BoltProtocolV42; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV43} and not an specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV43Test extends AbstractMessageReaderTestBase { + + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV42.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageWriterV43Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageWriterV43Test.java similarity index 56% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageWriterV43Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageWriterV43Test.java index 5d20f13aee..a96aac5253 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageWriterV43Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v43/MessageWriterV43Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v43; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v43; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,20 +44,18 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV43} and not an specific class @@ -71,70 +66,85 @@ class MessageWriterV43Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV43.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV43.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -142,32 +152,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -176,10 +188,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -188,8 +201,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage()); @@ -204,7 +218,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/BoltProtocolV44Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/BoltProtocolV44Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/BoltProtocolV44Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/BoltProtocolV44Test.java index 113aff1623..3f8d5c3763 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/BoltProtocolV44Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/BoltProtocolV44Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v44; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,33 +49,34 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV44Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -90,11 +88,6 @@ public class BoltProtocolV44Test { private final InboundMessageDispatcher messageDispatcher = new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE); - private final TransactionConfig txConfig = TransactionConfig.builder() - .withTimeout(ofSeconds(12)) - .withMetadata(singletonMap("key", value(42))) - .build(); - @SuppressWarnings("SameReturnValue") protected BoltProtocol createProtocol() { return BoltProtocolV44.INSTANCE; @@ -112,7 +105,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -131,11 +124,12 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -162,16 +156,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -201,7 +196,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -214,7 +210,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -244,7 +241,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -257,7 +255,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -286,7 +285,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -299,7 +299,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -426,7 +427,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -449,7 +451,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -500,7 +503,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -513,7 +517,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -536,8 +541,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -556,8 +560,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -572,15 +577,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -642,7 +648,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -655,7 +662,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -694,7 +702,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -707,7 +716,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -730,7 +740,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -743,9 +754,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageFormatV44Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageFormatV44Test.java similarity index 54% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageFormatV44Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageFormatV44Test.java index b256dcbb65..8e7dab7e89 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageFormatV44Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageFormatV44Test.java @@ -14,32 +14,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v44; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonMessageReader; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonMessageReader; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV44Test { private static final MessageFormat format = BoltProtocolV44.INSTANCE.createMessageFormat(); @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV44.class)); + assertInstanceOf(MessageWriterV44.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(CommonMessageReader.class)); + assertInstanceOf(CommonMessageReader.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageReaderV44Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageReaderV44Test.java new file mode 100644 index 0000000000..4e6898a3e6 --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageReaderV44Test.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v44; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV44} and not a specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV44Test extends AbstractMessageReaderTestBase { + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV44.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageWriterV44Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageWriterV44Test.java similarity index 56% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageWriterV44Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageWriterV44Test.java index e60926c8f7..5b8f4ada90 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageWriterV44Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v44/MessageWriterV44Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v44; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v44; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,20 +44,18 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV44} and not a specific class @@ -71,70 +66,85 @@ public class MessageWriterV44Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV44.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV44.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -142,32 +152,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -176,10 +188,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -188,8 +201,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage()); @@ -204,7 +218,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/BoltProtocolV5Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/BoltProtocolV5Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/BoltProtocolV5Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/BoltProtocolV5Test.java index aca75ed2ca..d1b0761f99 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/BoltProtocolV5Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/BoltProtocolV5Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,33 +49,34 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; -import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV5Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; protected static final String query = "RETURN $x"; protected static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -90,11 +88,6 @@ public class BoltProtocolV5Test { private final InboundMessageDispatcher messageDispatcher = new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE); - private final TransactionConfig txConfig = TransactionConfig.builder() - .withTimeout(ofSeconds(12)) - .withMetadata(singletonMap("key", value(42))) - .build(); - @SuppressWarnings("SameReturnValue") protected BoltProtocol createProtocol() { return BoltProtocolV5.INSTANCE; @@ -112,7 +105,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -131,11 +124,12 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -162,16 +156,17 @@ void shouldFailToInitializeChannelWhenErrorIsReceived() { RoutingContext.EMPTY, null, mock(Clock.class), - new CompletableFuture<>()) + new CompletableFuture<>(), + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(1)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); + assertEquals(1, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); assertEquals(1, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); messageDispatcher.handleFailureMessage( - new GqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); + GqlErrorUtil.gqlError("Neo.TransientError.General.DatabaseUnavailable", "Error!")); assertTrue(future.isDone()); assertTrue(future.isCompletedExceptionally()); @@ -201,7 +196,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -214,7 +210,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -244,7 +241,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -257,7 +255,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -286,7 +285,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -299,7 +299,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -329,7 +330,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -342,7 +344,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -469,7 +472,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -492,7 +496,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -543,7 +548,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -556,7 +562,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -579,8 +586,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -599,8 +605,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -615,15 +622,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -685,7 +693,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -698,7 +707,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -737,7 +747,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -750,7 +761,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -773,7 +785,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -786,9 +799,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageFormatV5Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageFormatV5Test.java similarity index 57% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageFormatV5Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageFormatV5Test.java index ccae6598f2..e221749fc3 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageFormatV5Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageFormatV5Test.java @@ -14,31 +14,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV5Test { private static final MessageFormat format = BoltProtocolV5.INSTANCE.createMessageFormat(); @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV5.class)); + assertInstanceOf(MessageWriterV5.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(MessageReaderV5.class)); + assertInstanceOf(MessageReaderV5.class, reader); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageReaderV5Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageReaderV5Test.java new file mode 100644 index 0000000000..2019f2dace --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageReaderV5Test.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.messaging.v5; + +import static java.util.Arrays.asList; +import static java.util.Calendar.APRIL; +import static java.util.Calendar.AUGUST; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Stream; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; + +/** + * The MessageReader under tests is the one provided by the {@link BoltProtocolV5} and not a specific class implementation. + *

+ * It's done on this way to make easy to replace the implementation and still getting the same behaviour. + */ +public class MessageReaderV5Test extends AbstractMessageReaderTestBase { + @Override + protected Stream supportedMessages() { + return Stream.of( + // V2 Record types + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), + record(valueFactory.value( + ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), + + // Bolt previous versions valid messages + new FailureMessage("Hello", "World!"), + IgnoredMessage.IGNORED, + new SuccessMessage(new HashMap<>()), + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana")))), + + // V3 Record Types + record(valueFactory.emptyNodeValue()), + record(valueFactory.filledNodeValue()), + record(valueFactory.emptyRelationshipValue()), + record(valueFactory.filledRelationshipValue()), + record(valueFactory.filledPathValue()), + record(valueFactory.emptyPathValue())); + } + + @Override + protected Stream unsupportedMessages() { + return Stream.of(DiscardAllMessage.DISCARD_ALL); + } + + @Override + protected MessageFormat.Reader newReader(PackInput input) { + return BoltProtocolV5.INSTANCE.createMessageFormat().newReader(input, valueFactory); + } + + private Message record(Value value) { + return new RecordMessage(new Value[] {value}); + } + + @Override + protected boolean isElementIdEnabled() { + return true; + } + + @Override + protected boolean isDateTimeUtcEnabled() { + return true; + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageWriterV5Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageWriterV5Test.java similarity index 56% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageWriterV5Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageWriterV5Test.java index 61a1f3c06e..76a8b168b1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageWriterV5Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v5/MessageWriterV5Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,20 +44,18 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; /** * The MessageWriter under tests is the one provided by the {@link BoltProtocolV5} and not a specific class @@ -71,70 +66,85 @@ public class MessageWriterV5Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV5.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV5.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -142,32 +152,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -176,10 +188,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -188,8 +201,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage()); @@ -204,7 +218,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/BoltProtocolV51Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/BoltProtocolV51Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/BoltProtocolV51Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/BoltProtocolV51Test.java index 2547620423..c71586ab4d 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/BoltProtocolV51Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/BoltProtocolV51Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v51; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,33 +49,34 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV51Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -90,11 +88,6 @@ public class BoltProtocolV51Test { private final InboundMessageDispatcher messageDispatcher = new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE); - private final TransactionConfig txConfig = TransactionConfig.builder() - .withTimeout(ofSeconds(12)) - .withMetadata(singletonMap("key", value(42))) - .build(); - @SuppressWarnings("SameReturnValue") protected BoltProtocol createProtocol() { return BoltProtocolV51.INSTANCE; @@ -112,7 +105,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -131,12 +124,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -178,7 +172,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -191,7 +186,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -221,7 +217,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -234,7 +231,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -263,7 +261,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -276,7 +275,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -306,7 +306,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -319,7 +320,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -446,7 +448,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -469,7 +472,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -520,7 +524,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -533,7 +538,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -556,8 +562,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -576,8 +581,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -592,15 +598,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -662,7 +669,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -675,7 +683,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -714,7 +723,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -727,7 +737,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -750,7 +761,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -763,9 +775,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageFormatV51Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageFormatV51Test.java similarity index 54% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageFormatV51Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageFormatV51Test.java index 6c39600202..133d4c5668 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageFormatV51Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageFormatV51Test.java @@ -14,32 +14,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v51; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.MessageReaderV5; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.MessageReaderV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class MessageFormatV51Test { private static final MessageFormat format = BoltProtocolV51.INSTANCE.createMessageFormat(); @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV51.class)); + assertInstanceOf(MessageWriterV51.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(MessageReaderV5.class)); + assertInstanceOf(MessageReaderV5.class, reader); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageWriterV51Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageWriterV51Test.java similarity index 55% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageWriterV51Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageWriterV51Test.java index 3f5809bbbf..3c037272c1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageWriterV51Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v51/MessageWriterV51Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v51; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,88 +44,101 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; public class MessageWriterV51Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV51.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV51.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -136,32 +146,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -170,10 +182,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -182,8 +195,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage()); @@ -198,7 +212,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v52/BoltProtocolV52Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v52/BoltProtocolV52Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v52/BoltProtocolV52Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v52/BoltProtocolV52Test.java index 16dcccd8b5..89bab53710 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v52/BoltProtocolV52Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v52/BoltProtocolV52Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v52; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v52; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,34 +49,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v51.MessageFormatV51; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51.MessageFormatV51; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV52Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -91,11 +89,6 @@ public class BoltProtocolV52Test { private final InboundMessageDispatcher messageDispatcher = new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE); - private final TransactionConfig txConfig = TransactionConfig.builder() - .withTimeout(ofSeconds(12)) - .withMetadata(singletonMap("key", value(42))) - .build(); - @SuppressWarnings("SameReturnValue") protected BoltProtocol createProtocol() { return BoltProtocolV52.INSTANCE; @@ -113,7 +106,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -132,12 +125,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -179,7 +173,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -192,7 +187,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -222,7 +218,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -235,7 +232,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -264,7 +262,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -277,7 +276,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -307,7 +307,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -320,7 +321,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -447,7 +449,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -470,7 +473,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -521,7 +525,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -534,7 +539,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -557,8 +563,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -577,8 +582,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -593,15 +599,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -663,7 +670,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -676,7 +684,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -715,7 +724,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -728,7 +738,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -751,7 +762,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -764,9 +776,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v53/BoltProtocolV53Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v53/BoltProtocolV53Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v53/BoltProtocolV53Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v53/BoltProtocolV53Test.java index 50429c204c..4452f265c7 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v53/BoltProtocolV53Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v53/BoltProtocolV53Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v53; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v53; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,34 +49,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v51.MessageFormatV51; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v51.MessageFormatV51; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV53Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -91,11 +89,6 @@ public class BoltProtocolV53Test { private final InboundMessageDispatcher messageDispatcher = new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE); - private final TransactionConfig txConfig = TransactionConfig.builder() - .withTimeout(ofSeconds(12)) - .withMetadata(singletonMap("key", value(42))) - .build(); - @SuppressWarnings("SameReturnValue") protected BoltProtocol createProtocol() { return BoltProtocolV53.INSTANCE; @@ -113,7 +106,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -132,12 +125,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -179,7 +173,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -192,7 +187,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -222,7 +218,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -235,7 +232,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -264,7 +262,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -277,7 +276,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -307,7 +307,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -320,7 +321,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -447,7 +449,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -470,7 +473,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -521,7 +525,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -534,7 +539,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -557,8 +563,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -577,8 +582,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -593,15 +599,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -663,7 +670,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -676,7 +684,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -715,7 +724,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -728,7 +738,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -751,7 +762,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -764,9 +776,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/BoltProtocolV54Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/BoltProtocolV54Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/BoltProtocolV54Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/BoltProtocolV54Test.java index 2f3d1ce69f..df628fc187 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/BoltProtocolV54Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/BoltProtocolV54Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v54; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,34 +49,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV54Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -91,11 +89,6 @@ public class BoltProtocolV54Test { private final InboundMessageDispatcher messageDispatcher = new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE); - private final TransactionConfig txConfig = TransactionConfig.builder() - .withTimeout(ofSeconds(12)) - .withMetadata(singletonMap("key", value(42))) - .build(); - @SuppressWarnings("SameReturnValue") protected BoltProtocol createProtocol() { return BoltProtocolV54.INSTANCE; @@ -113,7 +106,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -132,12 +125,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -179,7 +173,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -192,7 +187,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -222,7 +218,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -235,7 +232,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -264,7 +262,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -277,7 +276,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -307,7 +307,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -320,7 +321,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -447,7 +449,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -470,7 +473,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -522,7 +526,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -535,7 +540,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -558,8 +564,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -578,8 +583,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -594,15 +600,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -664,7 +671,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -677,7 +685,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -716,7 +725,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -729,7 +739,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -752,7 +763,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -765,9 +777,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageFormatV54Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageFormatV54Test.java similarity index 54% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageFormatV54Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageFormatV54Test.java index 60ccf00efb..60217066a6 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageFormatV54Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageFormatV54Test.java @@ -14,32 +14,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v54; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.MessageReaderV5; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.MessageReaderV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; class MessageFormatV54Test { private static final MessageFormat format = BoltProtocolV54.INSTANCE.createMessageFormat(); @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV54.class)); + assertInstanceOf(MessageWriterV54.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(MessageReaderV5.class)); + assertInstanceOf(MessageReaderV5.class, reader); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageWriterV54Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageWriterV54Test.java similarity index 55% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageWriterV54Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageWriterV54Test.java index 94f4123d71..8598533476 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageWriterV54Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v54/MessageWriterV54Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v54; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,89 +44,102 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; public class MessageWriterV54Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV54.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV54.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -137,32 +147,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -171,10 +183,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -183,8 +196,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage(), @@ -201,7 +215,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v55/BoltProtocolV55Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v55/BoltProtocolV55Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v55/BoltProtocolV55Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v55/BoltProtocolV55Test.java index 036a3a65da..a2d5f673bd 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v55/BoltProtocolV55Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v55/BoltProtocolV55Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v55; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v55; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,34 +49,36 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.MessageFormatV54; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.MessageFormatV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV55Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -108,7 +107,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -127,12 +126,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -174,7 +174,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -187,7 +188,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -217,7 +219,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -230,7 +233,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -259,7 +263,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -272,7 +277,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -302,7 +308,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -315,7 +322,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -442,7 +450,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -465,7 +474,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -517,7 +527,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -530,7 +541,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -553,8 +565,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -573,8 +584,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -589,15 +601,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -659,7 +672,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -672,7 +686,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -711,7 +726,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -724,7 +740,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -747,7 +764,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -760,9 +778,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/BoltProtocolV56Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/BoltProtocolV56Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/BoltProtocolV56Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/BoltProtocolV56Test.java index 070e537825..aa0db0c9b5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/BoltProtocolV56Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/BoltProtocolV56Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v56; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,34 +49,36 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.MessageFormatV54; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.MessageFormatV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV56Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -108,7 +107,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -127,12 +126,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -174,7 +174,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -187,7 +188,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -217,7 +219,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -230,7 +233,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -259,7 +263,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -272,7 +277,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -302,7 +308,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -315,7 +322,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -442,7 +450,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -465,7 +474,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -517,7 +527,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -530,7 +541,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -553,8 +565,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -573,8 +584,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -589,15 +601,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -659,7 +672,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -672,7 +686,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -711,7 +726,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -724,7 +740,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -747,7 +764,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -760,9 +778,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/MessageFormatV56Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/MessageFormatV56Test.java similarity index 51% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/MessageFormatV56Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/MessageFormatV56Test.java index 71a2abc4db..0d8a0f6e10 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/MessageFormatV56Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/MessageFormatV56Test.java @@ -14,33 +14,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v56; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v5.MessageReaderV5; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.MessageWriterV54; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v5.MessageReaderV5; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.MessageWriterV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; class MessageFormatV56Test { private static final MessageFormat format = BoltProtocolV56.INSTANCE.createMessageFormat(); @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV54.class)); + assertInstanceOf(MessageWriterV54.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(MessageReaderV5.class)); + assertInstanceOf(MessageReaderV5.class, reader); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/MessageWriterV56Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/MessageWriterV56Test.java similarity index 55% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/MessageWriterV56Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/MessageWriterV56Test.java index e07d3bd015..d6e12fcadc 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v56/MessageWriterV56Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v56/MessageWriterV56Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v56; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v56; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,89 +44,102 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; public class MessageWriterV56Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV56.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV56.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -137,32 +147,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -171,10 +183,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -183,8 +196,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage(), @@ -201,7 +215,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/BoltProtocolV57Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/BoltProtocolV57Test.java similarity index 85% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/BoltProtocolV57Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/BoltProtocolV57Test.java index 383b22515a..eb20667f0e 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/BoltProtocolV57Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/BoltProtocolV57Test.java @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; import static java.time.Duration.ofSeconds; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.instanceOf; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -32,11 +30,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import io.netty.channel.embedded.EmbeddedChannel; import java.time.Clock; @@ -52,33 +49,35 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.BeginTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.CommitTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RollbackTxResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.RunResponseHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.PullMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.connection.ChannelAttributes; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.BeginTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.CommitTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.PullResponseHandlerImpl; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RollbackTxResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.handlers.RunResponseHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.PullMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.LogonMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; public class BoltProtocolV57Test { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String query = "RETURN $x"; private static final Map query_params = singletonMap("x", value(42)); private static final long UNLIMITED_FETCH_SIZE = -1; @@ -107,7 +106,7 @@ void afterEach() { @Test void shouldCreateMessageFormat() { - assertThat(protocol.createMessageFormat(), instanceOf(expectedMessageFormatType())); + assertInstanceOf(expectedMessageFormatType(), protocol.createMessageFormat()); } @Test @@ -126,12 +125,13 @@ void shouldInitializeChannel() { RoutingContext.EMPTY, null, clock, - latestAuthMillisFuture) + latestAuthMillisFuture, + valueFactory) .toCompletableFuture(); - assertThat(channel.outboundMessages(), hasSize(2)); - assertThat(channel.outboundMessages().poll(), instanceOf(HelloMessage.class)); - assertThat(channel.outboundMessages().poll(), instanceOf(LogonMessage.class)); + assertEquals(2, channel.outboundMessages().size()); + assertInstanceOf(HelloMessage.class, channel.outboundMessages().poll()); + assertInstanceOf(LogonMessage.class, channel.outboundMessages().poll()); assertEquals(2, messageDispatcher.queuedHandlersCount()); assertFalse(future.isDone()); @@ -173,7 +173,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -186,7 +187,8 @@ void shouldBeginTransactionWithoutBookmark() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -216,7 +218,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -229,7 +232,8 @@ void shouldBeginTransactionWithBookmarks() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -258,7 +262,8 @@ void shouldBeginTransactionWithConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -271,7 +276,8 @@ void shouldBeginTransactionWithConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -301,7 +307,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -314,7 +321,8 @@ void shouldBeginTransactionWithBookmarksAndConfig() { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } @@ -441,7 +449,8 @@ void shouldSupportDatabaseNameInBeginTransaction() { null, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -464,7 +473,8 @@ void shouldNotSupportDatabaseNameForAutoCommitTransactions() { txMetadata, null, mock(), - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, future); then(connection).should().write(any(), any()); @@ -513,7 +523,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -526,7 +537,8 @@ private void testFailedRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onError(error); } @@ -546,8 +558,7 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( }) .willAnswer((Answer>) invocation -> { var pullHandler = (PullResponseHandlerImpl) invocation.getArgument(1); - pullHandler.onSuccess( - Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue))); + pullHandler.onSuccess(Map.of("has_more", value(false), "bookmark", value(newBookmarkValue))); return expectedPullStage; }); @SuppressWarnings("unchecked") @@ -566,8 +577,9 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( txMetadata, null, runHandler, - NoopLoggingProvider.INSTANCE); - var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler); + NoopLoggingProvider.INSTANCE, + valueFactory); + var pullStage = protocol.pull(connection, 0, UNLIMITED_FETCH_SIZE, pullHandler, valueFactory); assertEquals(expectedRunStage, runStage); assertEquals(expectedPullStage, pullStage); @@ -582,15 +594,16 @@ private void testSuccessfulRunInAutoCommitTxWithWaitingForResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(runMessage), any(RunResponseHandler.class)); - var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L); + var pullMessage = new PullMessage(UNLIMITED_FETCH_SIZE, 0L, valueFactory); then(connection).should().write(eq(pullMessage), any(PullResponseHandlerImpl.class)); then(runHandler).should().onSummary(any()); then(pullHandler) .should() .onSummary(new PullResponseHandlerImpl.PullSummaryImpl( - false, Map.of("has_more", Values.value(false), "bookmark", Values.value(newBookmarkValue)))); + false, Map.of("has_more", value(false), "bookmark", value(newBookmarkValue)))); } protected void testRunInUnmanagedTransactionAndWaitForRunResponse(boolean success) { @@ -649,7 +662,8 @@ protected void testRunAndWaitForRunResponse( txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -662,7 +676,8 @@ protected void testRunAndWaitForRunResponse( null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); @@ -701,7 +716,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { txMetadata, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = autoCommitTxRunMessage( query, @@ -714,7 +730,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(RunResponseHandler.class)); then(handler).should().onSummary(any()); } else { @@ -737,7 +754,8 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, handler, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); assertEquals(expectedStage, stage); var message = new BeginMessage( @@ -750,9 +768,14 @@ private void testDatabaseNameSupport(boolean autoCommitTx) { null, null, false, - NoopLoggingProvider.INSTANCE); + NoopLoggingProvider.INSTANCE, + valueFactory); then(connection).should().write(eq(message), any(BeginTxResponseHandler.class)); then(handler).should().onSummary(any()); } } + + private static Value value(Object value) { + return valueFactory.value(value); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageFormatV57Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageFormatV57Test.java similarity index 54% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageFormatV57Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageFormatV57Test.java index e888421bb5..5360bbad3c 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageFormatV57Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageFormatV57Test.java @@ -14,32 +14,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.mockito.Mockito.mock; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v54.MessageWriterV54; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v54.MessageWriterV54; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; class MessageFormatV57Test { private static final MessageFormat format = BoltProtocolV57.INSTANCE.createMessageFormat(); @Test void shouldCreateCorrectWriter() { - var writer = format.newWriter(mock(PackOutput.class)); + var writer = format.newWriter(mock(PackOutput.class), mock(ValueFactory.class)); - assertThat(writer, instanceOf(MessageWriterV54.class)); + assertInstanceOf(MessageWriterV54.class, writer); } @Test void shouldCreateCorrectReader() { - var reader = format.newReader(mock(PackInput.class)); + var reader = format.newReader(mock(PackInput.class), mock(ValueFactory.class)); - assertThat(reader, instanceOf(MessageReaderV57.class)); + assertInstanceOf(MessageReaderV57.class, reader); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageReaderV57Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageReaderV57Test.java similarity index 50% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageReaderV57Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageReaderV57Test.java index 733316d1bd..162c8b71a5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageReaderV57Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageReaderV57Test.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; import static java.util.Arrays.asList; import static java.util.Calendar.APRIL; @@ -22,8 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.mock; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; import java.time.LocalDate; import java.time.LocalDateTime; @@ -31,46 +29,51 @@ import java.time.OffsetTime; import java.time.ZoneOffset; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Stream; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageReaderTestBase; class MessageReaderV57Test extends AbstractMessageReaderTestBase { + private final Map DIAGNOSTIC_RECORD = Map.ofEntries( + Map.entry("OPERATION", valueFactory.value("")), + Map.entry("OPERATION_CODE", valueFactory.value("0")), + Map.entry("CURRENT_SCHEMA", valueFactory.value("/"))); + @Override protected Stream supportedMessages() { return Stream.of( // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), + record(valueFactory.point(42, 120.65, -99.2)), + record(valueFactory.point(42, 85.391, 98.8, 11.1)), + record(valueFactory.value(LocalDate.of(2012, AUGUST, 3))), + record(valueFactory.value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), + record(valueFactory.value(LocalTime.of(12, 25))), + record(valueFactory.value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), + record(valueFactory.isoDuration( + Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1)), + record(valueFactory.isoDuration(17, 22, 99, 15)), // Bolt previous versions valid messages IgnoredMessage.IGNORED, new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana")))); + record(valueFactory.value(1337L)), + record(valueFactory.value(List.of("cat", valueFactory.value(null), "dog", valueFactory.value(null)))), + record(valueFactory.value(List.of("k", valueFactory.value(12), "a", valueFactory.value("banana")))), + record(valueFactory.value(asList( + valueFactory.value("k"), + valueFactory.value(12), + valueFactory.value("a"), + valueFactory.value("banana"))))); } @Override @@ -80,15 +83,15 @@ protected Stream unsupportedMessages() { @Override protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV57.INSTANCE.createMessageFormat().newReader(input); + return BoltProtocolV57.INSTANCE.createMessageFormat().newReader(input, valueFactory); } @Test void shouldInitGqlError() { - var messageReader = new MessageReaderV57(mock()); - var gqlStatus = Values.value("gql_status"); - var description = Values.value("description"); - var message = Values.value("message"); + var messageReader = new MessageReaderV57(mock(), valueFactory); + var gqlStatus = valueFactory.value("gql_status"); + var description = valueFactory.value("description"); + var message = valueFactory.value("message"); var params = Map.of( "gql_status", gqlStatus, "description", description, @@ -100,22 +103,22 @@ void shouldInitGqlError() { assertEquals(description.asString(), gqlError.statusDescription()); assertEquals("N/A", gqlError.code()); assertEquals(message.asString(), gqlError.message()); - assertEquals(GqlStatusError.DIAGNOSTIC_RECORD, gqlError.diagnosticRecord()); + assertEquals(DIAGNOSTIC_RECORD, gqlError.diagnosticRecord()); assertNull(gqlError.cause()); } @Test void shouldInitGqlErrorWithMap() { - var messageReader = new MessageReaderV57(mock()); - var gqlStatus = Values.value("gql_status"); - var description = Values.value("description"); - var message = Values.value("message"); - var map = Map.of("key", Values.value("value")); + var messageReader = new MessageReaderV57(mock(), valueFactory); + var gqlStatus = valueFactory.value("gql_status"); + var description = valueFactory.value("description"); + var message = valueFactory.value("message"); + var map = Map.of("key", valueFactory.value("value")); var params = Map.of( "gql_status", gqlStatus, "description", description, "message", message, - "diagnostic_record", Values.value(map)); + "diagnostic_record", valueFactory.value(map)); var gqlError = messageReader.unpackGqlError(params); @@ -123,7 +126,7 @@ void shouldInitGqlErrorWithMap() { assertEquals(description.asString(), gqlError.statusDescription()); assertEquals("N/A", gqlError.code()); assertEquals(message.asString(), gqlError.message()); - var test = new HashMap<>(GqlStatusError.DIAGNOSTIC_RECORD); + var test = new HashMap<>(DIAGNOSTIC_RECORD); test.putAll(map); assertEquals(test, gqlError.diagnosticRecord()); assertNull(gqlError.cause()); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageWriterV57Test.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageWriterV57Test.java similarity index 55% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageWriterV57Test.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageWriterV57Test.java index f2b55da4e6..6804182e29 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v57/MessageWriterV57Test.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/messaging/v57/MessageWriterV57Test.java @@ -14,27 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v57; +package org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v57; import static java.time.Duration.ofSeconds; import static java.util.Calendar.DECEMBER; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; -import static org.neo4j.driver.AuthTokens.basic; -import static org.neo4j.driver.Values.point; -import static org.neo4j.driver.Values.value; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage.COMMIT; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage.DISCARD_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage.GOODBYE; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage.PULL_ALL; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage.RESET; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage.ROLLBACK; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; -import static org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.CommitMessage.COMMIT; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage.DISCARD_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.GoodbyeMessage.GOODBYE; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage.PULL_ALL; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage.RESET; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RollbackMessage.ROLLBACK; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.autoCommitTxRunMessage; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RunWithMetadataMessage.unmanagedTxRunMessage; import java.time.LocalDate; import java.time.LocalDateTime; @@ -47,89 +44,102 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageWriterTestBase; -import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.BoltAgentUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.BeginMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.HelloMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.RouteMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.TelemetryMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging.AbstractMessageWriterTestBase; public class MessageWriterV57Test extends AbstractMessageWriterTestBase { @Override protected MessageFormat.Writer newWriter(PackOutput output) { - return BoltProtocolV57.INSTANCE.createMessageFormat().newWriter(output); + return BoltProtocolV57.INSTANCE.createMessageFormat().newWriter(output, valueFactory); } @Override protected Stream supportedMessages() { return Stream.of( // Bolt V2 Data Types - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 12.99, -180.0))), - unmanagedTxRunMessage("RETURN $point", singletonMap("point", point(42, 0.51, 2.99, 100.123))), - unmanagedTxRunMessage("RETURN $date", singletonMap("date", value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage("RETURN $point", singletonMap("point", valueFactory.point(42, 12.99, -180.0))), unmanagedTxRunMessage( - "RETURN $time", singletonMap("time", value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), - unmanagedTxRunMessage("RETURN $time", singletonMap("time", value(LocalTime.of(12, 9, 18, 999_888)))), + "RETURN $point", singletonMap("point", valueFactory.point(42, 0.51, 2.99, 100.123))), + unmanagedTxRunMessage( + "RETURN $date", singletonMap("date", valueFactory.value(LocalDate.ofEpochDay(2147483650L)))), + unmanagedTxRunMessage( + "RETURN $time", + singletonMap("time", valueFactory.value(OffsetTime.of(4, 16, 20, 999, ZoneOffset.MIN)))), + unmanagedTxRunMessage( + "RETURN $time", singletonMap("time", valueFactory.value(LocalTime.of(12, 9, 18, 999_888)))), unmanagedTxRunMessage( "RETURN $dateTime", - singletonMap("dateTime", value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), + singletonMap( + "dateTime", valueFactory.value(LocalDateTime.of(2049, DECEMBER, 12, 17, 25, 49, 199)))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of( + valueFactory.value(ZonedDateTime.of( 2000, 1, 10, 12, 2, 49, 300, ZoneOffset.ofHoursMinutes(9, 30))))), unmanagedTxRunMessage( "RETURN $dateTime", singletonMap( "dateTime", - value(ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), + valueFactory.value( + ZonedDateTime.of(2000, 1, 10, 12, 2, 49, 300, ZoneId.of("Europe/Stockholm"))))), // New Bolt V4 messages - new PullMessage(100, 200), - new DiscardMessage(300, 400), + new PullMessage(100, 200, valueFactory), + new DiscardMessage(300, 400, valueFactory), // Bolt V3 messages new HelloMessage( "MyDriver/1.2.3", BoltAgentUtil.VALUE, - ((InternalAuthToken) basic("neo4j", "neo4j")).toMap(), + Map.of( + "scheme", + valueFactory.value("basic"), + "principal", + valueFactory.value("neo4j"), + "credentials", + valueFactory.value("neo4j")), Collections.emptyMap(), false, null, - false), + false, + valueFactory), GOODBYE, new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), READ, defaultDatabase(), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), new BeginMessage( Collections.singleton("neo4j:bookmark:v1:tx123"), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), WRITE, database("foo"), null, null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), COMMIT, ROLLBACK, RESET, @@ -137,32 +147,34 @@ protected Stream supportedMessages() { "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), defaultDatabase(), READ, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN 1", Collections.emptyMap(), ofSeconds(5), - singletonMap("key", value(42)), + singletonMap("key", valueFactory.value(42)), database("foo"), WRITE, Collections.singleton("neo4j:bookmark:v1:tx1"), null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), unmanagedTxRunMessage("RETURN 1", Collections.emptyMap()), // Bolt V3 messages with struct values autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), defaultDatabase(), @@ -171,10 +183,11 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), + NoopLoggingProvider.INSTANCE, + valueFactory), autoCommitTxRunMessage( "RETURN $x", - singletonMap("x", value(ZonedDateTime.now())), + singletonMap("x", valueFactory.value(ZonedDateTime.now())), ofSeconds(1), emptyMap(), database("foo"), @@ -183,8 +196,9 @@ protected Stream supportedMessages() { null, null, false, - NoopLoggingProvider.INSTANCE), - unmanagedTxRunMessage("RETURN $x", singletonMap("x", point(42, 1, 2, 3))), + NoopLoggingProvider.INSTANCE, + valueFactory), + unmanagedTxRunMessage("RETURN $x", singletonMap("x", valueFactory.point(42, 1, 2, 3))), // New 4.3 Messages routeMessage(), @@ -201,7 +215,7 @@ protected Stream unsupportedMessages() { private RouteMessage routeMessage() { Map routeContext = new HashMap<>(); - routeContext.put("someContext", Values.value(124)); + routeContext.put("someContext", valueFactory.value(124)); return new RouteMessage(routeContext, Collections.emptySet(), "dbName", null); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackStreamTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackStreamTest.java similarity index 78% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackStreamTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackStreamTest.java index 0609379f52..df6f6389f7 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/packstream/PackStreamTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/packstream/PackStreamTest.java @@ -14,14 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.packstream; +package org.neo4j.driver.internal.bolt.basicimpl.impl.packstream; import static java.util.Arrays.asList; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -31,18 +29,18 @@ import java.nio.channels.Channels; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.basicimpl.util.io.BufferedChannelInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.io.ChannelOutput; -import org.neo4j.driver.internal.util.Iterables; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.io.BufferedChannelInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.io.ChannelOutput; public class PackStreamTest { public static Map asMap(Object... keysAndValues) { - Map map = Iterables.newLinkedHashMapWithSize(keysAndValues.length / 2); + Map map = new LinkedHashMap<>(keysAndValues.length / 2); String key = null; for (var keyOrValue : keysAndValues) { if (key == null) { @@ -93,14 +91,14 @@ void testCanPackAndUnpackNull() throws Throwable { // Then var bytes = machine.output(); - assertThat(bytes, equalTo(new byte[] {(byte) 0xC0})); + assertArrayEquals(new byte[] {(byte) 0xC0}, bytes); // When var unpacker = newUnpacker(bytes); var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.NULL)); + assertEquals(PackType.NULL, packType); } @Test @@ -113,15 +111,15 @@ void testCanPackAndUnpackTrue() throws Throwable { // Then var bytes = machine.output(); - assertThat(bytes, equalTo(new byte[] {(byte) 0xC3})); + assertArrayEquals(new byte[] {(byte) 0xC3}, bytes); // When var unpacker = newUnpacker(bytes); var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.BOOLEAN)); - assertThat(unpacker.unpackBoolean(), equalTo(true)); + assertEquals(PackType.BOOLEAN, packType); + assertTrue(unpacker.unpackBoolean()); } @Test @@ -134,15 +132,15 @@ void testCanPackAndUnpackFalse() throws Throwable { // Then var bytes = machine.output(); - assertThat(bytes, equalTo(new byte[] {(byte) 0xC2})); + assertArrayEquals(new byte[] {(byte) 0xC2}, bytes); // When var unpacker = newUnpacker(bytes); var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.BOOLEAN)); - assertThat(unpacker.unpackBoolean(), equalTo(false)); + assertEquals(PackType.BOOLEAN, packType); + assertFalse(unpacker.unpackBoolean()); } @Test @@ -157,15 +155,15 @@ void testCanPackAndUnpackTinyIntegers() throws Throwable { // Then var bytes = machine.output(); - assertThat(bytes.length, equalTo(1)); + assertEquals(1, bytes.length); // When var unpacker = newUnpacker(bytes); var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.INTEGER)); - assertThat(unpacker.unpackLong(), equalTo(i)); + assertEquals(PackType.INTEGER, packType); + assertEquals(i, unpacker.unpackLong()); } } @@ -181,15 +179,15 @@ void testCanPackAndUnpackShortIntegers() throws Throwable { // Then var bytes = machine.output(); - assertThat(bytes.length, lessThanOrEqualTo(3)); + assertTrue(bytes.length <= 3); // When var unpacker = newUnpacker(bytes); var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.INTEGER)); - assertThat(unpacker.unpackLong(), equalTo(i)); + assertEquals(PackType.INTEGER, packType); + assertEquals(i, unpacker.unpackLong()); } } @@ -210,8 +208,8 @@ void testCanPackAndUnpackPowersOfTwoAsIntegers() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.INTEGER)); - assertThat(unpacker.unpackLong(), equalTo(n)); + assertEquals(PackType.INTEGER, packType); + assertEquals(n, unpacker.unpackLong()); } } @@ -232,8 +230,8 @@ void testCanPackAndUnpackPowersOfTwoPlusABitAsDoubles() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.FLOAT)); - assertThat(unpacker.unpackDouble(), equalTo(n)); + assertEquals(PackType.FLOAT, packType); + assertEquals(n, unpacker.unpackDouble()); } } @@ -254,8 +252,8 @@ void testCanPackAndUnpackPowersOfTwoMinusABitAsDoubles() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.FLOAT)); - assertThat(unpacker.unpackDouble(), equalTo(n)); + assertEquals(PackType.FLOAT, packType); + assertEquals(n, unpacker.unpackDouble()); } } @@ -279,7 +277,7 @@ private void testByteArrayPackingAndUnpacking(Machine machine, int length) throw var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.BYTES)); + assertEquals(PackType.BYTES, packType); assertArrayEquals(array, unpacker.unpackBytes()); } @@ -300,8 +298,8 @@ void testCanPackAndUnpackStrings() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.STRING)); - assertThat(unpacker.unpackString(), equalTo(string)); + assertEquals(PackType.STRING, packType); + assertEquals(string, unpacker.unpackString()); } } @@ -319,7 +317,7 @@ void testCanPackAndUnpackBytes() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.BYTES)); + assertEquals(PackType.BYTES, packType); assertArrayEquals("ABCDEFGHIJ".getBytes(), unpacker.unpackBytes()); } @@ -337,8 +335,8 @@ void testCanPackAndUnpackString() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.STRING)); - assertThat(unpacker.unpackString(), equalTo("ABCDEFGHIJ")); + assertEquals(PackType.STRING, packType); + assertEquals("ABCDEFGHIJ", unpacker.unpackString()); } @Test @@ -356,8 +354,8 @@ void testCanPackAndUnpackSpecialString() throws Throwable { var packType = unpacker.peekNextType(); // Then - assertThat(packType, equalTo(PackType.STRING)); - assertThat(unpacker.unpackString(), equalTo(code)); + assertEquals(PackType.STRING, packType); + assertEquals(code, unpacker.unpackString()); } @Test @@ -376,11 +374,11 @@ void testCanPackAndUnpackListOneItemAtATime() throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.LIST)); - assertThat(unpacker.unpackListHeader(), equalTo(3L)); - assertThat(unpacker.unpackLong(), equalTo(12L)); - assertThat(unpacker.unpackLong(), equalTo(13L)); - assertThat(unpacker.unpackLong(), equalTo(14L)); + assertEquals(PackType.LIST, packType); + assertEquals(3L, unpacker.unpackListHeader()); + assertEquals(12L, unpacker.unpackLong()); + assertEquals(13L, unpacker.unpackLong()); + assertEquals(14L, unpacker.unpackLong()); } @Test @@ -396,11 +394,11 @@ void testCanPackAndUnpackListOfString() throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.LIST)); - assertThat(unpacker.unpackListHeader(), equalTo(3L)); - assertThat(unpacker.unpackString(), equalTo("eins")); - assertThat(unpacker.unpackString(), equalTo("zwei")); - assertThat(unpacker.unpackString(), equalTo("drei")); + assertEquals(PackType.LIST, packType); + assertEquals(3L, unpacker.unpackListHeader()); + assertEquals("eins", unpacker.unpackString()); + assertEquals("zwei", unpacker.unpackString()); + assertEquals("drei", unpacker.unpackString()); } @Test @@ -427,11 +425,11 @@ void testCanPackAndUnpackListOfStringOneByOne() throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.LIST)); - assertThat(unpacker.unpackListHeader(), equalTo(3L)); - assertThat(unpacker.unpackString(), equalTo("eins")); - assertThat(unpacker.unpackString(), equalTo("zwei")); - assertThat(unpacker.unpackString(), equalTo("drei")); + assertEquals(PackType.LIST, packType); + assertEquals(3L, unpacker.unpackListHeader()); + assertEquals("eins", unpacker.unpackString()); + assertEquals("zwei", unpacker.unpackString()); + assertEquals("drei", unpacker.unpackString()); } @Test @@ -450,11 +448,11 @@ void testCanPackAndUnpackListOfSpecialStringOneByOne() throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.LIST)); - assertThat(unpacker.unpackListHeader(), equalTo(3L)); - assertThat(unpacker.unpackString(), equalTo("Mjölnir")); - assertThat(unpacker.unpackString(), equalTo("Mjölnir")); - assertThat(unpacker.unpackString(), equalTo("Mjölnir")); + assertEquals(PackType.LIST, packType); + assertEquals(3L, unpacker.unpackListHeader()); + assertEquals("Mjölnir", unpacker.unpackString()); + assertEquals("Mjölnir", unpacker.unpackString()); + assertEquals("Mjölnir", unpacker.unpackString()); } @Test @@ -481,21 +479,21 @@ void testCanPackAndUnpackStruct() throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.STRUCT)); - assertThat(unpacker.unpackStructHeader(), equalTo(3L)); - assertThat(unpacker.unpackStructSignature(), equalTo((byte) 'N')); + assertEquals(PackType.STRUCT, packType); + assertEquals(3L, unpacker.unpackStructHeader()); + assertEquals((byte) 'N', unpacker.unpackStructSignature()); - assertThat(unpacker.unpackLong(), equalTo(12L)); + assertEquals(12L, unpacker.unpackLong()); - assertThat(unpacker.unpackListHeader(), equalTo(2L)); - assertThat(unpacker.unpackString(), equalTo("Person")); - assertThat(unpacker.unpackString(), equalTo("Employee")); + assertEquals(2L, unpacker.unpackListHeader()); + assertEquals("Person", unpacker.unpackString()); + assertEquals("Employee", unpacker.unpackString()); - assertThat(unpacker.unpackMapHeader(), equalTo(2L)); - assertThat(unpacker.unpackString(), equalTo("name")); - assertThat(unpacker.unpackString(), equalTo("Alice")); - assertThat(unpacker.unpackString(), equalTo("age")); - assertThat(unpacker.unpackLong(), equalTo(33L)); + assertEquals(2L, unpacker.unpackMapHeader()); + assertEquals("name", unpacker.unpackString()); + assertEquals("Alice", unpacker.unpackString()); + assertEquals("age", unpacker.unpackString()); + assertEquals(33L, unpacker.unpackLong()); } @Test @@ -684,11 +682,11 @@ private void assertPackStringLists(int size) throws Throwable { // Then var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.LIST)); + assertEquals(PackType.LIST, packType); - assertThat(unpacker.unpackListHeader(), equalTo((long) size)); + assertEquals(size, unpacker.unpackListHeader()); for (var i = 0; i < size; i++) { - assertThat(unpacker.unpackString(), equalTo("Mjölnir")); + assertEquals("Mjölnir", unpacker.unpackString()); } } @@ -707,12 +705,14 @@ private void assertMap(int size) throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.MAP)); + assertEquals(PackType.MAP, packType); - assertThat(unpacker.unpackMapHeader(), equalTo((long) size)); + assertEquals(size, unpacker.unpackMapHeader()); for (var i = 0; i < size; i++) { - assertThat(unpacker.unpackString(), equalTo(Long.toString(unpacker.unpackLong()))); + var v = unpacker.unpackString(); + var n = unpacker.unpackLong(); + assertEquals(Long.toString(n), v); } } @@ -731,12 +731,12 @@ private void assertStruct(int size) throws Throwable { var unpacker = newUnpacker(machine.output()); var packType = unpacker.peekNextType(); - assertThat(packType, equalTo(PackType.STRUCT)); - assertThat(unpacker.unpackStructHeader(), equalTo((long) size)); - assertThat(unpacker.unpackStructSignature(), equalTo((byte) 'N')); + assertEquals(PackType.STRUCT, packType); + assertEquals(size, unpacker.unpackStructHeader()); + assertEquals((byte) 'N', unpacker.unpackStructSignature()); for (var i = 0; i < size; i++) { - assertThat(unpacker.unpackLong(), equalTo((long) i)); + assertEquals(i, unpacker.unpackLong()); } } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/MetadataExtractorTest.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/MetadataExtractorTest.java similarity index 80% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/MetadataExtractorTest.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/MetadataExtractorTest.java index fc2110360b..9275442fc1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/MetadataExtractorTest.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/MetadataExtractorTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -22,14 +22,15 @@ import static java.util.Collections.singletonMap; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.bolt.basicimpl.util.MetadataExtractor.extractServer; +import static org.neo4j.driver.internal.bolt.basicimpl.impl.util.MetadataExtractor.extractServer; import org.junit.jupiter.api.Test; -import org.neo4j.driver.Values; +import org.neo4j.bolt.api.test.values.TestValueFactory; import org.neo4j.driver.internal.bolt.api.exception.BoltUntrustedServerException; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; class MetadataExtractorTest { + private static final ValueFactory valueFactory = TestValueFactory.INSTANCE; private static final String RESULT_AVAILABLE_AFTER_KEY = "available_after"; private final MetadataExtractor extractor = new MetadataExtractor(RESULT_AVAILABLE_AFTER_KEY); @@ -38,7 +39,7 @@ class MetadataExtractorTest { void shouldExtractQueryKeys() { var keys = asList("hello", " ", "world", "!"); - var extracted = extractor.extractQueryKeys(singletonMap("fields", value(keys))); + var extracted = extractor.extractQueryKeys(singletonMap("fields", valueFactory.value(keys))); assertEquals(keys, extracted); } @@ -50,7 +51,7 @@ void shouldExtractEmptyQueryKeysWhenNoneInMetadata() { @Test void shouldExtractResultAvailableAfter() { - var metadata = singletonMap(RESULT_AVAILABLE_AFTER_KEY, value(424242)); + var metadata = singletonMap(RESULT_AVAILABLE_AFTER_KEY, valueFactory.value(424242)); var extractedResultAvailableAfter = extractor.extractResultAvailableAfter(metadata); assertEquals(424242L, extractedResultAvailableAfter); } @@ -64,7 +65,7 @@ void shouldExtractNoResultAvailableAfterWhenNoneInMetadata() { @Test void shouldExtractServer() { var agent = "Neo4j/3.5.0"; - var metadata = singletonMap("server", value(agent)); + var metadata = singletonMap("server", valueFactory.value(agent)); var serverValue = extractServer(metadata); @@ -73,7 +74,9 @@ void shouldExtractServer() { @Test void shouldFailToExtractServerVersionWhenMetadataDoesNotContainIt() { - assertThrows(BoltUntrustedServerException.class, () -> extractServer(singletonMap("server", Values.NULL))); + assertThrows( + BoltUntrustedServerException.class, + () -> extractServer(singletonMap("server", valueFactory.value(null)))); assertThrows(BoltUntrustedServerException.class, () -> extractServer(singletonMap("server", null))); } @@ -81,6 +84,6 @@ void shouldFailToExtractServerVersionWhenMetadataDoesNotContainIt() { void shouldFailToExtractServerVersionFromNonNeo4jProduct() { assertThrows( BoltUntrustedServerException.class, - () -> extractServer(singletonMap("server", value("NotNeo4j/1.2.3")))); + () -> extractServer(singletonMap("server", valueFactory.value("NotNeo4j/1.2.3")))); } } diff --git a/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/TestUtil.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/TestUtil.java new file mode 100644 index 0000000000..67a7506dc3 --- /dev/null +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/TestUtil.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.basicimpl.impl.util; + +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static java.util.concurrent.TimeUnit.MINUTES; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; + +import io.netty.buffer.ByteBuf; +import io.netty.util.internal.PlatformDependent; +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.TimeoutException; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.BoltProtocol; +import org.neo4j.driver.internal.bolt.basicimpl.impl.spi.Connection; + +public class TestUtil { + private static final long DEFAULT_WAIT_TIME_MS = MINUTES.toMillis(100); + + public static Connection connectionMock(BoltProtocol protocol) { + var connection = mock(Connection.class); + given(connection.protocol()).willReturn(protocol); + return connection; + } + + public static void assertByteBufEquals(ByteBuf expected, ByteBuf actual) { + try { + assertEquals(expected, actual); + } finally { + releaseIfPossible(expected); + releaseIfPossible(actual); + } + } + + public static T await(CompletableFuture future) { + return await((Future) future); + } + + public static > T await(U future) { + try { + return future.get(DEFAULT_WAIT_TIME_MS, MILLISECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new AssertionError("Interrupted while waiting for future: " + future, e); + } catch (ExecutionException e) { + PlatformDependent.throwException(e.getCause()); + return null; + } catch (TimeoutException e) { + throw new AssertionError("Given future did not complete in time: " + future); + } + } + + public static void assertByteBufContains(ByteBuf buf, Number... values) { + try { + assertNotNull(buf); + var expectedReadableBytes = + Arrays.stream(values).mapToInt(TestUtil::bytesCount).sum(); + assertEquals(expectedReadableBytes, buf.readableBytes(), "Unexpected number of bytes"); + for (var expectedValue : values) { + var actualValue = read(buf, expectedValue.getClass()); + var valueType = actualValue.getClass().getSimpleName(); + assertEquals(expectedValue, actualValue, valueType + " values not equal"); + } + } finally { + releaseIfPossible(buf); + } + } + + private static Number read(ByteBuf buf, Class type) { + if (type == Byte.class) { + return buf.readByte(); + } else if (type == Short.class) { + return buf.readShort(); + } else if (type == Integer.class) { + return buf.readInt(); + } else if (type == Long.class) { + return buf.readLong(); + } else if (type == Float.class) { + return buf.readFloat(); + } else if (type == Double.class) { + return buf.readDouble(); + } else { + throw new IllegalArgumentException("Unexpected numeric type: " + type); + } + } + + private static int bytesCount(Number value) { + if (value instanceof Byte) { + return 1; + } else if (value instanceof Short) { + return 2; + } else if (value instanceof Integer) { + return 4; + } else if (value instanceof Long) { + return 8; + } else if (value instanceof Float) { + return 4; + } else if (value instanceof Double) { + return 8; + } else { + throw new IllegalArgumentException("Unexpected number: '" + value + "' or type" + value.getClass()); + } + } + + private static void releaseIfPossible(ByteBuf buf) { + if (buf.refCnt() > 0) { + buf.release(); + } + } +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/BufferedChannelInput.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/BufferedChannelInput.java similarity index 94% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/BufferedChannelInput.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/BufferedChannelInput.java index f38aacf376..0d1aae082b 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/BufferedChannelInput.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/BufferedChannelInput.java @@ -14,14 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.io; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.io; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.ReadableByteChannel; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackStream; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackStream; /** * An {@link PackInput} implementation that reads from an input channel into an internal buffer. diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/ByteBufOutput.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/ByteBufOutput.java similarity index 91% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/ByteBufOutput.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/ByteBufOutput.java index d47cff1d7f..9381b5ef1a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/ByteBufOutput.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/ByteBufOutput.java @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.io; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.io; import io.netty.buffer.ByteBuf; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class ByteBufOutput implements PackOutput { private final ByteBuf buf; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/ChannelOutput.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/ChannelOutput.java similarity index 94% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/ChannelOutput.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/ChannelOutput.java index 28d6c9a224..6c6d76a75b 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/ChannelOutput.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/ChannelOutput.java @@ -14,12 +14,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.io; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.io; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; public class ChannelOutput implements PackOutput { private final WritableByteChannel channel; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/MessageToByteBufWriter.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/MessageToByteBufWriter.java similarity index 77% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/MessageToByteBufWriter.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/MessageToByteBufWriter.java index 37d07a74bb..2ed4b5ddc5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/io/MessageToByteBufWriter.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/io/MessageToByteBufWriter.java @@ -14,13 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.io; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.io; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; public class MessageToByteBufWriter { private final MessageFormat messageFormat; @@ -33,7 +34,7 @@ public ByteBuf asByteBuf(Message message) { try { var buf = Unpooled.buffer(); var output = new ByteBufOutput(buf); - messageFormat.newWriter(output).write(message); + messageFormat.newWriter(output, TestValueFactory.INSTANCE).write(message); return buf; } catch (IOException e) { throw new RuntimeException(e); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/AbstractMessageReaderTestBase.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/AbstractMessageReaderTestBase.java similarity index 73% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/AbstractMessageReaderTestBase.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/AbstractMessageReaderTestBase.java index 3ecc4150a6..6cfab936ff 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/AbstractMessageReaderTestBase.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/AbstractMessageReaderTestBase.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.fail; @@ -27,19 +27,22 @@ import java.util.stream.Stream; import org.junit.jupiter.api.DynamicNode; import org.junit.jupiter.api.TestFactory; -import org.neo4j.driver.internal.bolt.api.GqlError; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ByteBufInput; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ResponseMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.io.ByteBufOutput; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.GqlErrorUtil; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ByteBufInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ResponseMessageHandler; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.io.ByteBufOutput; public abstract class AbstractMessageReaderTestBase { + protected static final TestValueFactory valueFactory = TestValueFactory.INSTANCE; + @TestFactory Stream shouldReadSupportedMessages() { return supportedMessages() @@ -52,7 +55,8 @@ private void testSupportedMessageReading(Message message) throws IOException { if (message instanceof SuccessMessage successMessage) { verify(handler).handleSuccessMessage(successMessage.metadata()); } else if (message instanceof FailureMessage failureMessage) { - verify(handler).handleFailureMessage(new GqlError(failureMessage.code(), failureMessage.message())); + verify(handler) + .handleFailureMessage(GqlErrorUtil.gqlError(failureMessage.code(), failureMessage.message())); } else if (message instanceof IgnoredMessage) { verify(handler).handleIgnoredMessage(); } else if (message instanceof RecordMessage recordMessage) { @@ -95,7 +99,7 @@ private PackInput newInputWith(Message message) throws IOException { if (isDateTimeUtcEnabled()) { messageFormat.enableDateTimeUtc(); } - var writer = messageFormat.newWriter(new ByteBufOutput(buffer)); + var writer = messageFormat.newWriter(new ByteBufOutput(buffer), TestValueFactory.INSTANCE); writer.write(message); var input = new ByteBufInput(); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/AbstractMessageWriterTestBase.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/AbstractMessageWriterTestBase.java similarity index 75% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/AbstractMessageWriterTestBase.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/AbstractMessageWriterTestBase.java index d69f10f5a3..de76ba00f5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/AbstractMessageWriterTestBase.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/AbstractMessageWriterTestBase.java @@ -14,12 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.DynamicTest.dynamicTest; import static org.mockito.Mockito.mock; @@ -28,14 +27,18 @@ import java.util.stream.Stream; import org.junit.jupiter.api.DynamicNode; import org.junit.jupiter.api.TestFactory; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ByteBufInput; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackStream; -import org.neo4j.driver.internal.bolt.basicimpl.util.io.ByteBufOutput; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.ByteBufInput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageFormat; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackStream; +import org.neo4j.driver.internal.bolt.basicimpl.impl.util.io.ByteBufOutput; public abstract class AbstractMessageWriterTestBase { + protected static final ValueFactory valueFactory = TestValueFactory.INSTANCE; + @TestFactory Stream shouldWriteSupportedMessages() { return supportedMessages() @@ -66,7 +69,7 @@ private void testSupportedMessageWriting(Message message) throws IOException { var unpacker = new PackStream.Unpacker(input); var structHeader = unpacker.unpackStructHeader(); - assertThat(structHeader, greaterThanOrEqualTo(0L)); + assertTrue(structHeader >= 0L); var structSignature = unpacker.unpackStructSignature(); assertEquals(message.signature(), structSignature); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/FailureMessageEncoder.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/FailureMessageEncoder.java similarity index 56% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/FailureMessageEncoder.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/FailureMessageEncoder.java index 44ca3f9079..925938f8fa 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/FailureMessageEncoder.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/FailureMessageEncoder.java @@ -14,26 +14,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; public class FailureMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { var failureMessage = (FailureMessage) message; packer.packStructHeader(1, failureMessage.signature()); Map body = new HashMap<>(); - body.put("code", Values.value(failureMessage.code())); - body.put("message", Values.value(failureMessage.message())); + body.put("code", valueFactory.value(failureMessage.code())); + body.put("message", valueFactory.value(failureMessage.message())); packer.pack(body); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/IgnoredMessageEncoder.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/IgnoredMessageEncoder.java similarity index 59% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/IgnoredMessageEncoder.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/IgnoredMessageEncoder.java index b1c0b6709d..56c40eb700 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/IgnoredMessageEncoder.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/IgnoredMessageEncoder.java @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; public class IgnoredMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { packer.packStructHeader(0, IgnoredMessage.SIGNATURE); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/KnowledgeableMessageFormat.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/KnowledgeableMessageFormat.java similarity index 60% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/KnowledgeableMessageFormat.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/KnowledgeableMessageFormat.java index 5e80e3b2b4..418583f7ea 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/KnowledgeableMessageFormat.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/KnowledgeableMessageFormat.java @@ -14,32 +14,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValueUnpacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardAllMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullAllMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; -import org.neo4j.driver.internal.util.Iterables; -import org.neo4j.driver.internal.value.InternalValue; -import org.neo4j.driver.types.Entity; -import org.neo4j.driver.types.Node; -import org.neo4j.driver.types.Path; -import org.neo4j.driver.types.Relationship; +import java.util.stream.StreamSupport; +import org.neo4j.bolt.api.test.values.TestNode; +import org.neo4j.bolt.api.test.values.TestPath; +import org.neo4j.bolt.api.test.values.TestRelationship; +import org.neo4j.bolt.api.test.values.TestValue; +import org.neo4j.bolt.api.test.values.TestValueFactory; +import org.neo4j.bolt.api.test.values.impl.Entity; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.AbstractMessageWriter; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.common.CommonValueUnpacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.DiscardAllMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.PullAllMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.encode.ResetMessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.DiscardAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.PullAllMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.request.ResetMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.v3.MessageFormatV3; +import org.neo4j.driver.internal.bolt.basicimpl.impl.packstream.PackOutput; /** * This class provides the missing server side packing methods to serialize Node, Relationship and Path. It also allows writing of server side messages like @@ -54,8 +59,9 @@ public KnowledgeableMessageFormat(boolean elementIdEnabled) { } @Override - public Writer newWriter(PackOutput output) { - return new KnowledgeableMessageWriter(output, elementIdEnabled, dateTimeUtcEnabled); + public Writer newWriter(PackOutput output, ValueFactory valueFactory) { + return new KnowledgeableMessageWriter( + output, elementIdEnabled, dateTimeUtcEnabled, (TestValueFactory) valueFactory); } @Override @@ -64,12 +70,16 @@ public void enableDateTimeUtc() { } private static class KnowledgeableMessageWriter extends AbstractMessageWriter { - KnowledgeableMessageWriter(PackOutput output, boolean enableElementId, boolean dateTimeUtcEnabled) { - super(new KnowledgeableValuePacker(output, enableElementId, dateTimeUtcEnabled), buildEncoders()); + KnowledgeableMessageWriter( + PackOutput output, boolean enableElementId, boolean dateTimeUtcEnabled, TestValueFactory valueFactory) { + super( + new KnowledgeableValuePacker(output, enableElementId, dateTimeUtcEnabled), + buildEncoders(), + valueFactory); } static Map buildEncoders() { - Map result = Iterables.newHashMapWithSize(10); + Map result = new HashMap<>(10); // request message encoders result.put(DiscardAllMessage.SIGNATURE, new DiscardAllMessageEncoder()); result.put(PullAllMessage.SIGNATURE, new PullAllMessageEncoder()); @@ -92,31 +102,29 @@ private static class KnowledgeableValuePacker extends CommonValuePacker { } @Override - protected void packInternalValue(InternalValue value) throws IOException { - var typeConstructor = value.typeConstructor(); - switch (typeConstructor) { + protected void packInternalValue(Value value) throws IOException { + switch (value.type()) { case NODE -> { - var node = value.asNode(); + var node = ((TestValue) value).asNode(); packNode(node); } case RELATIONSHIP -> { - var rel = value.asRelationship(); + var rel = ((TestValue) value).asRelationship(); packRelationship(rel); } case PATH -> { - var path = value.asPath(); + var path = ((TestValue) value).asPath(); packPath(path); } default -> super.packInternalValue(value); } } - @SuppressWarnings("deprecation") - private void packPath(Path path) throws IOException { + private void packPath(TestPath path) throws IOException { packer.packStructHeader(3, CommonValueUnpacker.PATH); // Unique nodes - Map nodeIdx = Iterables.newLinkedHashMapWithSize(path.length() + 1); + Map nodeIdx = new LinkedHashMap<>(path.length() + 1); for (var node : path.nodes()) { if (!nodeIdx.containsKey(node)) { nodeIdx.put(node, nodeIdx.size()); @@ -128,7 +136,7 @@ private void packPath(Path path) throws IOException { } // Unique rels - Map relIdx = Iterables.newLinkedHashMapWithSize(path.length()); + Map relIdx = new LinkedHashMap<>(path.length()); for (var rel : path.relationships()) { if (!relIdx.containsKey(rel)) { relIdx.put(rel, relIdx.size() + 1); @@ -138,7 +146,7 @@ private void packPath(Path path) throws IOException { for (var rel : relIdx.keySet()) { packer.packStructHeader(elementIdEnabled ? 4 : 3, CommonValueUnpacker.UNBOUND_RELATIONSHIP); packer.pack(rel.id()); - packer.pack(rel.type()); + packer.pack(rel.typeString()); packProperties(rel); if (elementIdEnabled) { packer.pack(rel.elementId()); @@ -157,14 +165,13 @@ private void packPath(Path path) throws IOException { } } - @SuppressWarnings("deprecation") - private void packRelationship(Relationship rel) throws IOException { + private void packRelationship(TestRelationship rel) throws IOException { packer.packStructHeader(elementIdEnabled ? 8 : 5, CommonValueUnpacker.RELATIONSHIP); packer.pack(rel.id()); packer.pack(rel.startNodeId()); packer.pack(rel.endNodeId()); - packer.pack(rel.type()); + packer.pack(rel.typeString()); packProperties(rel); @@ -175,13 +182,13 @@ private void packRelationship(Relationship rel) throws IOException { } } - @SuppressWarnings("deprecation") - private void packNode(Node node) throws IOException { + private void packNode(TestNode node) throws IOException { packer.packStructHeader(elementIdEnabled ? 4 : 3, CommonValueUnpacker.NODE); packer.pack(node.id()); var labels = node.labels(); - packer.packListHeader(Iterables.count(labels)); + packer.packListHeader( + (int) StreamSupport.stream(labels.spliterator(), false).count()); for (var label : labels) { packer.pack(label); } @@ -198,7 +205,7 @@ private void packProperties(Entity entity) throws IOException { packer.packMapHeader(entity.size()); for (var propKey : keys) { packer.pack(propKey); - packInternalValue((InternalValue) entity.get(propKey)); + packInternalValue(entity.get(propKey)); } } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/MemorizingInboundMessageDispatcher.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/MemorizingInboundMessageDispatcher.java similarity index 73% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/MemorizingInboundMessageDispatcher.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/MemorizingInboundMessageDispatcher.java index 474ab8e021..bb15073dc1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/MemorizingInboundMessageDispatcher.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/MemorizingInboundMessageDispatcher.java @@ -14,22 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import io.netty.channel.Channel; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.GqlError; import org.neo4j.driver.internal.bolt.api.LoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.basicimpl.impl.async.inbound.InboundMessageDispatcher; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.FailureMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.IgnoredMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; public class MemorizingInboundMessageDispatcher extends InboundMessageDispatcher { private final List messages = new CopyOnWriteArrayList<>(); diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/RecordMessageEncoder.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/RecordMessageEncoder.java similarity index 59% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/RecordMessageEncoder.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/RecordMessageEncoder.java index 22dbb44ec8..e6d3bed2aa 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/RecordMessageEncoder.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/RecordMessageEncoder.java @@ -14,22 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; - -import static org.neo4j.driver.Values.value; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.RecordMessage; public class RecordMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { var recordMessage = (RecordMessage) message; var fields = recordMessage.fields(); packer.packStructHeader(1, recordMessage.signature()); - packer.pack(value(fields)); // pack list of fields + packer.pack(valueFactory.value(fields)); // pack list of fields } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/SuccessMessageEncoder.java b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/SuccessMessageEncoder.java similarity index 62% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/SuccessMessageEncoder.java rename to bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/SuccessMessageEncoder.java index 8a3546f361..7ab591946e 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/messaging/SuccessMessageEncoder.java +++ b/bolt-api-netty/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/impl/util/messaging/SuccessMessageEncoder.java @@ -14,17 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util.messaging; +package org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging; import java.io.IOException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.ValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.Message; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.MessageEncoder; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.ValuePacker; +import org.neo4j.driver.internal.bolt.basicimpl.impl.messaging.response.SuccessMessage; public class SuccessMessageEncoder implements MessageEncoder { @Override - public void encode(Message message, ValuePacker packer) throws IOException { + public void encode(Message message, ValuePacker packer, ValueFactory valueFactory) throws IOException { var successMessage = (SuccessMessage) message; packer.packStructHeader(1, successMessage.signature()); packer.pack(successMessage.metadata()); diff --git a/bolt-api-pooled/LICENSES.txt b/bolt-api-pooled/LICENSES.txt new file mode 100644 index 0000000000..f8e0fd3292 --- /dev/null +++ b/bolt-api-pooled/LICENSES.txt @@ -0,0 +1,5 @@ +This file contains the full license text of the included third party +libraries. For an overview of the licenses see the NOTICE.txt file. + + + diff --git a/bolt-api-pooled/NOTICE.txt b/bolt-api-pooled/NOTICE.txt new file mode 100644 index 0000000000..c3bf48c6fc --- /dev/null +++ b/bolt-api-pooled/NOTICE.txt @@ -0,0 +1,20 @@ +Copyright (c) "Neo4j" +Neo4j Sweden AB [https://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. + +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. + +Full license texts are found in LICENSES.txt. + + +Third-party licenses +-------------------- + diff --git a/bolt-api-pooled/pom.xml b/bolt-api-pooled/pom.xml new file mode 100644 index 0000000000..5d8b8b1b4f --- /dev/null +++ b/bolt-api-pooled/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + + + org.neo4j.driver + neo4j-java-driver-parent + 5.27-SNAPSHOT + + + neo4j-bolt-api-pooled + + jar + Neo4j Bolt API Pooled + https://github.com/neo4j/neo4j-java-driver + + + ${project.basedir}/.. + ,-try + + + + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + + + + org.mockito + mockito-core + + + org.junit.jupiter + junit-jupiter + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire.and.failsafe.version} + + + + + + + + scm:git:git://github.com/neo4j/neo4j-java-driver.git + scm:git:git@github.com:neo4j/neo4j-java-driver.git + https://github.com/neo4j/neo4j-java-driver + + + diff --git a/bolt-api-pooled/src/main/java/module-info.java b/bolt-api-pooled/src/main/java/module-info.java new file mode 100644 index 0000000000..0d9eae47d2 --- /dev/null +++ b/bolt-api-pooled/src/main/java/module-info.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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. + */ +/** + * The Neo4j Bolt API pooled implementation module. + */ +module org.neo4j.bolt.pooled { + exports org.neo4j.driver.internal.bolt.pooledimpl; + + requires transitive org.neo4j.bolt.api; +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProvider.java b/bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProvider.java similarity index 99% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProvider.java rename to bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProvider.java index 3d669e9cb8..d0b9fc1ef0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProvider.java +++ b/bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProvider.java @@ -35,7 +35,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BasicResponseHandler; import org.neo4j.driver.internal.bolt.api.BoltAgent; @@ -52,7 +51,9 @@ import org.neo4j.driver.internal.bolt.api.SecurityPlan; import org.neo4j.driver.internal.bolt.api.exception.BoltTransientException; import org.neo4j.driver.internal.bolt.api.exception.MinVersionAcquisitionException; -import org.neo4j.driver.internal.bolt.pooledimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.pooledimpl.impl.PooledBoltConnection; +import org.neo4j.driver.internal.bolt.pooledimpl.impl.util.FutureUtil; public class PooledBoltConnectionProvider implements BoltConnectionProvider { private final System.Logger log; @@ -185,7 +186,7 @@ public CompletionStage connect( } @SuppressWarnings({"DuplicatedCode", "ConstantValue"}) - public void connect( + private void connect( CompletableFuture acquisitionFuture, SecurityPlan securityPlan, DatabaseName databaseName, @@ -625,7 +626,7 @@ private void purge(ConnectionEntry entry) { log.log(System.Logger.Level.DEBUG, "Connection purged from the pool."); } - synchronized void onExpired() { + public synchronized void onExpired() { var now = clock.millis(); minAuthTimestamp = Math.max(minAuthTimestamp, now); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnection.java b/bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/impl/PooledBoltConnection.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnection.java rename to bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/impl/PooledBoltConnection.java index aec3cc002c..303dba21c9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnection.java +++ b/bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/impl/PooledBoltConnection.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.pooledimpl; +package org.neo4j.driver.internal.bolt.pooledimpl.impl; import java.time.Duration; import java.util.Map; @@ -22,7 +22,6 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.AuthData; import org.neo4j.driver.internal.bolt.api.BasicResponseHandler; @@ -47,6 +46,8 @@ import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.pooledimpl.PooledBoltConnectionProvider; public class PooledBoltConnection implements BoltConnection { private final BoltConnection delegate; @@ -345,7 +346,7 @@ public boolean telemetrySupported() { } // internal use only - BoltConnection delegate() { + public BoltConnection delegate() { return delegate; } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/FutureUtil.java b/bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/impl/util/FutureUtil.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/FutureUtil.java rename to bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/impl/util/FutureUtil.java index 74872e1d8c..408a61387e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/util/FutureUtil.java +++ b/bolt-api-pooled/src/main/java/org/neo4j/driver/internal/bolt/pooledimpl/impl/util/FutureUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util; +package org.neo4j.driver.internal.bolt.pooledimpl.impl.util; import java.util.concurrent.CompletionException; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProviderTest.java b/bolt-api-pooled/src/test/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProviderTest.java similarity index 98% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProviderTest.java rename to bolt-api-pooled/src/test/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProviderTest.java index d009dc7004..96bf4549a4 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProviderTest.java +++ b/bolt-api-pooled/src/test/java/org/neo4j/driver/internal/bolt/pooledimpl/PooledBoltConnectionProviderTest.java @@ -47,12 +47,9 @@ import org.mockito.BDDMockito; import org.mockito.Mock; import org.mockito.stubbing.Answer; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.AuthData; import org.neo4j.driver.internal.bolt.api.BoltAgent; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; import org.neo4j.driver.internal.bolt.api.BoltConnection; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; import org.neo4j.driver.internal.bolt.api.BoltConnectionState; @@ -68,6 +65,8 @@ import org.neo4j.driver.internal.bolt.api.SecurityPlan; import org.neo4j.driver.internal.bolt.api.exception.MinVersionAcquisitionException; import org.neo4j.driver.internal.bolt.api.summary.ResetSummary; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.pooledimpl.impl.PooledBoltConnection; class PooledBoltConnectionProviderTest { PooledBoltConnectionProvider provider; @@ -99,7 +98,7 @@ class PooledBoltConnectionProviderTest { final long idleBeforeTest = 30000; final BoltServerAddress address = BoltServerAddress.LOCAL_DEFAULT; final RoutingContext context = RoutingContext.EMPTY; - final BoltAgent boltAgent = BoltAgentUtil.VALUE; + final BoltAgent boltAgent = new BoltAgent("agent", null, null, null); final String userAgent = "agent"; final int timeout = 1000; @@ -107,7 +106,6 @@ class PooledBoltConnectionProviderTest { final DatabaseName databaseName = DatabaseNameUtil.defaultDatabase(); final AccessMode mode = AccessMode.WRITE; final Set bookmarks = Set.of("bookmark1", "bookmark2"); - final String impersonatedUser = null; final BoltProtocolVersion minVersion = new BoltProtocolVersion(5, 6); final NotificationConfig notificationConfig = NotificationConfig.defaultConfig(); @@ -729,15 +727,15 @@ void shouldPipelineReauth() { return CompletableFuture.completedStage(null); }); given(connection.logoff()).willReturn(CompletableFuture.completedStage(connection)); - given(connection.logon(Map.of("key", Values.value("value")))) - .willReturn(CompletableFuture.completedStage(connection)); + var authMap = Map.of("key", mock(Value.class)); + given(connection.logon(authMap)).willReturn(CompletableFuture.completedStage(connection)); var authData = mock(AuthData.class); given(authData.authAckMillis()).willReturn(0L); given(authData.authMap()).willReturn(Collections.emptyMap()); given(connection.authData()).willReturn(CompletableFuture.completedStage(authData)); given(authMapStageSupplier.get()) .willReturn(CompletableFuture.completedStage(Collections.emptyMap())) - .willReturn(CompletableFuture.completedStage(Map.of("key", Values.value("value")))); + .willReturn(CompletableFuture.completedStage(authMap)); given(upstreamProvider.connect( eq(securityPlan), eq(databaseName), @@ -782,6 +780,6 @@ void shouldPipelineReauth() { // then assertEquals(connection, ((PooledBoltConnection) actualConnection).delegate()); then(connection).should().logoff(); - then(connection).should().logon(Map.of("key", Values.value("value"))); + then(connection).should().logon(authMap); } } diff --git a/bolt-api-routed/LICENSES.txt b/bolt-api-routed/LICENSES.txt new file mode 100644 index 0000000000..f8e0fd3292 --- /dev/null +++ b/bolt-api-routed/LICENSES.txt @@ -0,0 +1,5 @@ +This file contains the full license text of the included third party +libraries. For an overview of the licenses see the NOTICE.txt file. + + + diff --git a/bolt-api-routed/NOTICE.txt b/bolt-api-routed/NOTICE.txt new file mode 100644 index 0000000000..c3bf48c6fc --- /dev/null +++ b/bolt-api-routed/NOTICE.txt @@ -0,0 +1,20 @@ +Copyright (c) "Neo4j" +Neo4j Sweden AB [https://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. + +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. + +Full license texts are found in LICENSES.txt. + + +Third-party licenses +-------------------- + diff --git a/bolt-api-routed/pom.xml b/bolt-api-routed/pom.xml new file mode 100644 index 0000000000..7edc96104a --- /dev/null +++ b/bolt-api-routed/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + + + org.neo4j.driver + neo4j-java-driver-parent + 5.27-SNAPSHOT + + + neo4j-bolt-api-routed + + jar + Neo4j Bolt API Routed + https://github.com/neo4j/neo4j-java-driver + + + ${project.basedir}/.. + ,-try + + + + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + + + + org.mockito + mockito-core + + + org.junit.jupiter + junit-jupiter + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire.and.failsafe.version} + + + + + + + + scm:git:git://github.com/neo4j/neo4j-java-driver.git + scm:git:git@github.com:neo4j/neo4j-java-driver.git + https://github.com/neo4j/neo4j-java-driver + + + diff --git a/bolt-api-routed/src/main/java/module-info.java b/bolt-api-routed/src/main/java/module-info.java new file mode 100644 index 0000000000..d1f43f7b56 --- /dev/null +++ b/bolt-api-routed/src/main/java/module-info.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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. + */ +/** + * The Neo4j Bolt API routed implementation module. + */ +module org.neo4j.bolt.routed { + exports org.neo4j.driver.internal.bolt.routedimpl; + + requires transitive org.neo4j.bolt.api; +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterCompositionLookupResult.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/ClusterCompositionLookupResult.java similarity index 96% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterCompositionLookupResult.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/ClusterCompositionLookupResult.java index da13d17d5b..33fe1bfc4b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterCompositionLookupResult.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/ClusterCompositionLookupResult.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl; import java.util.Optional; import java.util.Set; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/Rediscovery.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/Rediscovery.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/Rediscovery.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/Rediscovery.java index cd79d6cdcc..ea887d7889 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/Rediscovery.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/Rediscovery.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl; import java.net.UnknownHostException; import java.util.List; @@ -23,11 +23,11 @@ import java.util.concurrent.CompletionStage; import java.util.function.Function; import java.util.function.Supplier; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.SecurityPlan; +import org.neo4j.driver.internal.bolt.api.values.Value; /** * Provides cluster composition lookup capabilities and initial router address resolution. diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnectionProvider.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnectionProvider.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnectionProvider.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnectionProvider.java index cfc54bfa35..0c7215a416 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnectionProvider.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnectionProvider.java @@ -34,7 +34,6 @@ import java.util.function.Function; import java.util.function.Supplier; import javax.net.ssl.SSLHandshakeException; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltAgent; import org.neo4j.driver.internal.bolt.api.BoltConnection; @@ -52,15 +51,16 @@ import org.neo4j.driver.internal.bolt.api.exception.BoltConnectionAcquisitionException; import org.neo4j.driver.internal.bolt.api.exception.BoltFailureException; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.Rediscovery; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RediscoveryImpl; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RoutingTable; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RoutingTableHandler; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RoutingTableRegistry; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RoutingTableRegistryImpl; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing.LeastConnectedLoadBalancingStrategy; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing.LoadBalancingStrategy; -import org.neo4j.driver.internal.bolt.routedimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.impl.AuthTokenManagerExecutionException; +import org.neo4j.driver.internal.bolt.routedimpl.impl.RoutedBoltConnection; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.RediscoveryImpl; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.RoutingTableHandler; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.RoutingTableRegistry; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.RoutingTableRegistryImpl; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing.LeastConnectedLoadBalancingStrategy; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing.LoadBalancingStrategy; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FutureUtil; public class RoutedBoltConnectionProvider implements BoltConnectionProvider { private static final String CONNECTION_ACQUISITION_COMPLETION_FAILURE_MESSAGE = @@ -440,7 +440,7 @@ private synchronized void incrementInUseCount(BoltServerAddress address) { addressToInUseCount.merge(address, 1, Integer::sum); } - synchronized void decrementInUseCount(BoltServerAddress address) { + public synchronized void decrementInUseCount(BoltServerAddress address) { addressToInUseCount.compute(address, (ignored, value) -> { if (value == null) { return null; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTable.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutingTable.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTable.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutingTable.java index af6b2d3e5b..4691e31bbe 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTable.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutingTable.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl; import java.util.List; import java.util.Set; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/AuthTokenManagerExecutionException.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/AuthTokenManagerExecutionException.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/AuthTokenManagerExecutionException.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/AuthTokenManagerExecutionException.java index 22d38c9a4b..37dcc729ed 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/AuthTokenManagerExecutionException.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/AuthTokenManagerExecutionException.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl; +package org.neo4j.driver.internal.bolt.routedimpl.impl; import java.io.Serial; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnection.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/RoutedBoltConnection.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnection.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/RoutedBoltConnection.java index 6e5f7df79e..41573504bf 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/RoutedBoltConnection.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/RoutedBoltConnection.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl; +package org.neo4j.driver.internal.bolt.routedimpl.impl; import static java.lang.String.format; @@ -23,7 +23,6 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.AuthData; import org.neo4j.driver.internal.bolt.api.BoltConnection; @@ -48,8 +47,10 @@ import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RoutingTableHandler; -import org.neo4j.driver.internal.bolt.routedimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.RoutedBoltConnectionProvider; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.RoutingTableHandler; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FutureUtil; public class RoutedBoltConnection implements BoltConnection { private final BoltConnection delegate; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterRoutingTable.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ClusterRoutingTable.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterRoutingTable.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ClusterRoutingTable.java index 834da43880..afe398b9b9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterRoutingTable.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ClusterRoutingTable.java @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.lang.String.format; import static java.util.Arrays.asList; -import static org.neo4j.driver.internal.bolt.routedimpl.util.LockUtil.executeWithLock; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.LockUtil.executeWithLock; import java.time.Clock; import java.util.ArrayList; @@ -34,6 +34,7 @@ import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.ClusterComposition; import org.neo4j.driver.internal.bolt.api.DatabaseName; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; public class ClusterRoutingTable implements RoutingTable { private final ReadWriteLock tableLock = new ReentrantReadWriteLock(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RediscoveryImpl.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RediscoveryImpl.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RediscoveryImpl.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RediscoveryImpl.java index e4fb1c07ef..025a5d20e1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RediscoveryImpl.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RediscoveryImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.lang.String.format; import static java.util.Collections.emptySet; @@ -35,7 +35,6 @@ import java.util.function.Function; import java.util.function.Supplier; import javax.net.ssl.SSLHandshakeException; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltConnection; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; @@ -53,8 +52,12 @@ import org.neo4j.driver.internal.bolt.api.exception.BoltUnsupportedFeatureException; import org.neo4j.driver.internal.bolt.api.exception.MinVersionAcquisitionException; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; -import org.neo4j.driver.internal.bolt.routedimpl.AuthTokenManagerExecutionException; -import org.neo4j.driver.internal.bolt.routedimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.ClusterCompositionLookupResult; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; +import org.neo4j.driver.internal.bolt.routedimpl.impl.AuthTokenManagerExecutionException; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FutureUtil; public class RediscoveryImpl implements Rediscovery { private static final String NO_ROUTERS_AVAILABLE = diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ResolvedBoltServerAddress.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ResolvedBoltServerAddress.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ResolvedBoltServerAddress.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ResolvedBoltServerAddress.java index 502fb3b8ab..edb7533cb7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ResolvedBoltServerAddress.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ResolvedBoltServerAddress.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.joining; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingErrorHandler.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingErrorHandler.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingErrorHandler.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingErrorHandler.java index 4d7022a3e4..f90c8c64c9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingErrorHandler.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingErrorHandler.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandler.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandler.java similarity index 85% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandler.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandler.java index 47257a5a58..3f7131abf5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandler.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandler.java @@ -14,17 +14,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletionStage; import java.util.function.Supplier; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.SecurityPlan; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.ClusterCompositionLookupResult; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; public interface RoutingTableHandler extends RoutingErrorHandler { Set servers(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandlerImpl.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandlerImpl.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandlerImpl.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandlerImpl.java index a18bbf0075..c87e1d6164 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandlerImpl.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandlerImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.concurrent.CompletableFuture.completedFuture; @@ -27,7 +27,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; @@ -35,7 +34,11 @@ import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.bolt.routedimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.ClusterCompositionLookupResult; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FutureUtil; public class RoutingTableHandlerImpl implements RoutingTableHandler { private final RoutingTable routingTable; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistry.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistry.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistry.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistry.java index fce17248ad..24acb6462e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistry.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistry.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import java.util.Map; import java.util.Optional; @@ -22,12 +22,12 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.function.Supplier; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.SecurityPlan; +import org.neo4j.driver.internal.bolt.api.values.Value; /** * A generic interface to access all routing tables as a whole. diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistryImpl.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistryImpl.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistryImpl.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistryImpl.java index fbb360735a..663b3cef07 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistryImpl.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistryImpl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.Objects.requireNonNull; @@ -33,7 +33,6 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; @@ -42,7 +41,9 @@ import org.neo4j.driver.internal.bolt.api.DatabaseNameUtil; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.bolt.routedimpl.util.FutureUtil; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FutureUtil; public class RoutingTableRegistryImpl implements RoutingTableRegistry { private static final Supplier PENDING_DATABASE_NAME_EXCEPTION_SUPPLIER = diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategy.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategy.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategy.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategy.java index b6a14e583d..ae21fefe75 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategy.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategy.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing; import java.util.List; import java.util.function.Function; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LoadBalancingStrategy.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LoadBalancingStrategy.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LoadBalancingStrategy.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LoadBalancingStrategy.java index a80d2797fe..51a2b497c5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LoadBalancingStrategy.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LoadBalancingStrategy.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing; import java.util.List; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/RoundRobinArrayIndex.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/RoundRobinArrayIndex.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/RoundRobinArrayIndex.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/RoundRobinArrayIndex.java index f6abebcd57..4aabcb9a8b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/RoundRobinArrayIndex.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/RoundRobinArrayIndex.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing; import java.util.concurrent.atomic.AtomicInteger; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/util/FutureUtil.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/FutureUtil.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/util/FutureUtil.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/FutureUtil.java index 0bd9cfde53..aa22fd82fa 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/util/FutureUtil.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/FutureUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.util; +package org.neo4j.driver.internal.bolt.routedimpl.impl.util; import static java.util.concurrent.CompletableFuture.completedFuture; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/util/LockUtil.java b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/LockUtil.java similarity index 95% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/util/LockUtil.java rename to bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/LockUtil.java index d37c01bbd0..be205307ad 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/util/LockUtil.java +++ b/bolt-api-routed/src/main/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/LockUtil.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.util; +package org.neo4j.driver.internal.bolt.routedimpl.impl.util; import java.util.concurrent.locks.Lock; import java.util.function.Supplier; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/TestUtil.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/NoopLoggingProvider.java similarity index 57% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/TestUtil.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/NoopLoggingProvider.java index 7fc61b390c..b52187d7ce 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/util/TestUtil.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/NoopLoggingProvider.java @@ -14,18 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.util; +package org.neo4j.driver.internal.bolt.routedimpl.impl; -import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.spi.Connection; +import org.neo4j.driver.internal.bolt.api.LoggingProvider; -public class TestUtil { - public static Connection connectionMock(BoltProtocol protocol) { - var connection = mock(Connection.class); - given(connection.protocol()).willReturn(protocol); - return connection; +public class NoopLoggingProvider implements LoggingProvider { + public static final NoopLoggingProvider INSTANCE = new NoopLoggingProvider(); + + private NoopLoggingProvider() {} + + @Override + public System.Logger getLog(Class cls) { + return mock(System.Logger.class); + } + + @Override + public System.Logger getLog(String name) { + return mock(System.Logger.class); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterRoutingTableTest.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ClusterRoutingTableTest.java similarity index 90% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterRoutingTableTest.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ClusterRoutingTableTest.java index 02da61570a..4ba14bec39 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/ClusterRoutingTableTest.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/ClusterRoutingTableTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; @@ -26,14 +26,14 @@ import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.A; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.B; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.C; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.D; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.E; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.EMPTY; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.F; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.createClusterComposition; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.A; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.B; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.C; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.D; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.E; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.EMPTY; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.F; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.createClusterComposition; import java.time.Clock; import java.time.Duration; @@ -42,7 +42,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.util.FakeClock; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FakeClock; class ClusterRoutingTableTest { @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RediscoveryTest.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RediscoveryTest.java similarity index 80% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RediscoveryTest.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RediscoveryTest.java index 7164ff8f5e..f386fa7860 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RediscoveryTest.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RediscoveryTest.java @@ -14,17 +14,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.Collections.emptySet; import static java.util.Collections.singletonMap; import static java.util.concurrent.CompletableFuture.completedFuture; import static java.util.concurrent.CompletableFuture.failedFuture; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -37,13 +36,11 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.A; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.B; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.C; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.D; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.E; -import static org.neo4j.driver.testutil.TestUtil.asOrderedSet; -import static org.neo4j.driver.testutil.TestUtil.await; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.A; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.B; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.C; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.D; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.E; import java.io.IOException; import java.net.InetAddress; @@ -51,9 +48,11 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.function.Function; import org.junit.jupiter.api.Test; @@ -61,7 +60,6 @@ import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; import org.mockito.stubbing.Answer; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.BoltConnection; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; @@ -76,9 +74,11 @@ import org.neo4j.driver.internal.bolt.api.exception.BoltFailureException; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; import org.neo4j.driver.internal.bolt.api.exception.BoltUnsupportedFeatureException; -import org.neo4j.driver.internal.bolt.routedimpl.AuthTokenManagerExecutionException; -import org.neo4j.driver.internal.util.FakeClock; -import org.neo4j.driver.internal.util.ImmediateSchedulingEventExecutor; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; +import org.neo4j.driver.internal.bolt.routedimpl.impl.AuthTokenManagerExecutionException; +import org.neo4j.driver.internal.bolt.routedimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FakeClock; class RediscoveryTest { @Test @@ -94,14 +94,17 @@ void shouldUseFirstRouterInTable() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(B); - var actualComposition = await(rediscovery.lookupClusterComposition( + var actualComposition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(expectedComposition, actualComposition); @@ -123,14 +126,17 @@ void shouldSkipFailingRouters() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var actualComposition = await(rediscovery.lookupClusterComposition( + var actualComposition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(expectedComposition, actualComposition); @@ -146,7 +152,7 @@ void shouldFailImmediatelyOnAuthError() { "Wrong password", GqlStatusError.UNKNOWN.getStatus(), GqlStatusError.UNKNOWN.getStatusDescription(""), - GqlStatusError.DIAGNOSTIC_RECORD, + Collections.emptyMap(), null); Map responsesByAddress = new HashMap<>(); @@ -157,16 +163,19 @@ void shouldFailImmediatelyOnAuthError() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var error = assertThrows( - BoltFailureException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable error = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + error = error.getCause(); + assertInstanceOf(BoltFailureException.class, error); assertEquals(authError, error); verify(table).forget(A); } @@ -184,7 +193,7 @@ void shouldUseAnotherRouterOnAuthorizationExpiredException() { "message", GqlStatusError.UNKNOWN.getStatus(), GqlStatusError.UNKNOWN.getStatusDescription(""), - GqlStatusError.DIAGNOSTIC_RECORD, + Collections.emptyMap(), null)); responsesByAddress.put(B, expectedComposition); @@ -192,14 +201,17 @@ void shouldUseAnotherRouterOnAuthorizationExpiredException() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var actualComposition = await(rediscovery.lookupClusterComposition( + var actualComposition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(expectedComposition, actualComposition); @@ -220,7 +232,7 @@ void shouldFailImmediatelyOnBookmarkErrors(String code) { "Invalid", GqlStatusError.UNKNOWN.getStatus(), GqlStatusError.UNKNOWN.getStatusDescription(""), - GqlStatusError.DIAGNOSTIC_RECORD, + Collections.emptyMap(), null); Map responsesByAddress = new HashMap<>(); @@ -231,16 +243,19 @@ void shouldFailImmediatelyOnBookmarkErrors(String code) { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var actualError = assertThrows( - BoltFailureException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable actualError = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + actualError = actualError.getCause(); + assertInstanceOf(BoltFailureException.class, actualError); assertEquals(error, actualError); verify(table).forget(A); } @@ -257,16 +272,19 @@ void shouldFailImmediatelyOnClosedPoolError() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var actualError = assertThrows( - IllegalStateException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable actualError = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + actualError = actualError.getCause(); + assertInstanceOf(IllegalStateException.class, actualError); assertEquals(error, actualError); verify(table).forget(A); } @@ -287,14 +305,17 @@ void shouldFallbackToInitialRouterWhenKnownRoutersFail() { var rediscovery = newRediscovery(initialRouter, resolver); var table = routingTableMock(B, C); - var actualComposition = await(rediscovery.lookupClusterComposition( + var actualComposition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(expectedComposition, actualComposition); @@ -320,14 +341,17 @@ void shouldResolveInitialRouterAddress() { var rediscovery = newRediscovery(initialRouter, resolver); var table = routingTableMock(B, C); - var actualComposition = await(rediscovery.lookupClusterComposition( + var actualComposition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(expectedComposition, actualComposition); @@ -355,14 +379,17 @@ void shouldResolveInitialRouterAddressUsingCustomResolver() { var rediscovery = newRediscovery(A, resolver); var table = routingTableMock(B, C); - var actualComposition = await(rediscovery.lookupClusterComposition( + var actualComposition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(expectedComposition, actualComposition); @@ -386,16 +413,18 @@ void shouldPropagateFailureWhenResolverFails() { var rediscovery = newRediscovery(A, resolver); var table = routingTableMock(); - var error = assertThrows( - RuntimeException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable error = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + error = error.getCause(); assertEquals("Resolver fails!", error.getMessage()); verify(resolver).apply(A); @@ -416,21 +445,24 @@ void shouldRecordAllErrorsWhenNoRouterRespond() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var e = assertThrows( - BoltServiceUnavailableException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable e = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); - assertThat(e.getMessage(), containsString("Could not perform discovery")); - assertThat(e.getSuppressed().length, equalTo(3)); - assertThat(e.getSuppressed()[0].getCause(), equalTo(first)); - assertThat(e.getSuppressed()[1].getCause(), equalTo(second)); - assertThat(e.getSuppressed()[2].getCause(), equalTo(third)); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + e = e.getCause(); + assertInstanceOf(BoltServiceUnavailableException.class, e); + assertTrue(e.getMessage().contains("Could not perform discovery")); + assertEquals(3, e.getSuppressed().length); + assertEquals(first, e.getSuppressed()[0].getCause()); + assertEquals(second, e.getSuppressed()[1].getCause()); + assertEquals(third, e.getSuppressed()[2].getCause()); } @Test @@ -449,14 +481,17 @@ void shouldUseInitialRouterAfterDiscoveryReturnsNoWriters() { RoutingTable table = new ClusterRoutingTable(defaultDatabase(), new FakeClock()); table.update(noWritersComposition); - var composition2 = await(rediscovery.lookupClusterComposition( + var composition2 = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(validComposition, composition2); } @@ -474,14 +509,17 @@ void shouldUseInitialRouterToStartWith() { var rediscovery = newRediscovery(initialRouter, resolver); var table = routingTableMock(true, B, C, D); - var composition = await(rediscovery.lookupClusterComposition( + var composition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, Collections.emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(validComposition, composition); } @@ -502,14 +540,17 @@ void shouldUseKnownRoutersWhenInitialRouterFails() { var rediscovery = newRediscovery(initialRouter, resolver); var table = routingTableMock(true, D, E); - var composition = await(rediscovery.lookupClusterComposition( + var composition = rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, Collections.emptySet(), null, null, - new BoltProtocolVersion(4, 1))) + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join() .getClusterComposition(); assertEquals(validComposition, composition); verify(table).forget(initialRouter); @@ -522,30 +563,31 @@ void shouldNotLogWhenSingleRetryAttemptFails() { var connectionProviderGetter = connectionProviderGetter(responsesByAddress); var resolver = resolverMock(A, A); - var eventExecutor = new ImmediateSchedulingEventExecutor(); var logging = mock(LoggingProvider.class); var logger = mock(System.Logger.class); when(logging.getLog(any(Class.class))).thenReturn(logger); Rediscovery rediscovery = new RediscoveryImpl(A, resolver, logging, DefaultDomainNameResolver.getInstance()); var table = routingTableMock(A); - var e = assertThrows( - BoltServiceUnavailableException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable e = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, Collections.emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); - assertThat(e.getMessage(), containsString("Could not perform discovery")); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + e = e.getCause(); + assertInstanceOf(BoltServiceUnavailableException.class, e); + assertTrue(e.getMessage().contains("Could not perform discovery")); // rediscovery should not log about retries and should not schedule any retries verify(logging).getLog(RediscoveryImpl.class); verify(logger, never()) .log(eq(System.Logger.Level.INFO), startsWith("Unable to fetch new routing table, will try again in ")); - assertEquals(0, eventExecutor.scheduleDelays().size()); } @Test @@ -566,7 +608,7 @@ void shouldResolveToIP() throws UnknownHostException { @Test void shouldFailImmediatelyOnAuthTokenManagerExecutionException() { - var exception = new AuthTokenManagerExecutionException(mock(Throwable.class)); + var exception = new AuthTokenManagerExecutionException(new RuntimeException()); Map responsesByAddress = new HashMap<>(); responsesByAddress.put(A, new RuntimeException("Hi!")); // first router -> non-fatal failure @@ -576,16 +618,19 @@ void shouldFailImmediatelyOnAuthTokenManagerExecutionException() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var actualException = assertThrows( - AuthTokenManagerExecutionException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable actualException = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, Collections.emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + actualException = actualException.getCause(); + assertInstanceOf(AuthTokenManagerExecutionException.class, actualException); assertEquals(exception, actualException); verify(table).forget(A); } @@ -602,16 +647,19 @@ void shouldFailImmediatelyOnUnsupportedFeatureException() { var rediscovery = newRediscovery(A, Collections::singleton); var table = routingTableMock(A, B, C); - var actualException = assertThrows( - BoltUnsupportedFeatureException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable actualException = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, Collections.emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + actualException = actualException.getCause(); + assertInstanceOf(BoltUnsupportedFeatureException.class, actualException); assertEquals(exception, actualException); verify(table).forget(A); } @@ -639,16 +687,19 @@ void shouldLogScopedIPV6AddressWithStringFormattingLogger() throws UnknownHostEx var rediscovery = new RediscoveryImpl(initialRouter, resolver, logging, domainNameResolver); // WHEN & THEN - assertThrows( - BoltServiceUnavailableException.class, - () -> await(rediscovery.lookupClusterComposition( + Throwable e = assertThrows(CompletionException.class, () -> rediscovery + .lookupClusterComposition( SecurityPlan.INSECURE, table, connectionProviderGetter, Collections.emptySet(), null, null, - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); + e = e.getCause(); + assertInstanceOf(BoltServiceUnavailableException.class, e); } private Rediscovery newRediscovery( @@ -717,4 +768,10 @@ private static RoutingTable routingTableMock(boolean preferInitialRouter, BoltSe when(routingTable.preferInitialRouter()).thenReturn(preferInitialRouter); return routingTable; } + + @SafeVarargs + @SuppressWarnings("varargs") + public static Set asOrderedSet(T... elements) { + return new LinkedHashSet<>(Arrays.asList(elements)); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandlerTest.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandlerTest.java similarity index 82% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandlerTest.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandlerTest.java index d3684bdc58..d110ece10b 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableHandlerTest.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableHandlerTest.java @@ -14,12 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.Arrays.asList; import static java.util.Collections.emptySet; import static java.util.Collections.singletonList; import static java.util.concurrent.CompletableFuture.completedFuture; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -31,20 +32,18 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.internal.RoutingSettings.STALE_ROUTING_TABLE_PURGE_DELAY_MS; import static org.neo4j.driver.internal.bolt.api.AccessMode.READ; import static org.neo4j.driver.internal.bolt.api.AccessMode.WRITE; import static org.neo4j.driver.internal.bolt.api.BoltServerAddress.LOCAL_DEFAULT; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.A; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.B; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.C; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.D; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.E; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.F; -import static org.neo4j.driver.testutil.TestUtil.asOrderedSet; -import static org.neo4j.driver.testutil.TestUtil.await; - +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.A; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.B; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.C; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.D; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.E; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.F; + +import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Map; @@ -58,9 +57,6 @@ import java.util.function.Supplier; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.neo4j.driver.Value; -import org.neo4j.driver.exceptions.ServiceUnavailableException; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltConnection; import org.neo4j.driver.internal.bolt.api.BoltConnectionProvider; @@ -69,9 +65,17 @@ import org.neo4j.driver.internal.bolt.api.ClusterComposition; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.SecurityPlan; -import org.neo4j.driver.internal.util.FakeClock; +import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.ClusterCompositionLookupResult; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; +import org.neo4j.driver.internal.bolt.routedimpl.impl.NoopLoggingProvider; +import org.neo4j.driver.internal.bolt.routedimpl.impl.util.FakeClock; class RoutingTableHandlerTest { + public static final long STALE_ROUTING_TABLE_PURGE_DELAY_MS = SECONDS.toMillis(30); + @Test void shouldRemoveAddressFromRoutingTableOnConnectionFailure() { RoutingTable routingTable = new ClusterRoutingTable(defaultDatabase(), new FakeClock()); @@ -115,12 +119,14 @@ void acquireShouldUpdateRoutingTableWhenKnownRoutingTableIsStale() { .thenReturn(completedFuture(new ClusterCompositionLookupResult(clusterComposition))); var handler = newRoutingTableHandler(routingTable, rediscovery, connectionPool); - assertNotNull(await(handler.ensureRoutingTable( - SecurityPlan.INSECURE, - READ, - Collections.emptySet(), - () -> CompletableFuture.completedStage(Collections.emptyMap()), - new BoltProtocolVersion(4, 1)))); + assertNotNull(handler.ensureRoutingTable( + SecurityPlan.INSECURE, + READ, + Collections.emptySet(), + () -> CompletableFuture.completedStage(Collections.emptyMap()), + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); verify(rediscovery) .lookupClusterComposition(any(), eq(routingTable), eq(connectionPool), any(), any(), any(), any()); @@ -201,12 +207,14 @@ public Optional getRoutingTableHandler(DatabaseName databas var handler = newRoutingTableHandler(routingTable, rediscovery, connectionPool, registry, addressesToRetainRef::set); - var actual = await(handler.ensureRoutingTable( - SecurityPlan.INSECURE, - READ, - Collections.emptySet(), - () -> CompletableFuture.completedStage(Collections.emptyMap()), - new BoltProtocolVersion(4, 1))); + var actual = handler.ensureRoutingTable( + SecurityPlan.INSECURE, + READ, + Collections.emptySet(), + () -> CompletableFuture.completedStage(Collections.emptyMap()), + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join(); assertEquals(routingTable, actual); assertEquals(Set.of(A, B, C), addressesToRetainRef.get()); @@ -226,14 +234,14 @@ void shouldRemoveRoutingTableHandlerIfFailedToLookup() { // When var handler = newRoutingTableHandler(routingTable, rediscovery, connectionPool, registry); - assertThrows( - RuntimeException.class, - () -> await(handler.ensureRoutingTable( + assertThrows(RuntimeException.class, () -> handler.ensureRoutingTable( SecurityPlan.INSECURE, READ, Collections.emptySet(), () -> CompletableFuture.completedStage(Collections.emptyMap()), - new BoltProtocolVersion(4, 1)))); + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); // Then verify(registry).remove(defaultDatabase()); @@ -252,12 +260,14 @@ private void testRediscoveryWhenStale(AccessMode mode) { var rediscovery = newRediscoveryMock(); var handler = newRoutingTableHandler(routingTable, rediscovery, connectionProviderGetter); - var actual = await(handler.ensureRoutingTable( - SecurityPlan.INSECURE, - mode, - Collections.emptySet(), - () -> CompletableFuture.completedStage(Collections.emptyMap()), - new BoltProtocolVersion(4, 1))); + var actual = handler.ensureRoutingTable( + SecurityPlan.INSECURE, + mode, + Collections.emptySet(), + () -> CompletableFuture.completedStage(Collections.emptyMap()), + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join(); assertEquals(routingTable, actual); verify(routingTable).isStaleFor(mode); @@ -280,12 +290,14 @@ private void testNoRediscoveryWhenNotStale(AccessMode staleMode, AccessMode notS var handler = newRoutingTableHandler(routingTable, rediscovery, connectionProviderGetter); - assertNotNull(await(handler.ensureRoutingTable( - SecurityPlan.INSECURE, - notStaleMode, - Collections.emptySet(), - () -> CompletableFuture.completedStage(Collections.emptyMap()), - new BoltProtocolVersion(4, 1)))); + assertNotNull(handler.ensureRoutingTable( + SecurityPlan.INSECURE, + notStaleMode, + Collections.emptySet(), + () -> CompletableFuture.completedStage(Collections.emptyMap()), + new BoltProtocolVersion(4, 1)) + .toCompletableFuture() + .join()); verify(routingTable).isStaleFor(notStaleMode); verify(rediscovery, never()) .lookupClusterComposition( @@ -330,7 +342,7 @@ private static Function newConnection if (unavailableAddresses.contains(requestedAddress)) { given(boltConnectionProvider.connect(any(), any(), any(), any(), any(), any(), any(), any(), any())) .willReturn(CompletableFuture.failedFuture( - new ServiceUnavailableException(requestedAddress + " is unavailable!"))); + new BoltServiceUnavailableException(requestedAddress + " is unavailable!"))); return boltConnectionProvider; } var connection = mock(BoltConnection.class); @@ -379,4 +391,10 @@ private static RoutingTableHandler newRoutingTableHandler( STALE_ROUTING_TABLE_PURGE_DELAY_MS, addressesToRetainConsumer); } + + @SafeVarargs + @SuppressWarnings("varargs") + public static Set asOrderedSet(T... elements) { + return new LinkedHashSet<>(Arrays.asList(elements)); + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistryImplTest.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistryImplTest.java similarity index 88% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistryImplTest.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistryImplTest.java index 3236fe46e8..39cf33b8ca 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/RoutingTableRegistryImplTest.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/RoutingTableRegistryImplTest.java @@ -14,14 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster; import static java.util.concurrent.CompletableFuture.completedFuture; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.equalTo; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -30,22 +26,22 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.neo4j.driver.internal.RoutingSettings.STALE_ROUTING_TABLE_PURGE_DELAY_MS; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.SYSTEM_DATABASE_NAME; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.database; import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.A; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.B; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.C; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.D; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.E; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.F; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.A; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.B; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.C; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.D; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.E; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.F; import java.time.Clock; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ConcurrentHashMap; @@ -56,15 +52,19 @@ import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.SecurityPlan; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; +import org.neo4j.driver.internal.bolt.routedimpl.RoutingTable; +import org.neo4j.driver.internal.bolt.routedimpl.impl.NoopLoggingProvider; class RoutingTableRegistryImplTest { + public static final long STALE_ROUTING_TABLE_PURGE_DELAY_MS = SECONDS.toMillis(30); + @Test void factoryShouldCreateARoutingTableWithSameDatabaseName() { var clock = Clock.systemUTC(); @@ -79,11 +79,11 @@ void factoryShouldCreateARoutingTableWithSameDatabaseName() { var handler = factory.newInstance(database("Molly"), null); var table = handler.routingTable(); - assertThat(table.database().description(), equalTo("Molly")); + assertEquals("Molly", table.database().description()); - assertThat(table.routers().size(), equalTo(0)); - assertThat(table.readers().size(), equalTo(0)); - assertThat(table.writers().size(), equalTo(0)); + assertEquals(0, table.routers().size()); + assertEquals(0, table.readers().size()); + assertEquals(0, table.writers().size()); assertTrue(table.isStaleFor(AccessMode.READ)); assertTrue(table.isStaleFor(AccessMode.WRITE)); @@ -202,7 +202,7 @@ void shouldReturnServersInAllRoutingTables() { var servers = routingTables.allServers(); // Then - assertThat(servers, containsInAnyOrder(A, B, C, D, E, F)); + assertEquals(Set.of(A, B, C, D, E, F), servers); } @Test @@ -220,7 +220,7 @@ void shouldRemoveRoutingTableHandler() { routingTables.remove(database("Apple")); routingTables.remove(database("Banana")); // Then - assertThat(routingTables.allServers(), contains(C)); + assertTrue(routingTables.allServers().contains(C)); } @Test @@ -236,7 +236,7 @@ void shouldRemoveStaleRoutingTableHandlers() { // When routingTables.removeAged(); // Then - assertThat(routingTables.allServers(), empty()); + assertTrue(routingTables.allServers().isEmpty()); } @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategyTest.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategyTest.java similarity index 96% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategyTest.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategyTest.java index 6a26d11d19..05d0c41ba5 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategyTest.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/LeastConnectedLoadBalancingStrategyTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -26,7 +26,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.openMocks; -import static org.neo4j.driver.internal.bolt.api.util.ClusterCompositionUtil.A; +import static org.neo4j.driver.internal.bolt.routedimpl.impl.util.ClusterCompositionUtil.A; import java.util.Arrays; import java.util.Collections; @@ -34,9 +34,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.LoggingProvider; +import org.neo4j.driver.internal.bolt.routedimpl.impl.NoopLoggingProvider; class LeastConnectedLoadBalancingStrategyTest { @Mock diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/RoundRobinArrayIndexTest.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/RoundRobinArrayIndexTest.java similarity index 96% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/RoundRobinArrayIndexTest.java rename to bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/RoundRobinArrayIndexTest.java index 6dbceef1bc..e06da1ab98 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/cluster/loadbalancing/RoundRobinArrayIndexTest.java +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/cluster/loadbalancing/RoundRobinArrayIndexTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.routedimpl.cluster.loadbalancing; +package org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.loadbalancing; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/ClusterCompositionUtil.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/ClusterCompositionUtil.java new file mode 100644 index 0000000000..fda67a9625 --- /dev/null +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/ClusterCompositionUtil.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.routedimpl.impl.util; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import org.neo4j.driver.internal.bolt.api.BoltServerAddress; +import org.neo4j.driver.internal.bolt.api.ClusterComposition; + +public final class ClusterCompositionUtil { + private ClusterCompositionUtil() {} + + public static final long NEVER_EXPIRE = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(1); + + public static final BoltServerAddress A = new BoltServerAddress("192.168.100.100:11"); + public static final BoltServerAddress B = new BoltServerAddress("192.168.100.101:22"); + public static final BoltServerAddress C = new BoltServerAddress("192.168.100.102:33"); + public static final BoltServerAddress D = new BoltServerAddress("192.168.100.103:44"); + public static final BoltServerAddress E = new BoltServerAddress("192.168.100.104:55"); + public static final BoltServerAddress F = new BoltServerAddress("192.168.100.105:66"); + + public static final List EMPTY = new ArrayList<>(); + + @SafeVarargs + public static ClusterComposition createClusterComposition(List... servers) { + return createClusterComposition(NEVER_EXPIRE, servers); + } + + @SafeVarargs + @SuppressWarnings("fallthrough") + public static ClusterComposition createClusterComposition( + long expirationTimestamp, List... servers) { + Set routers = new LinkedHashSet<>(); + Set writers = new LinkedHashSet<>(); + Set readers = new LinkedHashSet<>(); + + switch (servers.length) { + case 3: + readers.addAll(servers[2]); + // no break on purpose + case 2: + writers.addAll(servers[1]); + // no break on purpose + case 1: + routers.addAll(servers[0]); + } + return new ClusterComposition(expirationTimestamp, readers, writers, routers, null); + } +} diff --git a/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/FakeClock.java b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/FakeClock.java new file mode 100644 index 0000000000..df250f46a8 --- /dev/null +++ b/bolt-api-routed/src/test/java/org/neo4j/driver/internal/bolt/routedimpl/impl/util/FakeClock.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.routedimpl.impl.util; + +import java.time.Clock; +import java.time.Instant; +import java.time.ZoneId; +import java.util.concurrent.atomic.AtomicLong; + +public class FakeClock extends Clock { + private final AtomicLong timestamp = new AtomicLong(); + + @Override + public ZoneId getZone() { + throw new UnsupportedOperationException(); + } + + @Override + public Clock withZone(ZoneId zone) { + throw new UnsupportedOperationException(); + } + + @Override + public Instant instant() { + return Instant.ofEpochMilli(timestamp.get()); + } + + public void progress(long millis) { + if (millis < 0) { + throw new IllegalArgumentException("time can only progress forwards"); + } + timestamp.addAndGet(millis); + } +} diff --git a/bolt-api-test-values/LICENSES.txt b/bolt-api-test-values/LICENSES.txt new file mode 100644 index 0000000000..f8e0fd3292 --- /dev/null +++ b/bolt-api-test-values/LICENSES.txt @@ -0,0 +1,5 @@ +This file contains the full license text of the included third party +libraries. For an overview of the licenses see the NOTICE.txt file. + + + diff --git a/bolt-api-test-values/NOTICE.txt b/bolt-api-test-values/NOTICE.txt new file mode 100644 index 0000000000..c3bf48c6fc --- /dev/null +++ b/bolt-api-test-values/NOTICE.txt @@ -0,0 +1,20 @@ +Copyright (c) "Neo4j" +Neo4j Sweden AB [https://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. + +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. + +Full license texts are found in LICENSES.txt. + + +Third-party licenses +-------------------- + diff --git a/bolt-api-test-values/pom.xml b/bolt-api-test-values/pom.xml new file mode 100644 index 0000000000..3bfd41b241 --- /dev/null +++ b/bolt-api-test-values/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + + + org.neo4j.driver + neo4j-java-driver-parent + 5.27-SNAPSHOT + + + neo4j-bolt-api-test-values + + jar + Neo4j Bolt API + https://github.com/neo4j/neo4j-java-driver + + + ${project.basedir}/.. + ,-try + + + + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + + + + org.mockito + mockito-core + + + org.junit.jupiter + junit-jupiter + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire.and.failsafe.version} + + + + + + + + scm:git:git://github.com/neo4j/neo4j-java-driver.git + scm:git:git@github.com:neo4j/neo4j-java-driver.git + https://github.com/neo4j/neo4j-java-driver + + + diff --git a/bolt-api-test-values/src/main/java/module-info.java b/bolt-api-test-values/src/main/java/module-info.java new file mode 100644 index 0000000000..7a8207ce82 --- /dev/null +++ b/bolt-api-test-values/src/main/java/module-info.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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. + */ +module org.neo4j.bolt.netty.test.values { + requires transitive org.neo4j.bolt.api; +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestNode.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestNode.java new file mode 100644 index 0000000000..80a58ae74b --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestNode.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values; + +import org.neo4j.bolt.api.test.values.impl.Entity; +import org.neo4j.driver.internal.bolt.api.values.Node; + +public interface TestNode extends Entity, Node { + + Iterable labels(); + + boolean hasLabel(String label); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestPath.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestPath.java new file mode 100644 index 0000000000..88dd1a472e --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestPath.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values; + +import org.neo4j.driver.internal.bolt.api.values.Path; +import org.neo4j.driver.internal.bolt.api.values.Segment; + +public interface TestPath extends Iterable, Path { + interface TestSegment extends Segment { + TestRelationship relationship(); + + TestNode start(); + + TestNode end(); + } + + TestNode start(); + + TestNode end(); + + int length(); + + boolean contains(TestNode node); + + boolean contains(TestRelationship relationship); + + Iterable nodes(); + + Iterable relationships(); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestRelationship.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestRelationship.java new file mode 100644 index 0000000000..8c5614a893 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestRelationship.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values; + +import org.neo4j.bolt.api.test.values.impl.Entity; +import org.neo4j.driver.internal.bolt.api.values.Relationship; + +public interface TestRelationship extends Entity, Relationship { + + long startNodeId(); + + String startNodeElementId(); + + long endNodeId(); + + String endNodeElementId(); + + String typeString(); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestValue.java new file mode 100644 index 0000000000..429b0e4961 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestValue.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values; + +import org.neo4j.bolt.api.test.values.impl.AsValue; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public interface TestValue extends Value, AsValue { + TestNode asNode(); + + TestRelationship asRelationship(); + + TestPath asPath(); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestValueFactory.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestValueFactory.java new file mode 100644 index 0000000000..e639669cc4 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/TestValueFactory.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values; + +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; + +import java.time.DateTimeException; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.neo4j.bolt.api.test.values.impl.InternalNode; +import org.neo4j.bolt.api.test.values.impl.InternalPath; +import org.neo4j.bolt.api.test.values.impl.InternalRelationship; +import org.neo4j.bolt.api.test.values.impl.NodeValue; +import org.neo4j.bolt.api.test.values.impl.PathValue; +import org.neo4j.bolt.api.test.values.impl.RelationshipValue; +import org.neo4j.bolt.api.test.values.impl.UnsupportedDateTimeValue; +import org.neo4j.driver.internal.bolt.api.values.Node; +import org.neo4j.driver.internal.bolt.api.values.Path; +import org.neo4j.driver.internal.bolt.api.values.Relationship; +import org.neo4j.driver.internal.bolt.api.values.Segment; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; + +public class TestValueFactory implements ValueFactory { + public static final TestValueFactory INSTANCE = new TestValueFactory(); + + private TestValueFactory() {} + + @Override + public Value value(Object value) { + return Values.value(value); + } + + @Override + public Node node(long id, String elementId, Collection labels, Map properties) { + return new InternalNode(id, elementId, labels, properties); + } + + @Override + public Relationship relationship( + long id, + String elementId, + long start, + String startElementId, + long end, + String endElementId, + String type, + Map properties) { + return new InternalRelationship(id, elementId, start, startElementId, end, endElementId, type, properties); + } + + @Override + public Segment segment(Node start, Relationship relationship, Node end) { + return new InternalPath.SelfContainedSegment((TestNode) start, (TestRelationship) relationship, (TestNode) end); + } + + @Override + public Path path(List segments, List nodes, List relationships) { + return new InternalPath( + segments.stream().map(TestPath.TestSegment.class::cast).toList(), + nodes.stream().map(TestNode.class::cast).toList(), + relationships.stream().map(TestRelationship.class::cast).toList()); + } + + @Override + public Value isoDuration(long months, long days, long seconds, int nanoseconds) { + return Values.isoDuration(months, days, seconds, nanoseconds); + } + + @Override + public Value point(int srid, double x, double y) { + return Values.point(srid, x, y); + } + + @Override + public Value point(int srid, double x, double y, double z) { + return Values.point(srid, x, y, z); + } + + @Override + public Value unsupportedDateTimeValue(DateTimeException e) { + return new UnsupportedDateTimeValue(e); + } + + public Value emptyNodeValue() { + return new NodeValue(new InternalNode(1234, singletonList("User"), new HashMap<>())); + } + + public Value filledNodeValue() { + return new NodeValue(new InternalNode(1234, singletonList("User"), singletonMap("name", value("Dodo")))); + } + + public Value emptyRelationshipValue() { + return new RelationshipValue(new InternalRelationship(1234, 1, 2, "KNOWS")); + } + + public Value filledRelationshipValue() { + return new RelationshipValue( + new InternalRelationship(1234, 1, 2, "KNOWS", singletonMap("name", value("Dodo")))); + } + + public Value filledPathValue() { + return new PathValue(new InternalPath( + new InternalNode(42L), new InternalRelationship(43L, 42L, 44L, "T"), new InternalNode(44L))); + } + + public Value emptyPathValue() { + return new PathValue(new InternalPath(new InternalNode(1))); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/Values.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/Values.java new file mode 100644 index 0000000000..9a2f740ec3 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/Values.java @@ -0,0 +1,579 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values; + +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Period; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import org.neo4j.bolt.api.test.values.impl.AsValue; +import org.neo4j.bolt.api.test.values.impl.BooleanValue; +import org.neo4j.bolt.api.test.values.impl.BytesValue; +import org.neo4j.bolt.api.test.values.impl.DateTimeValue; +import org.neo4j.bolt.api.test.values.impl.DateValue; +import org.neo4j.bolt.api.test.values.impl.DurationValue; +import org.neo4j.bolt.api.test.values.impl.FloatValue; +import org.neo4j.bolt.api.test.values.impl.IntegerValue; +import org.neo4j.bolt.api.test.values.impl.InternalIsoDuration; +import org.neo4j.bolt.api.test.values.impl.InternalPoint2D; +import org.neo4j.bolt.api.test.values.impl.InternalPoint3D; +import org.neo4j.bolt.api.test.values.impl.ListValue; +import org.neo4j.bolt.api.test.values.impl.LocalDateTimeValue; +import org.neo4j.bolt.api.test.values.impl.LocalTimeValue; +import org.neo4j.bolt.api.test.values.impl.MapValue; +import org.neo4j.bolt.api.test.values.impl.NullValue; +import org.neo4j.bolt.api.test.values.impl.PointValue; +import org.neo4j.bolt.api.test.values.impl.StringValue; +import org.neo4j.bolt.api.test.values.impl.TimeValue; +import org.neo4j.driver.internal.bolt.api.values.IsoDuration; +import org.neo4j.driver.internal.bolt.api.values.Point; +import org.neo4j.driver.internal.bolt.api.values.Value; + +final class Values { + public static final Value EmptyMap = value(Collections.emptyMap()); + + private Values() { + throw new UnsupportedOperationException(); + } + + /** + * Returns a value from object. + * + * @param value the object value + * @return the array of values + */ + @SuppressWarnings("unchecked") + public static Value value(Object value) { + if (value == null) { + return NullValue.NULL; + } + + if (value instanceof AsValue) { + return ((AsValue) value).asValue(); + } + if (value instanceof Boolean) { + return value((boolean) value); + } + if (value instanceof String) { + return value((String) value); + } + if (value instanceof Character) { + return value((char) value); + } + if (value instanceof Long) { + return value((long) value); + } + if (value instanceof Short) { + return value((short) value); + } + if (value instanceof Byte) { + return value((byte) value); + } + if (value instanceof Integer) { + return value((int) value); + } + if (value instanceof Double) { + return value((double) value); + } + if (value instanceof Float) { + return value((float) value); + } + if (value instanceof LocalDate) { + return value((LocalDate) value); + } + if (value instanceof OffsetTime) { + return value((OffsetTime) value); + } + if (value instanceof LocalTime) { + return value((LocalTime) value); + } + if (value instanceof LocalDateTime) { + return value((LocalDateTime) value); + } + if (value instanceof OffsetDateTime) { + return value((OffsetDateTime) value); + } + if (value instanceof ZonedDateTime) { + return value((ZonedDateTime) value); + } + if (value instanceof IsoDuration) { + return value((IsoDuration) value); + } + if (value instanceof Period) { + return value((Period) value); + } + if (value instanceof Duration) { + return value((Duration) value); + } + if (value instanceof Point) { + return value((Point) value); + } + + if (value instanceof List) { + return value((List) value); + } + if (value instanceof Map) { + return value((Map) value); + } + if (value instanceof Iterable) { + return value((Iterable) value); + } + if (value instanceof Iterator) { + return value((Iterator) value); + } + if (value instanceof Stream) { + return value((Stream) value); + } + + if (value instanceof char[]) { + return value((char[]) value); + } + if (value instanceof byte[]) { + return value((byte[]) value); + } + if (value instanceof boolean[]) { + return value((boolean[]) value); + } + if (value instanceof String[]) { + return value((String[]) value); + } + if (value instanceof long[]) { + return value((long[]) value); + } + if (value instanceof int[]) { + return value((int[]) value); + } + if (value instanceof short[]) { + return value((short[]) value); + } + if (value instanceof double[]) { + return value((double[]) value); + } + if (value instanceof float[]) { + return value((float[]) value); + } + if (value instanceof Value[]) { + return value((Value[]) value); + } + if (value instanceof Object[]) { + return value(Arrays.asList((Object[]) value)); + } + + throw new IllegalArgumentException( + "Unsupported value type: " + value.getClass().getName()); + } + + /** + * Returns an array of values from object vararg. + * + * @param input the object value(s) + * @return the array of values + */ + public static Value[] values(final Object... input) { + return Arrays.stream(input).map(Values::value).toArray(Value[]::new); + } + + /** + * Returns a value from value vararg. + * + * @param input the value(s) + * @return the value + */ + public static Value value(Value... input) { + var size = input.length; + var values = new Value[size]; + System.arraycopy(input, 0, values, 0, size); + return new ListValue(values); + } + + /** + * Returns a value from byte vararg. + * + * @param input the byte value(s) + * @return the value + */ + public static Value value(byte... input) { + return new BytesValue(input); + } + + /** + * Returns a value from string vararg. + * + * @param input the string value(s) + * @return the value + */ + public static Value value(String... input) { + var values = Arrays.stream(input).map(StringValue::new).toArray(StringValue[]::new); + return new ListValue(values); + } + + /** + * Returns a value from boolean vararg. + * + * @param input the boolean value(s) + * @return the value + */ + public static Value value(boolean... input) { + var values = + IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from char vararg. + * + * @param input the char value(s) + * @return the value + */ + public static Value value(char... input) { + var values = + IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from long vararg. + * + * @param input the long value(s) + * @return the value + */ + public static Value value(long... input) { + var values = Arrays.stream(input).mapToObj(Values::value).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from short vararg. + * + * @param input the short value(s) + * @return the value + */ + public static Value value(short... input) { + var values = + IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from int vararg. + * + * @param input the int value(s) + * @return the value + */ + public static Value value(int... input) { + var values = Arrays.stream(input).mapToObj(Values::value).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from double vararg. + * + * @param input the double value(s) + * @return the value + */ + public static Value value(double... input) { + var values = Arrays.stream(input).mapToObj(Values::value).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from float vararg. + * + * @param input the float value(s) + * @return the value + */ + public static Value value(float... input) { + var values = + IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from list of objects. + * + * @param vals the list of objects + * @return the value + */ + public static Value value(List vals) { + var values = new Value[vals.size()]; + var i = 0; + for (var val : vals) { + values[i++] = value(val); + } + return new ListValue(values); + } + + /** + * Returns a value from iterable of objects. + * + * @param val the iterable of objects + * @return the value + */ + public static Value value(Iterable val) { + return value(val.iterator()); + } + + /** + * Returns a value from iterator of objects. + * + * @param val the iterator of objects + * @return the value + */ + public static Value value(Iterator val) { + List values = new ArrayList<>(); + while (val.hasNext()) { + values.add(value(val.next())); + } + return new ListValue(values.toArray(new Value[0])); + } + + /** + * Returns a value from stream of objects. + * + * @param stream the stream of objects + * @return the value + */ + public static Value value(Stream stream) { + var values = stream.map(Values::value).toArray(Value[]::new); + return new ListValue(values); + } + + /** + * Returns a value from char. + * + * @param val the char value + * @return the value + */ + public static Value value(final char val) { + return new StringValue(String.valueOf(val)); + } + + /** + * Returns a value from string. + * + * @param val the string value + * @return the value + */ + public static Value value(final String val) { + return new StringValue(val); + } + + /** + * Returns a value from long. + * + * @param val the long value + * @return the value + */ + public static Value value(final long val) { + return new IntegerValue(val); + } + + /** + * Returns a value from int. + * + * @param val the int value + * @return the value + */ + public static Value value(final int val) { + return new IntegerValue(val); + } + + /** + * Returns a value from double. + * + * @param val the double value + * @return the value + */ + public static Value value(final double val) { + return new FloatValue(val); + } + + /** + * Returns a value from boolean. + * + * @param val the boolean value + * @return the value + */ + public static Value value(final boolean val) { + return BooleanValue.fromBoolean(val); + } + + /** + * Returns a value from string to object map. + * + * @param val the string to object map + * @return the value + */ + public static Value value(final Map val) { + Map asValues = new HashMap<>(val.size()); + for (var entry : val.entrySet()) { + asValues.put(entry.getKey(), value(entry.getValue())); + } + return new MapValue(asValues); + } + + /** + * Returns a value from local date. + * + * @param localDate the local date value + * @return the value + */ + public static Value value(LocalDate localDate) { + return new DateValue(localDate); + } + + /** + * Returns a value from offset time. + * + * @param offsetTime the offset time value + * @return the value + */ + public static Value value(OffsetTime offsetTime) { + return new TimeValue(offsetTime); + } + + /** + * Returns a value from local time. + * + * @param localTime the local time value + * @return the value + */ + public static Value value(LocalTime localTime) { + return new LocalTimeValue(localTime); + } + + /** + * Returns a value from local date time. + * + * @param localDateTime the local date time value + * @return the value + */ + public static Value value(LocalDateTime localDateTime) { + return new LocalDateTimeValue(localDateTime); + } + + /** + * Returns a value from offset date time. + * + * @param offsetDateTime the offset date time value + * @return the value + */ + public static Value value(OffsetDateTime offsetDateTime) { + return new DateTimeValue(offsetDateTime.toZonedDateTime()); + } + + /** + * Returns a value from zoned date time. + * + * @param zonedDateTime the zoned date time value + * @return the value + */ + public static Value value(ZonedDateTime zonedDateTime) { + return new DateTimeValue(zonedDateTime); + } + + /** + * Returns a value from period. + * + * @param period the period value + * @return the value + */ + public static Value value(Period period) { + return value(new InternalIsoDuration(period)); + } + + /** + * Returns a value from duration. + * + * @param duration the duration value + * @return the value + */ + public static Value value(Duration duration) { + return value(new InternalIsoDuration(duration)); + } + + /** + * Returns a value from month, day, seconds and nanoseconds values. + * + * @param months the month value + * @param days the day value + * @param seconds the seconds value + * @param nanoseconds the nanoseconds value + * @return the value + */ + public static Value isoDuration(long months, long days, long seconds, int nanoseconds) { + return value(new InternalIsoDuration(months, days, seconds, nanoseconds)); + } + + /** + * Returns a value from ISO duration. + * + * @param duration the ISO duration value + * @return the value + */ + private static Value value(IsoDuration duration) { + return new DurationValue(duration); + } + + /** + * Returns a value from SRID, x and y values. + * + * @param srid the SRID value + * @param x the x value + * @param y the y value + * @return the value + */ + public static Value point(int srid, double x, double y) { + return value(new InternalPoint2D(srid, x, y)); + } + + /** + * Returns a value from point. + * + * @param point the point value + * @return the value + */ + private static Value value(Point point) { + return new PointValue(point); + } + + /** + * Returns a value from SRID, x ,y and z values. + * + * @param srid the SRID value + * @param x the x value + * @param y the y value + * @param z the z value + * @return the value + */ + public static Value point(int srid, double x, double y, double z) { + return value(new InternalPoint3D(srid, x, y, z)); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/AsValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/AsValue.java new file mode 100644 index 0000000000..003eb35457 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/AsValue.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Value; + +public interface AsValue { + Value asValue(); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/BooleanValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/BooleanValue.java new file mode 100644 index 0000000000..a349ed2c9f --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/BooleanValue.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Type; + +public abstract class BooleanValue extends ValueAdapter { + private BooleanValue() { + // do nothing + } + + public static final BooleanValue TRUE = new TrueValue(); + public static final BooleanValue FALSE = new FalseValue(); + + public static BooleanValue fromBoolean(boolean value) { + return value ? TRUE : FALSE; + } + + @Override + public Type type() { + return Type.BOOLEAN; + } + + @Override + public int hashCode() { + var value = asBoolean() ? Boolean.TRUE : Boolean.FALSE; + return value.hashCode(); + } + + private static class TrueValue extends BooleanValue { + @Override + public boolean asBoolean() { + return true; + } + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override + public boolean equals(Object obj) { + return obj == TRUE; + } + + @Override + public String toString() { + return "TRUE"; + } + } + + private static class FalseValue extends BooleanValue { + @Override + public boolean asBoolean() { + return false; + } + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override + public boolean equals(Object obj) { + return obj == FALSE; + } + + @Override + public String toString() { + return "FALSE"; + } + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/BytesValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/BytesValue.java new file mode 100644 index 0000000000..3f2c4f22cd --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/BytesValue.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Arrays; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class BytesValue extends ValueAdapter { + private final byte[] val; + + public BytesValue(byte[] val) { + if (val == null) { + throw new IllegalArgumentException("Cannot construct BytesValue from null"); + } + this.val = val; + } + + @Override + public boolean isEmpty() { + return val.length == 0; + } + + @Override + public int size() { + return val.length; + } + + @Override + public byte[] asByteArray() { + return val; + } + + @Override + public Type type() { + return Type.BYTES; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var values = (BytesValue) o; + return Arrays.equals(val, values.val); + } + + @Override + public int hashCode() { + return Arrays.hashCode(val); + } + + @Override + public String toString() { + var s = new StringBuilder("#"); + for (var b : val) { + if (b < 0x10) { + s.append('0'); + } + s.append(Integer.toHexString(b)); + } + return s.toString(); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DateTimeValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DateTimeValue.java new file mode 100644 index 0000000000..32f054a52c --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DateTimeValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.time.ZonedDateTime; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class DateTimeValue extends ObjectValueAdapter { + public DateTimeValue(ZonedDateTime zonedDateTime) { + super(zonedDateTime); + } + + @Override + public ZonedDateTime asZonedDateTime() { + return asObject(); + } + + @Override + public Type type() { + return Type.DATE_TIME; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DateValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DateValue.java new file mode 100644 index 0000000000..f147b668f0 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DateValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.time.LocalDate; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class DateValue extends ObjectValueAdapter { + public DateValue(LocalDate date) { + super(date); + } + + @Override + public LocalDate asLocalDate() { + return asObject(); + } + + @Override + public Type type() { + return Type.DATE; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DurationValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DurationValue.java new file mode 100644 index 0000000000..bf683eec4b --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/DurationValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.IsoDuration; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class DurationValue extends ObjectValueAdapter { + public DurationValue(IsoDuration duration) { + super(duration); + } + + @Override + public IsoDuration asIsoDuration() { + return asObject(); + } + + @Override + public Type type() { + return Type.DURATION; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Entity.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Entity.java new file mode 100644 index 0000000000..ad241ef4ed --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Entity.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Map; +import java.util.function.Function; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public interface Entity { + + long id(); + + String elementId(); + + Iterable keys(); + + Value get(String key); + + int size(); + + Map asMap(Function mapFunction); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/EntityValueAdapter.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/EntityValueAdapter.java new file mode 100644 index 0000000000..88f97762eb --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/EntityValueAdapter.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Map; +import java.util.function.Function; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public abstract class EntityValueAdapter extends ObjectValueAdapter { + protected EntityValueAdapter(V adapted) { + super(adapted); + } + + public V asEntity() { + return asObject(); + } + + @Override + public Map asMap(Function mapFunction) { + return asEntity().asMap(mapFunction); + } + + @Override + public int size() { + return asEntity().size(); + } + + @Override + public Iterable keys() { + return asEntity().keys(); + } + + @Override + public Value get(String key) { + return asEntity().get(key); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Extract.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Extract.java new file mode 100644 index 0000000000..5ce5f50efb --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Extract.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonMap; +import static java.util.Collections.unmodifiableMap; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Function; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public final class Extract { + private Extract() { + throw new UnsupportedOperationException(); + } + + public static Map map(Map data, Function mapFunction) { + if (data.isEmpty()) { + return emptyMap(); + } else { + var size = data.size(); + if (size == 1) { + var head = data.entrySet().iterator().next(); + return singletonMap(head.getKey(), mapFunction.apply(head.getValue())); + } else { + Map map = new LinkedHashMap<>(size); + for (var entry : data.entrySet()) { + map.put(entry.getKey(), mapFunction.apply(entry.getValue())); + } + return unmodifiableMap(map); + } + } + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/FloatValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/FloatValue.java new file mode 100644 index 0000000000..50ad171aa8 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/FloatValue.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class FloatValue extends NumberValueAdapter { + private final double val; + + public FloatValue(double val) { + this.val = val; + } + + @Override + public Type type() { + return Type.FLOAT; + } + + @Override + public Double asNumber() { + return val; + } + + @Override + public long asLong() { + var longVal = (long) val; + if ((double) longVal != val) { + throw new LossyCoercion(type().name(), "Java long"); + } + + return longVal; + } + + @Override + public double asDouble() { + return val; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var values = (FloatValue) o; + return Double.compare(values.val, val) == 0; + } + + @Override + public int hashCode() { + var temp = Double.doubleToLongBits(val); + return (int) (temp ^ (temp >>> 32)); + } + + @Override + public String toString() { + return Double.toString(val); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/IntegerValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/IntegerValue.java new file mode 100644 index 0000000000..c4f1bfc9bc --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/IntegerValue.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class IntegerValue extends NumberValueAdapter { + private final long val; + + public IntegerValue(long val) { + this.val = val; + } + + @Override + public Type type() { + return Type.INTEGER; + } + + @Override + public Long asNumber() { + return val; + } + + @Override + public long asLong() { + return val; + } + + @Override + public double asDouble() { + var doubleVal = (double) val; + if ((long) doubleVal != val) { + throw new LossyCoercion(type().name(), "Java double"); + } + + return (double) val; + } + + @Override + public String toString() { + return Long.toString(val); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var values = (IntegerValue) o; + return val == values.val; + } + + @Override + public int hashCode() { + return (int) (val ^ (val >>> 32)); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalEntity.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalEntity.java new file mode 100644 index 0000000000..f8cfc33037 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalEntity.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Map; +import java.util.function.Function; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public abstract class InternalEntity implements Entity, AsValue { + private final long id; + private final String elementId; + private final Map properties; + + public InternalEntity(long id, String elementId, Map properties) { + this.id = id; + this.elementId = elementId; + this.properties = properties; + } + + @Override + @Deprecated + public long id() { + return id; + } + + @Override + public String elementId() { + return elementId; + } + + @Override + public int size() { + return properties.size(); + } + + @Override + public Map asMap(Function mapFunction) { + return Extract.map(properties, mapFunction); + } + + @Override + public Iterable keys() { + return properties.keySet(); + } + + @Override + public Value get(String key) { + var value = properties.get(key); + return value == null ? NullValue.NULL : value; + } + + @Override + public Value asValue() { + return new MapValue(properties); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var that = (InternalEntity) o; + + return id == that.id; + } + + @Override + public int hashCode() { + return (int) (id ^ (id >>> 32)); + } + + @Override + public String toString() { + return "Entity{" + "id=" + id + ", properties=" + properties + '}'; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalIsoDuration.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalIsoDuration.java new file mode 100644 index 0000000000..a7acbfda0e --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalIsoDuration.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import static java.time.temporal.ChronoUnit.DAYS; +import static java.time.temporal.ChronoUnit.MONTHS; +import static java.time.temporal.ChronoUnit.NANOS; +import static java.time.temporal.ChronoUnit.SECONDS; + +import java.time.Duration; +import java.time.Period; +import java.time.temporal.TemporalUnit; +import java.util.List; +import java.util.Objects; +import org.neo4j.driver.internal.bolt.api.values.IsoDuration; + +public class InternalIsoDuration implements IsoDuration { + private static final long NANOS_PER_SECOND = 1_000_000_000; + private static final List SUPPORTED_UNITS = List.of(MONTHS, DAYS, SECONDS, NANOS); + + private final long months; + private final long days; + private final long seconds; + private final int nanoseconds; + + public InternalIsoDuration(Period period) { + this(period.toTotalMonths(), period.getDays(), Duration.ZERO); + } + + public InternalIsoDuration(Duration duration) { + this(0, 0, duration); + } + + public InternalIsoDuration(long months, long days, long seconds, int nanoseconds) { + this(months, days, Duration.ofSeconds(seconds, nanoseconds)); + } + + InternalIsoDuration(long months, long days, Duration duration) { + this.months = months; + this.days = days; + this.seconds = duration.getSeconds(); // normalized value of seconds + this.nanoseconds = duration.getNano(); // normalized value of nanoseconds in [0, 999_999_999] + } + + @Override + public long months() { + return months; + } + + @Override + public long days() { + return days; + } + + @Override + public long seconds() { + return seconds; + } + + @Override + public int nanoseconds() { + return nanoseconds; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + var that = (InternalIsoDuration) o; + return months == that.months && days == that.days && seconds == that.seconds && nanoseconds == that.nanoseconds; + } + + @Override + public int hashCode() { + return Objects.hash(months, days, seconds, nanoseconds); + } + + @Override + public String toString() { + var sb = new StringBuilder(); + sb.append('P'); + sb.append(months).append('M'); + sb.append(days).append('D'); + sb.append('T'); + if (seconds < 0 && nanoseconds > 0) { + if (seconds == -1) { + sb.append("-0"); + } else { + sb.append(seconds + 1); + } + } else { + sb.append(seconds); + } + if (nanoseconds > 0) { + var pos = sb.length(); + // append nanoseconds as a 10-digit string with leading '1' that is later replaced by a '.' + if (seconds < 0) { + sb.append(2 * NANOS_PER_SECOND - nanoseconds); + } else { + sb.append(NANOS_PER_SECOND + nanoseconds); + } + sb.setCharAt(pos, '.'); // replace '1' with '.' + } + sb.append('S'); + return sb.toString(); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalMapAccessorWithDefaultValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalMapAccessorWithDefaultValue.java new file mode 100644 index 0000000000..82b8570940 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalMapAccessorWithDefaultValue.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Value; + +public abstract class InternalMapAccessorWithDefaultValue implements Value { + public abstract Value get(String key); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalNode.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalNode.java new file mode 100644 index 0000000000..93ac4f78ab --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalNode.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import org.neo4j.bolt.api.test.values.TestNode; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public class InternalNode extends InternalEntity implements TestNode { + private final Collection labels; + + public InternalNode(long id) { + this(id, Collections.emptyList(), Collections.emptyMap()); + } + + public InternalNode(long id, Collection labels, Map properties) { + this(id, String.valueOf(id), labels, properties); + } + + public InternalNode(long id, String elementId, Collection labels, Map properties) { + super(id, elementId, properties); + this.labels = labels; + } + + @Override + public Collection labels() { + return labels; + } + + @Override + public boolean hasLabel(String label) { + return labels.contains(label); + } + + @Override + public Value asValue() { + return new NodeValue(this); + } + + @Override + @SuppressWarnings("deprecation") + public String toString() { + return String.format("node<%s>", id()); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPath.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPath.java new file mode 100644 index 0000000000..c078d2eb14 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPath.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import org.neo4j.bolt.api.test.values.TestNode; +import org.neo4j.bolt.api.test.values.TestPath; +import org.neo4j.bolt.api.test.values.TestRelationship; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public class InternalPath implements TestPath, AsValue { + public record SelfContainedSegment(TestNode start, TestRelationship relationship, TestNode end) + implements TestSegment { + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + + var that = (SelfContainedSegment) other; + return start.equals(that.start) && end.equals(that.end) && relationship.equals(that.relationship); + } + + @Override + public String toString() { + return String.format( + relationship.startNodeId() == start.id() ? "(%s)-[%s:%s]->(%s)" : "(%s)<-[%s:%s]-(%s)", + start.id(), + relationship.id(), + relationship.typeString(), + end.id()); + } + } + + private static boolean isEndpoint(TestNode node, TestRelationship relationship) { + return node.id() == relationship.startNodeId() || node.id() == relationship.endNodeId(); + } + + private final List nodes; + private final List relationships; + private final List segments; + + public InternalPath(List alternatingNodeAndRel) { + nodes = newList(alternatingNodeAndRel.size() / 2 + 1); + relationships = newList(alternatingNodeAndRel.size() / 2); + segments = newList(alternatingNodeAndRel.size() / 2); + + if (alternatingNodeAndRel.size() % 2 == 0) { + throw new IllegalArgumentException("An odd number of entities are required to build a path"); + } + TestNode lastNode = null; + TestRelationship lastRelationship = null; + var index = 0; + for (var entity : alternatingNodeAndRel) { + if (entity == null) { + throw new IllegalArgumentException("Path entities cannot be null"); + } + if (index % 2 == 0) { + // even index - this should be a node + try { + lastNode = (TestNode) entity; + if (nodes.isEmpty() || (lastRelationship != null && isEndpoint(lastNode, lastRelationship))) { + nodes.add(lastNode); + } else { + throw new IllegalArgumentException("Node argument " + index + + " is not an endpoint of relationship argument " + (index - 1)); + } + } catch (ClassCastException e) { + var cls = entity.getClass().getName(); + throw new IllegalArgumentException("Expected argument " + index + " to be a node " + index + + " but found a " + cls + " " + "instead"); + } + } else { + // odd index - this should be a relationship + try { + lastRelationship = (TestRelationship) entity; + if (isEndpoint(lastNode, lastRelationship)) { + relationships.add(lastRelationship); + } else { + throw new IllegalArgumentException("Node argument " + (index - 1) + + " is not an endpoint of relationship argument " + index); + } + } catch (ClassCastException e) { + var cls = entity.getClass().getName(); + throw new IllegalArgumentException( + "Expected argument " + index + " to be a relationship but found a " + cls + " instead"); + } + } + index += 1; + } + buildSegments(); + } + + public InternalPath(Entity... alternatingNodeAndRel) { + this(Arrays.asList(alternatingNodeAndRel)); + } + + public InternalPath(List segments, List nodes, List relationships) { + this.segments = segments; + this.nodes = nodes; + this.relationships = relationships; + } + + private List newList(int size) { + return size == 0 ? Collections.emptyList() : new ArrayList<>(size); + } + + @Override + public int length() { + return relationships.size(); + } + + @Override + public boolean contains(TestNode node) { + return nodes.contains(node); + } + + @Override + public boolean contains(TestRelationship relationship) { + return relationships.contains(relationship); + } + + @Override + public Iterable nodes() { + return nodes; + } + + @Override + public Iterable relationships() { + return relationships; + } + + @Override + public TestNode start() { + return nodes.get(0); + } + + @Override + public TestNode end() { + return nodes.get(nodes.size() - 1); + } + + @Override + public Iterator iterator() { + return segments.iterator(); + } + + @Override + public Value asValue() { + return new PathValue(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var segments1 = (InternalPath) o; + + return segments.equals(segments1.segments); + } + + @Override + public int hashCode() { + return segments.hashCode(); + } + + @Override + public String toString() { + + return "path" + segments; + } + + private void buildSegments() { + for (var i = 0; i < relationships.size(); i++) { + segments.add(new SelfContainedSegment(nodes.get(i), relationships.get(i), nodes.get(i + 1))); + } + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPoint2D.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPoint2D.java new file mode 100644 index 0000000000..9bc59f814a --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPoint2D.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Point; + +public record InternalPoint2D(int srid, double x, double y) implements Point { + + @Override + public double z() { + return Double.NaN; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + var that = (InternalPoint2D) o; + return srid == that.srid && Double.compare(that.x, x) == 0 && Double.compare(that.y, y) == 0; + } + + @Override + public String toString() { + return "Point{" + "srid=" + srid + ", x=" + x + ", y=" + y + '}'; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPoint3D.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPoint3D.java new file mode 100644 index 0000000000..8759104339 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalPoint3D.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Point; + +public record InternalPoint3D(int srid, double x, double y, double z) implements Point { + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + var that = (InternalPoint3D) o; + return srid == that.srid + && Double.compare(that.x, x) == 0 + && Double.compare(that.y, y) == 0 + && Double.compare(that.z, z) == 0; + } + + @Override + public String toString() { + return "Point{" + "srid=" + srid + ", x=" + x + ", y=" + y + ", z=" + z + '}'; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalRelationship.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalRelationship.java new file mode 100644 index 0000000000..58752c7851 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/InternalRelationship.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Collections; +import java.util.Map; +import org.neo4j.bolt.api.test.values.TestRelationship; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public class InternalRelationship extends InternalEntity implements TestRelationship { + private long start; + private String startElementId; + private long end; + private String endElementId; + private final String type; + + public InternalRelationship(long id, long start, long end, String type) { + this(id, start, end, type, Collections.emptyMap()); + } + + public InternalRelationship(long id, long start, long end, String type, Map properties) { + this(id, String.valueOf(id), start, String.valueOf(start), end, String.valueOf(end), type, properties); + } + + public InternalRelationship( + long id, + String elementId, + long start, + String startElementId, + long end, + String endElementId, + String type, + Map properties) { + super(id, elementId, properties); + this.start = start; + this.startElementId = startElementId; + this.end = end; + this.endElementId = endElementId; + this.type = type; + } + + /** + * Modify the start/end identities of this relationship + */ + public void setStartAndEnd(long start, String startElementId, long end, String endElementId) { + this.start = start; + this.startElementId = startElementId; + this.end = end; + this.endElementId = endElementId; + } + + @Override + @Deprecated + public long startNodeId() { + return start; + } + + @Override + public String startNodeElementId() { + return startElementId; + } + + @Override + @Deprecated + public long endNodeId() { + return end; + } + + @Override + public String endNodeElementId() { + return endElementId; + } + + @Override + public String typeString() { + return type; + } + + @Override + public Value asValue() { + return new RelationshipValue(this); + } + + @Override + @SuppressWarnings("deprecation") + public String toString() { + return String.format("relationship<%s>", id()); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ListValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ListValue.java new file mode 100644 index 0000000000..2c5f4d5e3a --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ListValue.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Arrays; +import java.util.Iterator; +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public class ListValue extends ValueAdapter { + private final Value[] values; + + public ListValue(Value... values) { + if (values == null) { + throw new IllegalArgumentException("Cannot construct ListValue from null"); + } + this.values = values; + } + + @Override + public boolean isEmpty() { + return values.length == 0; + } + + @Override + public int size() { + return values.length; + } + + @Override + public Iterable values() { + return () -> new Iterator<>() { + private int cursor = 0; + + @Override + public boolean hasNext() { + return cursor < values.length; + } + + @Override + public Value next() { + return values[cursor++]; + } + + @Override + public void remove() {} + }; + } + + @Override + public Type type() { + return Type.LIST; + } + + @Override + public String toString() { + return Arrays.toString(values); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var otherValues = (ListValue) o; + return Arrays.equals(values, otherValues.values); + } + + @Override + public int hashCode() { + return Arrays.hashCode(values); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LocalDateTimeValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LocalDateTimeValue.java new file mode 100644 index 0000000000..95b7e2926b --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LocalDateTimeValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.time.LocalDateTime; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class LocalDateTimeValue extends ObjectValueAdapter { + public LocalDateTimeValue(LocalDateTime localDateTime) { + super(localDateTime); + } + + @Override + public LocalDateTime asLocalDateTime() { + return asObject(); + } + + @Override + public Type type() { + return Type.LOCAL_DATE_TIME; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LocalTimeValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LocalTimeValue.java new file mode 100644 index 0000000000..5e794299be --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LocalTimeValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.time.LocalTime; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class LocalTimeValue extends ObjectValueAdapter { + public LocalTimeValue(LocalTime time) { + super(time); + } + + @Override + public LocalTime asLocalTime() { + return asObject(); + } + + @Override + public Type type() { + return Type.LOCAL_TIME; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LossyCoercion.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LossyCoercion.java new file mode 100644 index 0000000000..1c1e10c24f --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/LossyCoercion.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import static java.lang.String.format; + +import java.io.Serial; + +public class LossyCoercion extends ValueException { + @Serial + private static final long serialVersionUID = -6259981390929065201L; + + public LossyCoercion(String sourceTypeName, String destinationTypeName) { + super(format("Cannot coerce %s to %s without losing precision", sourceTypeName, destinationTypeName)); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/MapAccessorWithDefaultValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/MapAccessorWithDefaultValue.java new file mode 100644 index 0000000000..a3b9ed134c --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/MapAccessorWithDefaultValue.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Value; + +public interface MapAccessorWithDefaultValue extends Value {} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/MapValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/MapValue.java new file mode 100644 index 0000000000..02cf6bc600 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/MapValue.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Map; +import java.util.function.Function; +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public class MapValue extends ValueAdapter { + private final Map val; + + public MapValue(Map val) { + if (val == null) { + throw new IllegalArgumentException("Cannot construct MapValue from null"); + } + this.val = val; + } + + @Override + public boolean isEmpty() { + return val.isEmpty(); + } + + @Override + public Map asMap(Function mapFunction) { + return Extract.map(val, mapFunction); + } + + @Override + public int size() { + return val.size(); + } + + @Override + public boolean containsKey(String key) { + return val.containsKey(key); + } + + @Override + public Iterable keys() { + return val.keySet(); + } + + @Override + public Iterable values() { + return val.values(); + } + + @Override + public Value get(String key) { + var value = val.get(key); + return value == null ? NullValue.NULL : value; + } + + @Override + public String toString() { + return "MapValue{" + "val=" + val + '}'; + } + + @Override + public Type type() { + return Type.MAP; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + var values = (MapValue) o; + return val.equals(values.val); + } + + @Override + public int hashCode() { + return val.hashCode(); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NodeValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NodeValue.java new file mode 100644 index 0000000000..0f02996d0a --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NodeValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.bolt.api.test.values.TestNode; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class NodeValue extends EntityValueAdapter { + public NodeValue(TestNode adapted) { + super(adapted); + } + + @Override + public TestNode asNode() { + return asEntity(); + } + + @Override + public Type type() { + return Type.NODE; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NotMultiValued.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NotMultiValued.java new file mode 100644 index 0000000000..53a1cbd65b --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NotMultiValued.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.io.Serial; + +public class NotMultiValued extends ValueException { + @Serial + private static final long serialVersionUID = -7380569883011364090L; + + public NotMultiValued(String message) { + super(message); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NullValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NullValue.java new file mode 100644 index 0000000000..b6050c3c19 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NullValue.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Type; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public final class NullValue extends ValueAdapter { + public static final Value NULL = new NullValue(); + + private NullValue() {} + + @Override + public boolean isNull() { + return true; + } + + @Override + public String asString() { + return "null"; + } + + @Override + public Type type() { + return Type.NULL; + } + + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") + @Override + public boolean equals(Object obj) { + return obj == NULL; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public String toString() { + return "NULL"; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NumberValueAdapter.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NumberValueAdapter.java new file mode 100644 index 0000000000..4c15502bcb --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/NumberValueAdapter.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +public abstract class NumberValueAdapter extends ValueAdapter { + public final V asObject() { + return asNumber(); + } + + public abstract V asNumber(); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ObjectValueAdapter.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ObjectValueAdapter.java new file mode 100644 index 0000000000..957041d229 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ObjectValueAdapter.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import static java.lang.String.format; + +import java.util.Objects; + +public abstract class ObjectValueAdapter extends ValueAdapter { + private final V adapted; + + protected ObjectValueAdapter(V adapted) { + if (adapted == null) { + throw new IllegalArgumentException( + format("Cannot construct %s from null", getClass().getSimpleName())); + } + this.adapted = adapted; + } + + public final V asObject() { + return adapted; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + var that = (ObjectValueAdapter) o; + return Objects.equals(adapted, that.adapted); + } + + @Override + public int hashCode() { + return adapted.hashCode(); + } + + @Override + public String toString() { + return adapted.toString(); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageFormatV5.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/PathValue.java similarity index 56% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageFormatV5.java rename to bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/PathValue.java index 6be0cef5f1..9e7fb83867 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageFormatV5.java +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/PathValue.java @@ -14,20 +14,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.basicimpl.messaging.v5; +package org.neo4j.bolt.api.test.values.impl; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; +import org.neo4j.bolt.api.test.values.TestPath; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class PathValue extends ObjectValueAdapter { + public PathValue(TestPath adapted) { + super(adapted); + } + + @Override + public int size() { + return asObject().length(); + } -public class MessageFormatV5 implements MessageFormat { @Override - public Writer newWriter(PackOutput output) { - return new MessageWriterV5(output); + public Type type() { + return Type.PATH; } @Override - public Reader newReader(PackInput input) { - return new MessageReaderV5(input); + public TestPath asPath() { + return asObject(); } } diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/PointValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/PointValue.java new file mode 100644 index 0000000000..54ef423534 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/PointValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.driver.internal.bolt.api.values.Point; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class PointValue extends ObjectValueAdapter { + public PointValue(Point point) { + super(point); + } + + @Override + public Point asPoint() { + return asObject(); + } + + @Override + public Type type() { + return Type.POINT; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/RelationshipValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/RelationshipValue.java new file mode 100644 index 0000000000..0f50a2a27f --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/RelationshipValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import org.neo4j.bolt.api.test.values.TestRelationship; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class RelationshipValue extends EntityValueAdapter { + public RelationshipValue(TestRelationship adapted) { + super(adapted); + } + + @Override + public Type type() { + return Type.RELATIONSHIP; + } + + @Override + public TestRelationship asRelationship() { + return asEntity(); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/StringValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/StringValue.java new file mode 100644 index 0000000000..bbd95e7cd0 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/StringValue.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.util.Objects; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class StringValue extends ValueAdapter { + private final String val; + + public StringValue(String val) { + if (val == null) { + throw new IllegalArgumentException("Cannot construct StringValue from null"); + } + this.val = val; + } + + @Override + public boolean isEmpty() { + return val.isEmpty(); + } + + @Override + public int size() { + return val.length(); + } + + @Override + public String asString() { + return val; + } + + @Override + public String toString() { + return String.format("\"%s\"", val.replace("\"", "\\\"")); + } + + @Override + public Type type() { + return Type.STRING; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + var that = (StringValue) o; + return Objects.equals(val, that.val); + } + + @Override + public int hashCode() { + return val.hashCode(); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/TimeValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/TimeValue.java new file mode 100644 index 0000000000..90db8e7a93 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/TimeValue.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.time.OffsetTime; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class TimeValue extends ObjectValueAdapter { + public TimeValue(OffsetTime time) { + super(time); + } + + @Override + public OffsetTime asOffsetTime() { + return asObject(); + } + + @Override + public Type type() { + return Type.TIME; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Uncoercible.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Uncoercible.java new file mode 100644 index 0000000000..3af6c5c8f9 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Uncoercible.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import static java.lang.String.format; + +import java.io.Serial; + +public class Uncoercible extends ValueException { + @Serial + private static final long serialVersionUID = -6259981390929065201L; + + public Uncoercible(String sourceTypeName, String destinationTypeName) { + super(format("Cannot coerce %s to %s", sourceTypeName, destinationTypeName)); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Unsizable.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Unsizable.java new file mode 100644 index 0000000000..071d3cdea1 --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/Unsizable.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.io.Serial; + +public class Unsizable extends ValueException { + @Serial + private static final long serialVersionUID = 741487155344252339L; + + public Unsizable(String message) { + super(message); + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/UnsupportedDateTimeValue.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/UnsupportedDateTimeValue.java new file mode 100644 index 0000000000..f7f30530db --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/UnsupportedDateTimeValue.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.lang.reflect.InvocationTargetException; +import java.time.DateTimeException; +import java.time.ZonedDateTime; +import org.neo4j.driver.internal.bolt.api.values.Type; + +public class UnsupportedDateTimeValue extends ValueAdapter { + final DateTimeException exception; + + public UnsupportedDateTimeValue(DateTimeException exception) { + this.exception = exception; + } + + @Override + public ZonedDateTime asZonedDateTime() { + throw instantiateDateTimeException(); + } + + @Override + public Type type() { + return Type.DATE_TIME; + } + + @Override + public boolean equals(Object obj) { + return this == obj; + } + + @Override + public int hashCode() { + return System.identityHashCode(this); + } + + @Override + public String toString() { + return "Unsupported datetime value."; + } + + private DateTimeException instantiateDateTimeException() { + DateTimeException newException; + try { + newException = exception + .getClass() + .getDeclaredConstructor(String.class, Throwable.class) + .newInstance(exception.getMessage(), exception); + } catch (NoSuchMethodException + | InvocationTargetException + | InstantiationException + | IllegalAccessException e) { + newException = new DateTimeException(exception.getMessage(), exception); + } + return newException; + } +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ValueAdapter.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ValueAdapter.java new file mode 100644 index 0000000000..bf712c298b --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ValueAdapter.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import static java.util.Collections.emptyList; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZonedDateTime; +import java.util.Map; +import java.util.function.Function; +import org.neo4j.bolt.api.test.values.TestNode; +import org.neo4j.bolt.api.test.values.TestPath; +import org.neo4j.bolt.api.test.values.TestRelationship; +import org.neo4j.bolt.api.test.values.TestValue; +import org.neo4j.driver.internal.bolt.api.values.IsoDuration; +import org.neo4j.driver.internal.bolt.api.values.Point; +import org.neo4j.driver.internal.bolt.api.values.Value; + +public abstract class ValueAdapter extends InternalMapAccessorWithDefaultValue implements TestValue { + @Override + public Value asValue() { + return this; + } + + @Override + public boolean isNull() { + return false; + } + + @Override + public boolean containsKey(String key) { + throw new NotMultiValued(type().name() + " is not a keyed collection"); + } + + @Override + public String asString() { + throw new Uncoercible(type().name(), "Java String"); + } + + @Override + public long asLong() { + throw new Uncoercible(type().name(), "Java long"); + } + + @Override + public double asDouble() { + throw new Uncoercible(type().name(), "Java double"); + } + + @Override + public boolean asBoolean() { + throw new Uncoercible(type().name(), "Java boolean"); + } + + @Override + public Map asMap(Function mapFunction) { + throw new Uncoercible(type().name(), "Java Map"); + } + + @Override + public LocalDate asLocalDate() { + throw new Uncoercible(type().name(), "LocalDate"); + } + + @Override + public OffsetTime asOffsetTime() { + throw new Uncoercible(type().name(), "OffsetTime"); + } + + @Override + public LocalTime asLocalTime() { + throw new Uncoercible(type().name(), "LocalTime"); + } + + @Override + public LocalDateTime asLocalDateTime() { + throw new Uncoercible(type().name(), "LocalDateTime"); + } + + @Override + public ZonedDateTime asZonedDateTime() { + throw new Uncoercible(type().name(), "ZonedDateTime"); + } + + @Override + public IsoDuration asIsoDuration() { + throw new Uncoercible(type().name(), "Duration"); + } + + @Override + public Point asPoint() { + throw new Uncoercible(type().name(), "Point"); + } + + @Override + public Value get(String key) { + throw new NotMultiValued(type().name() + " is not a keyed collection"); + } + + @Override + public int size() { + throw new Unsizable(type().name() + " does not have size"); + } + + @Override + public Iterable keys() { + return emptyList(); + } + + @Override + public boolean isEmpty() { + return !values().iterator().hasNext(); + } + + @Override + public Iterable values() { + throw new NotMultiValued(type().name() + " is not iterable"); + } + + @Override + public byte[] asByteArray() { + throw new Uncoercible(type().name(), "byte[]"); + } + + @Override + public TestNode asNode() { + throw new Uncoercible(type().name(), "Node"); + } + + @Override + public TestRelationship asRelationship() { + throw new Uncoercible(type().name(), "Relationship"); + } + + @Override + public TestPath asPath() { + throw new Uncoercible(type().name(), "Path"); + } + + // Force implementation + @Override + public abstract boolean equals(Object obj); + + // Force implementation + @Override + public abstract int hashCode(); + + // Force implementation + @Override + public abstract String toString(); +} diff --git a/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ValueException.java b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ValueException.java new file mode 100644 index 0000000000..709754138f --- /dev/null +++ b/bolt-api-test-values/src/main/java/org/neo4j/bolt/api/test/values/impl/ValueException.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.test.values.impl; + +import java.io.Serial; + +/** + * A ValueException indicates that the client has carried out an operation on values incorrectly. + * @since 1.0 + */ +public class ValueException extends RuntimeException { + @Serial + private static final long serialVersionUID = -1269336313727174998L; + + public ValueException(String message) { + super(message); + } +} diff --git a/bolt-api/LICENSES.txt b/bolt-api/LICENSES.txt new file mode 100644 index 0000000000..f8e0fd3292 --- /dev/null +++ b/bolt-api/LICENSES.txt @@ -0,0 +1,5 @@ +This file contains the full license text of the included third party +libraries. For an overview of the licenses see the NOTICE.txt file. + + + diff --git a/bolt-api/NOTICE.txt b/bolt-api/NOTICE.txt new file mode 100644 index 0000000000..c3bf48c6fc --- /dev/null +++ b/bolt-api/NOTICE.txt @@ -0,0 +1,20 @@ +Copyright (c) "Neo4j" +Neo4j Sweden AB [https://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. + +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. + +Full license texts are found in LICENSES.txt. + + +Third-party licenses +-------------------- + diff --git a/bolt-api/pom.xml b/bolt-api/pom.xml new file mode 100644 index 0000000000..e4b81c9400 --- /dev/null +++ b/bolt-api/pom.xml @@ -0,0 +1,65 @@ + + 4.0.0 + + + org.neo4j.driver + neo4j-java-driver-parent + 5.27-SNAPSHOT + + + neo4j-bolt-api + + jar + Neo4j Bolt API + https://github.com/neo4j/neo4j-java-driver + + + ${project.basedir}/.. + ,-try + + + + + + org.mockito + mockito-core + + + org.junit.jupiter + junit-jupiter + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.apache.maven.plugins + maven-failsafe-plugin + + + org.apache.maven.surefire + surefire-junit-platform + ${surefire.and.failsafe.version} + + + + + + + + scm:git:git://github.com/neo4j/neo4j-java-driver.git + scm:git:git@github.com:neo4j/neo4j-java-driver.git + https://github.com/neo4j/neo4j-java-driver + + + diff --git a/bolt-api/src/main/java/module-info.java b/bolt-api/src/main/java/module-info.java new file mode 100644 index 0000000000..37b80cd283 --- /dev/null +++ b/bolt-api/src/main/java/module-info.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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. + */ +/** + * The Neo4j Bolt API module. + */ +module org.neo4j.bolt.api { + exports org.neo4j.driver.internal.bolt.api; + exports org.neo4j.driver.internal.bolt.api.exception; + exports org.neo4j.driver.internal.bolt.api.summary; + exports org.neo4j.driver.internal.bolt.api.values; +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/AccessMode.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/AccessMode.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/AccessMode.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/AccessMode.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/AuthData.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/AuthData.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/AuthData.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/AuthData.java index 2d034b4051..04d9f40156 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/AuthData.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/AuthData.java @@ -17,7 +17,7 @@ package org.neo4j.driver.internal.bolt.api; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface AuthData { Map authMap(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BasicResponseHandler.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BasicResponseHandler.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BasicResponseHandler.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BasicResponseHandler.java index c1630b1079..b4f71e1692 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BasicResponseHandler.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BasicResponseHandler.java @@ -21,7 +21,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.exception.BoltException; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; @@ -34,6 +33,7 @@ import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; +import org.neo4j.driver.internal.bolt.api.values.Value; public final class BasicResponseHandler implements ResponseHandler { private final CompletableFuture summariesFuture = new CompletableFuture<>(); @@ -53,6 +53,8 @@ public final class BasicResponseHandler implements ResponseHandler { private int ignored; private Throwable error; + public BasicResponseHandler() {} + public CompletionStage summaries() { return summariesFuture; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltAgent.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltAgent.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltAgent.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltAgent.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnection.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnection.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnection.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnection.java index 03c5959534..cf79f50aaf 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnection.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnection.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.CompletionStage; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface BoltConnection { CompletionStage onLoop(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionProvider.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionProvider.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionProvider.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionProvider.java index da7584c75d..82fc62c6eb 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionProvider.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionProvider.java @@ -21,7 +21,7 @@ import java.util.concurrent.CompletionStage; import java.util.function.Consumer; import java.util.function.Supplier; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface BoltConnectionProvider { CompletionStage init( diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionState.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionState.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionState.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltConnectionState.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltProtocolVersion.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltProtocolVersion.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltProtocolVersion.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltProtocolVersion.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltServerAddress.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltServerAddress.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/BoltServerAddress.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/BoltServerAddress.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/ClusterComposition.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ClusterComposition.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/ClusterComposition.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ClusterComposition.java index 162d574a8a..81a59f0973 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/ClusterComposition.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ClusterComposition.java @@ -19,14 +19,8 @@ import java.util.LinkedHashSet; import java.util.Objects; import java.util.Set; -import java.util.function.Function; -import org.neo4j.driver.Value; public final class ClusterComposition { - private static final long MAX_TTL = Long.MAX_VALUE / 1000L; - private static final Function OF_BoltServerAddress = - value -> new BoltServerAddress(value.asString()); - private final Set readers; private final Set writers; private final Set routers; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseName.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseName.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseName.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseName.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtil.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtil.java similarity index 98% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtil.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtil.java index 04840a109a..a0cef59063 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtil.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtil.java @@ -23,6 +23,8 @@ public final class DatabaseNameUtil { static final String DEFAULT_DATABASE_NAME = null; public static final String SYSTEM_DATABASE_NAME = "system"; + private DatabaseNameUtil() {} + private static final DatabaseName DEFAULT_DATABASE = new DatabaseName() { @Override public Optional databaseName() { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/DefaultDomainNameResolver.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DefaultDomainNameResolver.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/DefaultDomainNameResolver.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DefaultDomainNameResolver.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/DomainNameResolver.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DomainNameResolver.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/DomainNameResolver.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/DomainNameResolver.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/GqlError.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/GqlError.java similarity index 68% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/GqlError.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/GqlError.java index 8c211cacf0..08f2c79151 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/GqlError.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/GqlError.java @@ -17,7 +17,7 @@ package org.neo4j.driver.internal.bolt.api; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public record GqlError( String gqlStatus, @@ -25,16 +25,4 @@ public record GqlError( String code, String message, Map diagnosticRecord, - GqlError cause) { - - // for testing only - public GqlError(String code, String message) { - this( - GqlStatusError.UNKNOWN.getStatus(), - GqlStatusError.UNKNOWN.getStatusDescription(message), - code, - message, - GqlStatusError.DIAGNOSTIC_RECORD, - null); - } -} + GqlError cause) {} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/GqlStatusError.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/GqlStatusError.java new file mode 100644 index 0000000000..a3129e7770 --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/GqlStatusError.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api; + +public enum GqlStatusError { + UNKNOWN("50N42", "general processing exception - unexpected error"); + + private final String status; + private final String explanation; + + @SuppressWarnings("SameParameterValue") + GqlStatusError(String status, String explanation) { + this.status = status; + this.explanation = explanation; + } + + public String getStatus() { + return status; + } + + public String getStatusDescription(String message) { + return String.format("error: %s. %s", explanation, message); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/InternalDatabaseName.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/InternalDatabaseName.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/InternalDatabaseName.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/InternalDatabaseName.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/ListenerEvent.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ListenerEvent.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/ListenerEvent.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ListenerEvent.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/LoggingProvider.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/LoggingProvider.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/LoggingProvider.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/LoggingProvider.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/MetricsListener.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/MetricsListener.java similarity index 94% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/MetricsListener.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/MetricsListener.java index 30228e9f21..597abc44ce 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/MetricsListener.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/MetricsListener.java @@ -16,9 +16,7 @@ */ package org.neo4j.driver.internal.bolt.api; -import java.util.concurrent.TimeUnit; import java.util.function.IntSupplier; -import org.neo4j.driver.Config; public interface MetricsListener { /** @@ -71,8 +69,7 @@ public interface MetricsListener { void afterAcquiredOrCreated(String poolId, ListenerEvent acquireEvent); /** - * After we failed to acquire a connection from pool within maximum connection acquisition timeout set by - * {@link Config.ConfigBuilder#withConnectionAcquisitionTimeout(long, TimeUnit)}. + * After we failed to acquire a connection from pool within maximum connection acquisition timeout set by timeout. * @param poolId the id of the pool where the netty channel lives. */ void afterTimedOutToAcquireOrCreate(String poolId); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationClassification.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationClassification.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationClassification.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationClassification.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationConfig.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationConfig.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationConfig.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationConfig.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationSeverity.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationSeverity.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationSeverity.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/NotificationSeverity.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/ResponseHandler.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ResponseHandler.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/ResponseHandler.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ResponseHandler.java index 6c8cd345cc..9d78e66bbe 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/ResponseHandler.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ResponseHandler.java @@ -16,7 +16,6 @@ */ package org.neo4j.driver.internal.bolt.api; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; @@ -28,6 +27,7 @@ import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface ResponseHandler { diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/ResultSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ResultSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/ResultSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/ResultSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/RoutingContext.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/RoutingContext.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/RoutingContext.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/RoutingContext.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/Scheme.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/Scheme.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/Scheme.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/Scheme.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlan.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlan.java similarity index 92% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlan.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlan.java index 4adb77e551..932871dd2f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlan.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlan.java @@ -24,8 +24,10 @@ public interface SecurityPlan { SecurityPlan INSECURE = new SecurityPlanImpl(false, false, null, false); + @SuppressWarnings("SameReturnValue") boolean requiresEncryption(); + @SuppressWarnings("SameReturnValue") boolean requiresClientAuth(); SSLContext sslContext(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlanImpl.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlanImpl.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlanImpl.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SecurityPlanImpl.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/SummaryCounters.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SummaryCounters.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/SummaryCounters.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/SummaryCounters.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/TelemetryApi.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/TelemetryApi.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/TelemetryApi.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/TelemetryApi.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/TransactionType.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/TransactionType.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/TransactionType.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/TransactionType.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltClientException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltClientException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltClientException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltClientException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionAcquisitionException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionAcquisitionException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionAcquisitionException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionAcquisitionException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionReadTimeoutException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionReadTimeoutException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionReadTimeoutException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltConnectionReadTimeoutException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltDiscoveryException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltDiscoveryException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltDiscoveryException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltDiscoveryException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltFailureException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltFailureException.java similarity index 96% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltFailureException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltFailureException.java index 662dbe4aba..309e404f89 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltFailureException.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltFailureException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import java.util.Objects; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public class BoltFailureException extends BoltGqlErrorException { @Serial diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltGqlErrorException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltGqlErrorException.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltGqlErrorException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltGqlErrorException.java index a09ade0764..a8fde2d18e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltGqlErrorException.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltGqlErrorException.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public class BoltGqlErrorException extends BoltException { @Serial diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltProtocolException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltProtocolException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltProtocolException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltProtocolException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltServiceUnavailableException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltServiceUnavailableException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltServiceUnavailableException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltServiceUnavailableException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltTransientException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltTransientException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltTransientException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltTransientException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUnsupportedFeatureException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUnsupportedFeatureException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUnsupportedFeatureException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUnsupportedFeatureException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUntrustedServerException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUntrustedServerException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUntrustedServerException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/BoltUntrustedServerException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/MinVersionAcquisitionException.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/MinVersionAcquisitionException.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/exception/MinVersionAcquisitionException.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/exception/MinVersionAcquisitionException.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/BeginSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/BeginSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/BeginSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/BeginSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/CommitSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/CommitSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/CommitSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/CommitSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/DiscardSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/DiscardSummary.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/DiscardSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/DiscardSummary.java index e5d7bc6e10..10a186c3a6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/DiscardSummary.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/DiscardSummary.java @@ -17,7 +17,7 @@ package org.neo4j.driver.internal.bolt.api.summary; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface DiscardSummary { Map metadata(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogoffSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogoffSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogoffSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogoffSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogonSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogonSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogonSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/LogonSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/PullSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/PullSummary.java similarity index 93% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/PullSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/PullSummary.java index fa85fc45ea..e2ddd21683 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/PullSummary.java +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/PullSummary.java @@ -17,7 +17,7 @@ package org.neo4j.driver.internal.bolt.api.summary; import java.util.Map; -import org.neo4j.driver.Value; +import org.neo4j.driver.internal.bolt.api.values.Value; public interface PullSummary { @SuppressWarnings("SameReturnValue") diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/ResetSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/ResetSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/ResetSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/ResetSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RollbackSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RollbackSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RollbackSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RollbackSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RouteSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RouteSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RouteSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RouteSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RunSummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RunSummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RunSummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/RunSummary.java diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/TelemetrySummary.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/TelemetrySummary.java similarity index 100% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/summary/TelemetrySummary.java rename to bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/summary/TelemetrySummary.java diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/IsoDuration.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/IsoDuration.java new file mode 100644 index 0000000000..99aeea15e0 --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/IsoDuration.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public interface IsoDuration { + long months(); + + long days(); + + long seconds(); + + int nanoseconds(); +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/MapAccessor.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/MapAccessor.java new file mode 100644 index 0000000000..0d2f6c28cf --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/MapAccessor.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +import java.util.Map; +import java.util.function.Function; + +interface MapAccessor { + Iterable keys(); + + int size(); + + Value get(String key); + + Iterable values(); + + boolean containsKey(String key); + + Map asMap(Function mapFunction); +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Node.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Node.java new file mode 100644 index 0000000000..a2b7bbc39a --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Node.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public interface Node { + long id(); + + String elementId(); +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Path.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Path.java new file mode 100644 index 0000000000..965a0ae414 --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Path.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public interface Path {} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Point.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Point.java new file mode 100644 index 0000000000..f5d333ae6b --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Point.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public interface Point { + int srid(); + + double x(); + + double y(); + + @SuppressWarnings("SameReturnValue") + double z(); +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Relationship.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Relationship.java new file mode 100644 index 0000000000..6f83fcb2bd --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Relationship.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public interface Relationship { + void setStartAndEnd(long start, String startElementId, long end, String endElementId); +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Segment.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Segment.java new file mode 100644 index 0000000000..112043f552 --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Segment.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public interface Segment {} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Type.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Type.java new file mode 100644 index 0000000000..bbf52ab51b --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Type.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +public enum Type { + ANY, + BOOLEAN, + BYTES, + STRING, + NUMBER, + INTEGER, + FLOAT, + LIST, + MAP, + NODE, + RELATIONSHIP, + PATH, + POINT, + DATE, + TIME, + LOCAL_TIME, + LOCAL_DATE_TIME, + DATE_TIME, + DURATION, + NULL +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Value.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Value.java new file mode 100644 index 0000000000..dd1146e757 --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/Value.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetTime; +import java.time.ZonedDateTime; + +public interface Value extends MapAccessor { + Type type(); + + boolean asBoolean(); + + byte[] asByteArray(); + + String asString(); + + long asLong(); + + double asDouble(); + + LocalDate asLocalDate(); + + OffsetTime asOffsetTime(); + + LocalTime asLocalTime(); + + LocalDateTime asLocalDateTime(); + + ZonedDateTime asZonedDateTime(); + + IsoDuration asIsoDuration(); + + Point asPoint(); + + boolean isNull(); + + boolean isEmpty(); +} diff --git a/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/ValueFactory.java b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/ValueFactory.java new file mode 100644 index 0000000000..2f55486e05 --- /dev/null +++ b/bolt-api/src/main/java/org/neo4j/driver/internal/bolt/api/values/ValueFactory.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.bolt.api.values; + +import java.time.DateTimeException; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public interface ValueFactory { + Value value(Object value); + + Node node(long id, String elementId, Collection labels, Map properties); + + Relationship relationship( + long id, + String elementId, + long start, + String startElementId, + long end, + String endElementId, + String type, + Map properties); + + Segment segment(Node start, Relationship relationship, Node end); + + Path path(List segments, List nodes, List relationships); + + Value isoDuration(long months, long days, long seconds, int nanoseconds); + + Value point(int srid, double x, double y); + + Value point(int srid, double x, double y, double z); + + Value unsupportedDateTimeValue(DateTimeException e); +} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltAgentUtil.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltAgentUtil.java similarity index 100% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltAgentUtil.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltAgentUtil.java diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressParsingTest.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressParsingTest.java similarity index 100% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressParsingTest.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressParsingTest.java diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressTest.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressTest.java similarity index 88% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressTest.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressTest.java index 56e3e48352..1d37e47e71 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressTest.java +++ b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/BoltServerAddressTest.java @@ -16,8 +16,6 @@ */ package org.neo4j.driver.internal.bolt.api; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.neo4j.driver.internal.bolt.api.BoltServerAddress.DEFAULT_PORT; @@ -28,12 +26,12 @@ class BoltServerAddressTest { @Test void defaultPortShouldBe7687() { - assertThat(DEFAULT_PORT, equalTo(7687)); + assertEquals(7687, DEFAULT_PORT); } @Test void portShouldUseDefaultIfNotSupplied() { - assertThat(new BoltServerAddress("localhost").port(), equalTo(BoltServerAddress.DEFAULT_PORT)); + assertEquals(BoltServerAddress.DEFAULT_PORT, new BoltServerAddress("localhost").port()); } @Test @@ -76,6 +74,6 @@ void shouldUseUriWithHostAndPort() { @Test void shouldIncludeHostAndPortInToString() { var address = new BoltServerAddress("localhost", 8081); - assertThat(address.toString(), equalTo("localhost:8081")); + assertEquals("localhost:8081", address.toString()); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/ClusterCompositionTest.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/ClusterCompositionTest.java similarity index 100% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/ClusterCompositionTest.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/ClusterCompositionTest.java diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtilTest.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtilTest.java similarity index 100% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtilTest.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/DatabaseNameUtilTest.java diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/RoutingContextTest.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/RoutingContextTest.java similarity index 100% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/RoutingContextTest.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/RoutingContextTest.java diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/api/util/ClusterCompositionUtil.java b/bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/util/ClusterCompositionUtil.java similarity index 100% rename from driver/src/test/java/org/neo4j/driver/internal/bolt/api/util/ClusterCompositionUtil.java rename to bolt-api/src/test/java/org/neo4j/driver/internal/bolt/api/util/ClusterCompositionUtil.java diff --git a/bundle/osgi.bnd b/bundle/osgi.bnd index ecf3966e28..98b9ef9687 100644 --- a/bundle/osgi.bnd +++ b/bundle/osgi.bnd @@ -1,11 +1,13 @@ package-version=${version;===;${Bundle-Version}} Export-Package: \ - *;version="${package-version}" + !org.neo4j.driver.internal.*, \ + org.neo4j.driver.*;version="${package-version}" Import-Package: \ + !org.neo4j.driver.internal.*, \ !io.netty.*, \ - !reactor.core.*, \ + !reactor.*, \ !com.oracle.svm.*, \ javax.security.cert, \ * diff --git a/bundle/pom.xml b/bundle/pom.xml index 8c20bd4d70..0746d61565 100644 --- a/bundle/pom.xml +++ b/bundle/pom.xml @@ -32,6 +32,45 @@ ${project.version} true + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-netty + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-pooled + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-routed + ${project.version} + true + + + io.netty + netty-handler + true + + + io.netty + netty-tcnative-classes + true + + + io.projectreactor + reactor-core + true + @@ -76,6 +115,16 @@ + + org.apache.felix + maven-bundle-plugin + + + <_removeheaders>Bnd-*,Private-Package,Bundle-ClassPath,Embed-Dependency,Embed-Transitive,Embedded-Artifacts,Include-Resource + neo4j-bolt-api-netty,netty-handler,netty-tcnative-classes,reactor-core + + + @@ -183,11 +232,39 @@ + ${project.groupId}:neo4j-bolt-api + ${project.groupId}:neo4j-bolt-api-netty + ${project.groupId}:neo4j-bolt-api-pooled + ${project.groupId}:neo4j-bolt-api-routed io.netty:* io.projectreactor:* + + org.neo4j.driver.internal.bolt.api + org.neo4j.driver.internal.bolt.api + + + org.neo4j.driver.internal.bolt.basicimpl.impl + org.neo4j.driver.internal.bolt.basicimpl + + + org.neo4j.driver.internal.bolt.basicimpl.BootstrapFactory + org.neo4j.driver.internal.bolt.basicimpl.BootstrapFactory + + + org.neo4j.driver.internal.bolt.basicimpl.NettyBoltConnectionProvider + org.neo4j.driver.internal.bolt.basicimpl.NettyBoltConnectionProvider + + + org.neo4j.driver.internal.bolt.pooledimpl + org.neo4j.driver.internal.bolt.pooledimpl + + + org.neo4j.driver.internal.bolt.routedimpl + org.neo4j.driver.internal.bolt.routedimpl + io.netty org.neo4j.driver.internal.shaded.io.netty @@ -199,6 +276,11 @@ + + + META-INF/native-image/org.neo4j.driver/neo4j-java-driver/native-image.properties=src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/native-image.properties,META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflect-config.json=src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflect-config.json + + @@ -208,9 +290,12 @@ - ${project.groupId}:${project.artifactId} + *:* module-info.java + module-info.yml + META-INF/maven/** + META-INF/versions/** @@ -233,7 +318,7 @@ - + diff --git a/driver/osgi.bnd b/driver/osgi.bnd index 8a0ac0d378..f726800db8 100644 --- a/driver/osgi.bnd +++ b/driver/osgi.bnd @@ -1,10 +1,11 @@ package-version=${version;===;${Bundle-Version}} Export-Package: \ - !*.internal.*, \ - *;version="${package-version}" + !org.neo4j.driver.internal.*, \ + org.neo4j.driver.*;version="${package-version}" Import-Package: \ + !org.neo4j.driver.internal.*, \ !com.oracle.svm.*, \ javax.security.cert, \ * diff --git a/driver/pom.xml b/driver/pom.xml index f90a9ac2d5..0b4276ea40 100644 --- a/driver/pom.xml +++ b/driver/pom.xml @@ -20,7 +20,8 @@ ${project.basedir}/.. ${basedir}/target/classes-without-jpms ,-try - --add-opens org.neo4j.driver/org.neo4j.driver.internal.bolt.basicimpl.util.messaging=ALL-UNNAMED + --add-opens + org.neo4j.driver/org.neo4j.driver.internal.bolt.basicimpl.impl.util.messaging=ALL-UNNAMED --add-opens org.neo4j.driver/org.neo4j.driver.internal.util=ALL-UNNAMED --add-opens org.neo4j.driver/org.neo4j.driver.internal.async=ALL-UNNAMED blockHoundTest false @@ -28,6 +29,30 @@ + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-netty + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-pooled + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-routed + ${project.version} + true + org.reactivestreams reactive-streams @@ -196,6 +221,124 @@ + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + + + ${project.groupId}:neo4j-bolt-api + ${project.groupId}:neo4j-bolt-api-netty + ${project.groupId}:neo4j-bolt-api-pooled + ${project.groupId}:neo4j-bolt-api-routed + + + + + org.neo4j.driver.internal.bolt.api + org.neo4j.driver.internal.bolt.api + + + org.neo4j.driver.internal.bolt.basicimpl.impl + org.neo4j.driver.internal.bolt.basicimpl + + + org.neo4j.driver.internal.bolt.basicimpl.BootstrapFactory + org.neo4j.driver.internal.bolt.basicimpl.BootstrapFactory + + + org.neo4j.driver.internal.bolt.basicimpl.NettyBoltConnectionProvider + org.neo4j.driver.internal.bolt.basicimpl.NettyBoltConnectionProvider + + + org.neo4j.driver.internal.bolt.pooledimpl + org.neo4j.driver.internal.bolt.pooledimpl + + + org.neo4j.driver.internal.bolt.routedimpl + org.neo4j.driver.internal.bolt.routedimpl + + + + + + + META-INF/services/reactor.blockhound.integration.BlockHoundIntegration=src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration,META-INF/native-image/org.neo4j.driver/neo4j-java-driver/native-image.properties=src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/native-image.properties,META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflect-config.json=src/main/resources/META-INF/native-image/org.neo4j.driver/neo4j-java-driver/reflect-config.json + + + + + + *:* + + module-info.java + META-INF/maven/** + + + + true + true + + + + + + org.apache.maven.plugins + maven-antrun-plugin + + + add-module-info-to-sources + package + + run + + + + + + + + + + + + + org.moditect + moditect-maven-plugin + + + add-module-infos + package + + add-module-info + + + true + + + ${basedir}/src/main/jpms/module-info.java + + + + + + + + org.apache.felix + maven-bundle-plugin + + + <_removeheaders>Bnd-*,Private-Package,Bundle-ClassPath,Embed-Dependency,Embed-Transitive,Embedded-Artifacts,Include-Resource + neo4j-bolt-api-netty + + + @@ -269,6 +412,18 @@ + + org.apache.maven.plugins + maven-shade-plugin + + + org.apache.maven.plugins + maven-antrun-plugin + + + org.moditect + moditect-maven-plugin + diff --git a/driver/src/main/java/module-info.java b/driver/src/main/java/module-info.java index 07513234b0..edcb38d56c 100644 --- a/driver/src/main/java/module-info.java +++ b/driver/src/main/java/module-info.java @@ -30,13 +30,12 @@ exports org.neo4j.driver.exceptions; exports org.neo4j.driver.exceptions.value; + requires org.neo4j.bolt.api; + requires org.neo4j.bolt.netty; + requires org.neo4j.bolt.pooled; + requires org.neo4j.bolt.routed; requires reactor.core; requires io.netty.common; - requires io.netty.handler; - requires io.netty.transport; - requires io.netty.buffer; - requires io.netty.codec; - requires io.netty.resolver; requires transitive java.logging; requires transitive org.reactivestreams; requires static micrometer.core; diff --git a/driver/src/main/java/org/neo4j/driver/Values.java b/driver/src/main/java/org/neo4j/driver/Values.java index 04e28a6f12..0344aaf0d0 100644 --- a/driver/src/main/java/org/neo4j/driver/Values.java +++ b/driver/src/main/java/org/neo4j/driver/Values.java @@ -40,10 +40,11 @@ import java.util.stream.Stream; import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.internal.AsValue; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.InternalIsoDuration; import org.neo4j.driver.internal.InternalPoint2D; import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.value.BoltValue; import org.neo4j.driver.internal.value.BooleanValue; import org.neo4j.driver.internal.value.BytesValue; import org.neo4j.driver.internal.value.DateTimeValue; @@ -103,6 +104,9 @@ public static Value value(Object value) { return NullValue.NULL; } + if (value instanceof BoltValue boltValue) { + return boltValue.asDriverValue(); + } if (value instanceof AsValue) { return ((AsValue) value).asValue(); } diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/AuthTokenManagerExecutionException.java b/driver/src/main/java/org/neo4j/driver/exceptions/AuthTokenManagerExecutionException.java index 6a54e73cab..d359984884 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/AuthTokenManagerExecutionException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/AuthTokenManagerExecutionException.java @@ -18,7 +18,7 @@ import java.io.Serial; import org.neo4j.driver.AuthTokenManager; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * The {@link org.neo4j.driver.AuthTokenManager} execution has lead to an unexpected result. diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/AuthenticationException.java b/driver/src/main/java/org/neo4j/driver/exceptions/AuthenticationException.java index e1aab46020..645230ee23 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/AuthenticationException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/AuthenticationException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/AuthorizationExpiredException.java b/driver/src/main/java/org/neo4j/driver/exceptions/AuthorizationExpiredException.java index 67a2963c7f..182de187ae 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/AuthorizationExpiredException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/AuthorizationExpiredException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/ClientException.java b/driver/src/main/java/org/neo4j/driver/exceptions/ClientException.java index f8fcaab656..1056d3ee3c 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/ClientException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/ClientException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/DatabaseException.java b/driver/src/main/java/org/neo4j/driver/exceptions/DatabaseException.java index c4511ba378..bb09aa6741 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/DatabaseException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/DatabaseException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/DiscoveryException.java b/driver/src/main/java/org/neo4j/driver/exceptions/DiscoveryException.java index 7a5e58fc51..bbb4a87e4f 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/DiscoveryException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/DiscoveryException.java @@ -17,7 +17,7 @@ package org.neo4j.driver.exceptions; import java.io.Serial; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * An error has happened while getting routing table with a remote server. diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/FatalDiscoveryException.java b/driver/src/main/java/org/neo4j/driver/exceptions/FatalDiscoveryException.java index 464b012106..f94a6ee822 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/FatalDiscoveryException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/FatalDiscoveryException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/Neo4jException.java b/driver/src/main/java/org/neo4j/driver/exceptions/Neo4jException.java index 7695cd355f..fe53c7b680 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/Neo4jException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/Neo4jException.java @@ -21,7 +21,7 @@ import java.util.Objects; import java.util.Optional; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.types.TypeSystem; import org.neo4j.driver.util.Preview; diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/ProtocolException.java b/driver/src/main/java/org/neo4j/driver/exceptions/ProtocolException.java index 077555c79c..7c3f78ef9c 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/ProtocolException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/ProtocolException.java @@ -17,7 +17,7 @@ package org.neo4j.driver.exceptions; import java.io.Serial; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * A signal that the contract for client-server communication has broken down. diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/ResultConsumedException.java b/driver/src/main/java/org/neo4j/driver/exceptions/ResultConsumedException.java index c0fb6d04b8..c58adb3ff8 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/ResultConsumedException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/ResultConsumedException.java @@ -18,7 +18,7 @@ import java.io.Serial; import org.neo4j.driver.QueryRunner; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * A user is trying to access resources that are no longer valid due to diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/SecurityException.java b/driver/src/main/java/org/neo4j/driver/exceptions/SecurityException.java index 822d132040..98e8fc5548 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/SecurityException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/SecurityException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/ServiceUnavailableException.java b/driver/src/main/java/org/neo4j/driver/exceptions/ServiceUnavailableException.java index 0fe4335cab..d137f0fafa 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/ServiceUnavailableException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/ServiceUnavailableException.java @@ -17,7 +17,7 @@ package org.neo4j.driver.exceptions; import java.io.Serial; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * An ServiceUnavailableException indicates that the driver cannot communicate with the cluster. diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/SessionExpiredException.java b/driver/src/main/java/org/neo4j/driver/exceptions/SessionExpiredException.java index 7df4d370e2..34641c68ac 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/SessionExpiredException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/SessionExpiredException.java @@ -17,7 +17,7 @@ package org.neo4j.driver.exceptions; import java.io.Serial; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * A SessionExpiredException indicates that the session can no longer satisfy the criteria under which it was acquired, e.g. a server no longer accepts diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/TokenExpiredException.java b/driver/src/main/java/org/neo4j/driver/exceptions/TokenExpiredException.java index bb020ef8a2..97bc0654ff 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/TokenExpiredException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/TokenExpiredException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/TransactionNestingException.java b/driver/src/main/java/org/neo4j/driver/exceptions/TransactionNestingException.java index 649bc467d3..0a4316ece3 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/TransactionNestingException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/TransactionNestingException.java @@ -17,7 +17,7 @@ package org.neo4j.driver.exceptions; import java.io.Serial; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * This exception indicates a user is nesting new transaction with an on-going transaction (unmanaged and/or auto-commit). diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/TransactionTerminatedException.java b/driver/src/main/java/org/neo4j/driver/exceptions/TransactionTerminatedException.java index f423ccc93f..5b4457fd09 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/TransactionTerminatedException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/TransactionTerminatedException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/TransientException.java b/driver/src/main/java/org/neo4j/driver/exceptions/TransientException.java index c448f29ff9..8c221fa4a9 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/TransientException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/TransientException.java @@ -19,7 +19,7 @@ import java.io.Serial; import java.util.Map; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.util.Preview; /** diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/UnsupportedFeatureException.java b/driver/src/main/java/org/neo4j/driver/exceptions/UnsupportedFeatureException.java index 0c5daa54d2..6bc517abab 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/UnsupportedFeatureException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/UnsupportedFeatureException.java @@ -17,7 +17,7 @@ package org.neo4j.driver.exceptions; import java.io.Serial; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * A feature is not supported in a given setup. diff --git a/driver/src/main/java/org/neo4j/driver/exceptions/value/ValueException.java b/driver/src/main/java/org/neo4j/driver/exceptions/value/ValueException.java index 6253494c72..edbd0a6bd3 100644 --- a/driver/src/main/java/org/neo4j/driver/exceptions/value/ValueException.java +++ b/driver/src/main/java/org/neo4j/driver/exceptions/value/ValueException.java @@ -18,7 +18,7 @@ import java.io.Serial; import org.neo4j.driver.exceptions.ClientException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * A ValueException indicates that the client has carried out an operation on values incorrectly. diff --git a/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java b/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java index bdf96552b3..b93b358c4f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java +++ b/driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java @@ -48,11 +48,11 @@ import org.neo4j.driver.internal.bolt.api.DomainNameResolver; import org.neo4j.driver.internal.bolt.api.LoggingProvider; import org.neo4j.driver.internal.bolt.api.RoutingContext; +import org.neo4j.driver.internal.bolt.basicimpl.BootstrapFactory; import org.neo4j.driver.internal.bolt.basicimpl.NettyBoltConnectionProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.BootstrapFactory; import org.neo4j.driver.internal.bolt.pooledimpl.PooledBoltConnectionProvider; +import org.neo4j.driver.internal.bolt.routedimpl.Rediscovery; import org.neo4j.driver.internal.bolt.routedimpl.RoutedBoltConnectionProvider; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.Rediscovery; import org.neo4j.driver.internal.metrics.DevNullMetricsProvider; import org.neo4j.driver.internal.metrics.InternalMetricsProvider; import org.neo4j.driver.internal.metrics.MetricsProvider; @@ -63,6 +63,7 @@ import org.neo4j.driver.internal.security.SecurityPlan; import org.neo4j.driver.internal.security.SecurityPlans; import org.neo4j.driver.internal.util.DriverInfoUtil; +import org.neo4j.driver.internal.value.BoltValueFactory; import org.neo4j.driver.net.ServerAddress; public class DriverFactory { @@ -222,7 +223,7 @@ private DriverBoltConnectionProvider createBoltConnectionProvider( if (uri.getScheme().startsWith("bolt")) { assertNoRoutingContext(uri, routingSettings); boltConnectionProvider = new AdaptingDriverBoltConnectionProvider( - pooledBoltConnectionProviderSupplier.get(), errorMapper, false); + pooledBoltConnectionProviderSupplier.get(), errorMapper, BoltValueFactory.getInstance(), false); } else { boltConnectionProvider = new AdaptingDriverBoltConnectionProvider( createRoutedBoltConnectionProvider( @@ -233,6 +234,7 @@ private DriverBoltConnectionProvider createBoltConnectionProvider( clock, loggingProvider), errorMapper, + BoltValueFactory.getInstance(), true); } return boltConnectionProvider; @@ -273,7 +275,12 @@ private BoltConnectionProvider createPooledBoltConnectionProvider( private BoltConnectionProvider createNettyBoltConnectionProvider( EventLoopGroup eventLoopGroup, Clock clock, LoggingProvider loggingProvider) { return new NettyBoltConnectionProvider( - eventLoopGroup, clock, getDomainNameResolver(), localAddress(), loggingProvider); + eventLoopGroup, + clock, + getDomainNameResolver(), + localAddress(), + loggingProvider, + BoltValueFactory.getInstance()); } @SuppressWarnings("SameReturnValue") diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/GqlStatusError.java b/driver/src/main/java/org/neo4j/driver/internal/GqlStatusError.java similarity index 97% rename from driver/src/main/java/org/neo4j/driver/internal/bolt/api/GqlStatusError.java rename to driver/src/main/java/org/neo4j/driver/internal/GqlStatusError.java index 4634cc051c..072fac8322 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/api/GqlStatusError.java +++ b/driver/src/main/java/org/neo4j/driver/internal/GqlStatusError.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.neo4j.driver.internal.bolt.api; +package org.neo4j.driver.internal; import java.util.Map; import org.neo4j.driver.Value; diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalIsoDuration.java b/driver/src/main/java/org/neo4j/driver/internal/InternalIsoDuration.java index d0d4664d80..7cc9b5e587 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalIsoDuration.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalIsoDuration.java @@ -30,7 +30,7 @@ import java.util.Objects; import org.neo4j.driver.types.IsoDuration; -public class InternalIsoDuration implements IsoDuration { +public class InternalIsoDuration implements IsoDuration, org.neo4j.driver.internal.bolt.api.values.IsoDuration { private static final long NANOS_PER_SECOND = 1_000_000_000; private static final List SUPPORTED_UNITS = List.of(MONTHS, DAYS, SECONDS, NANOS); diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalNode.java b/driver/src/main/java/org/neo4j/driver/internal/InternalNode.java index cdcea9eda7..b39b8da698 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalNode.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalNode.java @@ -26,7 +26,7 @@ /** * {@link Node} implementation that directly contains labels and properties. */ -public class InternalNode extends InternalEntity implements Node { +public class InternalNode extends InternalEntity implements Node, org.neo4j.driver.internal.bolt.api.values.Node { private final Collection labels; public InternalNode(long id) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalPath.java b/driver/src/main/java/org/neo4j/driver/internal/InternalPath.java index 4f7175519a..b34d32a549 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalPath.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalPath.java @@ -31,8 +31,9 @@ /** * {@link Path} implementation that directly contains all nodes and relationships. */ -public class InternalPath implements Path, AsValue { - public record SelfContainedSegment(Node start, Relationship relationship, Node end) implements Segment { +public class InternalPath implements Path, AsValue, org.neo4j.driver.internal.bolt.api.values.Path { + public record SelfContainedSegment(Node start, Relationship relationship, Node end) + implements Segment, org.neo4j.driver.internal.bolt.api.values.Segment { @Override public boolean equals(Object other) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalPoint2D.java b/driver/src/main/java/org/neo4j/driver/internal/InternalPoint2D.java index 86489bbf1f..7e2980eb44 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalPoint2D.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalPoint2D.java @@ -18,7 +18,8 @@ import org.neo4j.driver.types.Point; -public record InternalPoint2D(int srid, double x, double y) implements Point { +public record InternalPoint2D(int srid, double x, double y) + implements Point, org.neo4j.driver.internal.bolt.api.values.Point { @Override public double z() { diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalPoint3D.java b/driver/src/main/java/org/neo4j/driver/internal/InternalPoint3D.java index eb6d8b9435..7b83421c90 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalPoint3D.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalPoint3D.java @@ -18,7 +18,8 @@ import org.neo4j.driver.types.Point; -public record InternalPoint3D(int srid, double x, double y, double z) implements Point { +public record InternalPoint3D(int srid, double x, double y, double z) + implements Point, org.neo4j.driver.internal.bolt.api.values.Point { @Override public boolean equals(Object o) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalRelationship.java b/driver/src/main/java/org/neo4j/driver/internal/InternalRelationship.java index 16891efbfa..7d37805601 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalRelationship.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalRelationship.java @@ -25,7 +25,8 @@ /** * {@link Relationship} implementation that directly contains type and properties. */ -public class InternalRelationship extends InternalEntity implements Relationship { +public class InternalRelationship extends InternalEntity + implements Relationship, org.neo4j.driver.internal.bolt.api.values.Relationship { private long start; private String startElementId; private long end; diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalResult.java b/driver/src/main/java/org/neo4j/driver/internal/InternalResult.java index 7c556f2adf..24aa8f90a8 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalResult.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalResult.java @@ -29,7 +29,6 @@ import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.exceptions.NoSuchRecordException; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.util.Futures; import org.neo4j.driver.summary.ResultSummary; diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalSession.java b/driver/src/main/java/org/neo4j/driver/internal/InternalSession.java index ec2423c26d..c8ff81888c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalSession.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalSession.java @@ -32,7 +32,6 @@ import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.async.NetworkSession; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.telemetry.ApiTelemetryWork; import org.neo4j.driver.internal.util.Futures; diff --git a/driver/src/main/java/org/neo4j/driver/internal/ValidatingClientCertificateManager.java b/driver/src/main/java/org/neo4j/driver/internal/ValidatingClientCertificateManager.java index ecce603853..c0747c6c5d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/ValidatingClientCertificateManager.java +++ b/driver/src/main/java/org/neo4j/driver/internal/ValidatingClientCertificateManager.java @@ -21,7 +21,6 @@ import org.neo4j.driver.ClientCertificate; import org.neo4j.driver.ClientCertificateManager; import org.neo4j.driver.exceptions.ClientException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; public class ValidatingClientCertificateManager implements ClientCertificateManager { private final ClientCertificateManager delegate; diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnection.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnection.java index 3db3649b4b..e1e41b97c1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnection.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnection.java @@ -32,14 +32,18 @@ import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.bolt.api.TransactionType; +import org.neo4j.driver.internal.value.BoltValueFactory; final class AdaptingDriverBoltConnection implements DriverBoltConnection { private final BoltConnection connection; private final ErrorMapper errorMapper; + private final BoltValueFactory boltValueFactory; - AdaptingDriverBoltConnection(BoltConnection connection, ErrorMapper errorMapper) { + AdaptingDriverBoltConnection( + BoltConnection connection, ErrorMapper errorMapper, BoltValueFactory boltValueFactory) { this.connection = Objects.requireNonNull(connection); this.errorMapper = Objects.requireNonNull(errorMapper); + this.boltValueFactory = Objects.requireNonNull(boltValueFactory); } @Override @@ -75,7 +79,7 @@ public CompletionStage beginTransaction( bookmarks, transactionType, txTimeout, - txMetadata, + boltValueFactory.toBoltMap(txMetadata), txType, notificationConfig) .exceptionally(errorMapper::mapAndTrow) @@ -100,9 +104,9 @@ public CompletionStage runInAutoCommitTransaction( impersonatedUser, bookmarks, query, - parameters, + boltValueFactory.toBoltMap(parameters), txTimeout, - txMetadata, + boltValueFactory.toBoltMap(txMetadata), notificationConfig) .exceptionally(errorMapper::mapAndTrow) .thenApply(ignored -> this); @@ -111,7 +115,7 @@ public CompletionStage runInAutoCommitTransaction( @Override public CompletionStage run(String query, Map parameters) { return connection - .run(query, parameters) + .run(query, boltValueFactory.toBoltMap(parameters)) .exceptionally(errorMapper::mapAndTrow) .thenApply(ignored -> this); } @@ -154,7 +158,10 @@ public CompletionStage logoff() { @Override public CompletionStage logon(Map authMap) { - return connection.logon(authMap).exceptionally(errorMapper::mapAndTrow).thenApply(ignored -> this); + return connection + .logon(boltValueFactory.toBoltMap(authMap)) + .exceptionally(errorMapper::mapAndTrow) + .thenApply(ignored -> this); } @Override @@ -173,7 +180,7 @@ public CompletionStage clear() { @Override public CompletionStage flush(DriverResponseHandler handler) { return connection - .flush(new AdaptingDriverResponseHandler(handler, errorMapper)) + .flush(new AdaptingDriverResponseHandler(handler, errorMapper, boltValueFactory)) .exceptionally(errorMapper::mapAndTrow); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnectionProvider.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnectionProvider.java index dd40cfd2bc..bf5eab9fee 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnectionProvider.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverBoltConnectionProvider.java @@ -33,16 +33,22 @@ import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.RoutingContext; import org.neo4j.driver.internal.bolt.api.SecurityPlan; +import org.neo4j.driver.internal.value.BoltValueFactory; public class AdaptingDriverBoltConnectionProvider implements DriverBoltConnectionProvider { private final BoltConnectionProvider delegate; private final ErrorMapper errorMapper; + private final BoltValueFactory boltValueFactory; private final boolean routed; public AdaptingDriverBoltConnectionProvider( - BoltConnectionProvider delegate, ErrorMapper errorMapper, boolean routed) { + BoltConnectionProvider delegate, + ErrorMapper errorMapper, + BoltValueFactory boltValueFactory, + boolean routed) { this.delegate = Objects.requireNonNull(delegate); this.errorMapper = Objects.requireNonNull(errorMapper); + this.boltValueFactory = Objects.requireNonNull(boltValueFactory); this.routed = routed; } @@ -72,7 +78,7 @@ public CompletionStage connect( return delegate.connect( securityPlan, databaseName, - authMapStageSupplier, + () -> authMapStageSupplier.get().thenApply(boltValueFactory::toBoltMap), mode, bookmarks, impersonatedUser, @@ -82,22 +88,26 @@ public CompletionStage connect( .exceptionally(errorMapper::mapAndTrow) .thenApply(boltConnection -> new AdaptingDriverBoltConnection( boltConnection, - routed ? new RoutedErrorMapper(boltConnection.serverAddress(), mode) : errorMapper)); + routed ? new RoutedErrorMapper(boltConnection.serverAddress(), mode) : errorMapper, + boltValueFactory)); } @Override public CompletionStage verifyConnectivity(SecurityPlan securityPlan, Map authMap) { - return delegate.verifyConnectivity(securityPlan, authMap).exceptionally(errorMapper::mapAndTrow); + return delegate.verifyConnectivity(securityPlan, boltValueFactory.toBoltMap(authMap)) + .exceptionally(errorMapper::mapAndTrow); } @Override public CompletionStage supportsMultiDb(SecurityPlan securityPlan, Map authMap) { - return delegate.supportsMultiDb(securityPlan, authMap).exceptionally(errorMapper::mapAndTrow); + return delegate.supportsMultiDb(securityPlan, boltValueFactory.toBoltMap(authMap)) + .exceptionally(errorMapper::mapAndTrow); } @Override public CompletionStage supportsSessionAuth(SecurityPlan securityPlan, Map authMap) { - return delegate.supportsSessionAuth(securityPlan, authMap).exceptionally(errorMapper::mapAndTrow); + return delegate.supportsSessionAuth(securityPlan, boltValueFactory.toBoltMap(authMap)) + .exceptionally(errorMapper::mapAndTrow); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java index 86f1fa5315..a47aaa0512 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java @@ -16,6 +16,8 @@ */ package org.neo4j.driver.internal.adaptedbolt; +import java.util.Arrays; +import java.util.Map; import java.util.Objects; import org.neo4j.driver.Value; import org.neo4j.driver.internal.bolt.api.ResponseHandler; @@ -30,14 +32,19 @@ import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; +import org.neo4j.driver.internal.value.BoltValue; +import org.neo4j.driver.internal.value.BoltValueFactory; final class AdaptingDriverResponseHandler implements ResponseHandler { private final DriverResponseHandler delegate; private final ErrorMapper errorMapper; + private final BoltValueFactory boltValueFactory; - AdaptingDriverResponseHandler(DriverResponseHandler delegate, ErrorMapper errorMapper) { + AdaptingDriverResponseHandler( + DriverResponseHandler delegate, ErrorMapper errorMapper, BoltValueFactory boltValueFactory) { this.delegate = Objects.requireNonNull(delegate); this.errorMapper = Objects.requireNonNull(errorMapper); + this.boltValueFactory = Objects.requireNonNull(boltValueFactory); } @Override @@ -56,18 +63,31 @@ public void onRunSummary(RunSummary summary) { } @Override - public void onRecord(Value[] fields) { - delegate.onRecord(fields); + public void onRecord(org.neo4j.driver.internal.bolt.api.values.Value[] fields) { + var mappedFields = Arrays.stream(fields) + .map(field -> ((BoltValue) field).asDriverValue()) + .toArray(Value[]::new); + delegate.onRecord(mappedFields); } @Override public void onPullSummary(PullSummary summary) { - delegate.onPullSummary(summary); + delegate.onPullSummary(new org.neo4j.driver.internal.adaptedbolt.summary.PullSummary() { + @Override + public boolean hasMore() { + return summary.hasMore(); + } + + @Override + public Map metadata() { + return boltValueFactory.toDriverMap(summary.metadata()); + } + }); } @Override public void onDiscardSummary(DiscardSummary summary) { - delegate.onDiscardSummary(summary); + delegate.onDiscardSummary(() -> boltValueFactory.toDriverMap(summary.metadata())); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java index b55b0e4822..0c4a16506f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java @@ -23,12 +23,12 @@ import java.util.concurrent.CompletionStage; import org.neo4j.driver.Value; import org.neo4j.driver.exceptions.Neo4jException; +import org.neo4j.driver.internal.adaptedbolt.summary.DiscardSummary; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; -import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; import org.neo4j.driver.internal.bolt.api.summary.LogoffSummary; import org.neo4j.driver.internal.bolt.api.summary.LogonSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.ResetSummary; import org.neo4j.driver.internal.bolt.api.summary.RollbackSummary; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java index 58bdc4237c..a6224f1d77 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java @@ -17,12 +17,12 @@ package org.neo4j.driver.internal.adaptedbolt; import org.neo4j.driver.Value; +import org.neo4j.driver.internal.adaptedbolt.summary.DiscardSummary; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; -import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; import org.neo4j.driver.internal.bolt.api.summary.LogoffSummary; import org.neo4j.driver.internal.bolt.api.summary.LogonSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.ResetSummary; import org.neo4j.driver.internal.bolt.api.summary.RollbackSummary; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapper.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapper.java index bdf469025d..44c8c0f23f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapper.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapper.java @@ -37,7 +37,7 @@ import org.neo4j.driver.exceptions.TransientException; import org.neo4j.driver.exceptions.UnsupportedFeatureException; import org.neo4j.driver.exceptions.UntrustedServerException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; import org.neo4j.driver.internal.bolt.api.exception.BoltConnectionAcquisitionException; import org.neo4j.driver.internal.bolt.api.exception.BoltConnectionReadTimeoutException; @@ -50,9 +50,11 @@ import org.neo4j.driver.internal.bolt.api.exception.BoltUnsupportedFeatureException; import org.neo4j.driver.internal.bolt.api.exception.BoltUntrustedServerException; import org.neo4j.driver.internal.util.Futures; +import org.neo4j.driver.internal.value.BoltValueFactory; public class ErrorMapper { private static final ErrorMapper INSTANCE = new ErrorMapper(); + private static final BoltValueFactory BOLT_VALUE_FACTORY = BoltValueFactory.getInstance(); public static ErrorMapper getInstance() { return INSTANCE; @@ -147,7 +149,7 @@ yield new TransactionTerminatedException( boltFailureException.statusDescription(), "Neo.ClientError.Transaction.Terminated", boltFailureException.getMessage(), - boltFailureException.diagnosticRecord(), + BOLT_VALUE_FACTORY.toDriverMap(boltFailureException.diagnosticRecord()), nested); } else if ("Neo.TransientError.Transaction.LockClientStopped".equals(code)) { yield new ClientException( @@ -155,7 +157,7 @@ yield new ClientException( boltFailureException.statusDescription(), "Neo.ClientError.Transaction.LockClientStopped", boltFailureException.getMessage(), - boltFailureException.diagnosticRecord(), + BOLT_VALUE_FACTORY.toDriverMap(boltFailureException.diagnosticRecord()), nested); } else { yield mapToNeo4jException(TransientException::new, boltFailureException, nested); @@ -171,7 +173,7 @@ protected Throwable mapGqlCause(BoltGqlErrorException boltGqlErrorException) { boltGqlErrorException.statusDescription(), "N/A", boltGqlErrorException.getMessage(), - boltGqlErrorException.diagnosticRecord(), + BOLT_VALUE_FACTORY.toDriverMap(boltGqlErrorException.diagnosticRecord()), boltGqlErrorException.gqlCause().map(this::mapGqlCause).orElse(null)); } @@ -222,7 +224,7 @@ private T mapToNeo4jException( boltFailureException.statusDescription(), boltFailureException.code(), boltFailureException.getMessage(), - boltFailureException.diagnosticRecord(), + BOLT_VALUE_FACTORY.toDriverMap(boltFailureException.diagnosticRecord()), cause); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/RoutedErrorMapper.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/RoutedErrorMapper.java index a0e4923b99..971037d7d6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/RoutedErrorMapper.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/RoutedErrorMapper.java @@ -21,9 +21,9 @@ import java.util.Objects; import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.exceptions.SessionExpiredException; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.exception.BoltFailureException; import org.neo4j.driver.internal.bolt.api.exception.BoltServiceUnavailableException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/summary/DiscardSummary.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/summary/DiscardSummary.java new file mode 100644 index 0000000000..af8bac1460 --- /dev/null +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/summary/DiscardSummary.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.adaptedbolt.summary; + +import java.util.Map; +import org.neo4j.driver.Value; + +public interface DiscardSummary { + Map metadata(); +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/summary/PullSummary.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/summary/PullSummary.java new file mode 100644 index 0000000000..31575c4ccc --- /dev/null +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/summary/PullSummary.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.adaptedbolt.summary; + +import java.util.Map; +import org.neo4j.driver.Value; + +public interface PullSummary { + boolean hasMore(); + + Map metadata(); +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/BoltConnectionWithAuthTokenManager.java b/driver/src/main/java/org/neo4j/driver/internal/async/BoltConnectionWithAuthTokenManager.java index 6bacdc1ce7..3880973a6c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/BoltConnectionWithAuthTokenManager.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/BoltConnectionWithAuthTokenManager.java @@ -24,6 +24,7 @@ import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; import org.neo4j.driver.internal.security.InternalAuthToken; +import org.neo4j.driver.internal.value.BoltValueFactory; final class BoltConnectionWithAuthTokenManager extends DelegatingBoltConnection { private final AuthTokenManager authTokenManager; @@ -43,7 +44,8 @@ private Throwable mapSecurityError(Throwable throwable) { var authData = delegate.authData().toCompletableFuture().getNow(null); if (authData != null && authTokenManager.handleSecurityException( - new InternalAuthToken(authData.authMap()), securityException)) { + new InternalAuthToken(BoltValueFactory.getInstance().toDriverMap(authData.authMap())), + securityException)) { throwable = new SecurityRetryableException(securityException); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java index e063fbaf50..32e63ba17d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java @@ -19,12 +19,12 @@ import java.util.Objects; import org.neo4j.driver.Value; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; +import org.neo4j.driver.internal.adaptedbolt.summary.DiscardSummary; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; -import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; import org.neo4j.driver.internal.bolt.api.summary.LogoffSummary; import org.neo4j.driver.internal.bolt.api.summary.LogonSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.ResetSummary; import org.neo4j.driver.internal.bolt.api.summary.RollbackSummary; import org.neo4j.driver.internal.bolt.api.summary.RouteSummary; diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/InternalAsyncSession.java b/driver/src/main/java/org/neo4j/driver/internal/async/InternalAsyncSession.java index d0c6466dc2..53a34ae5ae 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/InternalAsyncSession.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/InternalAsyncSession.java @@ -34,8 +34,8 @@ import org.neo4j.driver.async.AsyncTransactionWork; import org.neo4j.driver.async.ResultCursor; import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.InternalBookmark; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.telemetry.ApiTelemetryWork; import org.neo4j.driver.internal.util.Futures; 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 153156e6e8..db580425b5 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 @@ -54,6 +54,7 @@ import org.neo4j.driver.exceptions.UnsupportedFeatureException; import org.neo4j.driver.internal.DatabaseBookmark; import org.neo4j.driver.internal.FailableCursor; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.NotificationConfigMapper; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionProvider; @@ -61,7 +62,6 @@ import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.DatabaseNameUtil; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.bolt.api.exception.MinVersionAcquisitionException; diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java b/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java index 46e3c0234e..8daa471bd7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/UnmanagedTransaction.java @@ -44,12 +44,12 @@ import org.neo4j.driver.exceptions.Neo4jException; import org.neo4j.driver.exceptions.TransactionTerminatedException; import org.neo4j.driver.internal.DatabaseBookmark; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.adaptedbolt.BasicResponseHandler; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.DatabaseName; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.NotificationConfig; import org.neo4j.driver.internal.bolt.api.TransactionType; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageWriterV3.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageWriterV3.java deleted file mode 100644 index 5dfbd182e5..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageWriterV3.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v3; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardAllMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullAllMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -public class MessageWriterV3 extends AbstractMessageWriter { - public MessageWriterV3(PackOutput output) { - super(new CommonValuePacker(output, false), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.of( - HelloMessage.SIGNATURE, new HelloMessageEncoder(), - GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), - RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), - DiscardAllMessage.SIGNATURE, new DiscardAllMessageEncoder(), - PullAllMessage.SIGNATURE, new PullAllMessageEncoder(), - BeginMessage.SIGNATURE, new BeginMessageEncoder(), - CommitMessage.SIGNATURE, new CommitMessageEncoder(), - RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), - ResetMessage.SIGNATURE, new ResetMessageEncoder()); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageWriterV4.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageWriterV4.java deleted file mode 100644 index 9797270563..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageWriterV4.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v4; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -public class MessageWriterV4 extends AbstractMessageWriter { - public MessageWriterV4(PackOutput output) { - super(new CommonValuePacker(output, false), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.of( - HelloMessage.SIGNATURE, new HelloMessageEncoder(), - GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), - RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), - DiscardMessage.SIGNATURE, new DiscardMessageEncoder(), - PullMessage.SIGNATURE, new PullMessageEncoder(), - BeginMessage.SIGNATURE, new BeginMessageEncoder(), - CommitMessage.SIGNATURE, new CommitMessageEncoder(), - RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), - ResetMessage.SIGNATURE, new ResetMessageEncoder()); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageWriterV43.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageWriterV43.java deleted file mode 100644 index 27a4549d9f..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageWriterV43.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v43; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RouteMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -/** - * Bolt message writer v4.3 - *

- * This version is able to encode all the versions existing on v4.2, but it encodes - * new messages such as ROUTE - */ -public class MessageWriterV43 extends AbstractMessageWriter { - public MessageWriterV43(PackOutput output, boolean dateTimeUtcEnabled) { - super(new CommonValuePacker(output, dateTimeUtcEnabled), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.of( - HelloMessage.SIGNATURE, new HelloMessageEncoder(), - GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), - RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), - RouteMessage.SIGNATURE, new RouteMessageEncoder(), - DiscardMessage.SIGNATURE, new DiscardMessageEncoder(), - PullMessage.SIGNATURE, new PullMessageEncoder(), - BeginMessage.SIGNATURE, new BeginMessageEncoder(), - CommitMessage.SIGNATURE, new CommitMessageEncoder(), - RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), - ResetMessage.SIGNATURE, new ResetMessageEncoder()); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageWriterV44.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageWriterV44.java deleted file mode 100644 index 48b10d381d..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageWriterV44.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v44; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RouteV44MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -/** - * Bolt message writer v4.4 - */ -public class MessageWriterV44 extends AbstractMessageWriter { - public MessageWriterV44(PackOutput output, boolean dateTimeUtcEnabled) { - super(new CommonValuePacker(output, dateTimeUtcEnabled), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.of( - HelloMessage.SIGNATURE, new HelloMessageEncoder(), - GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder(), - RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder(), - RouteMessage.SIGNATURE, new RouteV44MessageEncoder(), - DiscardMessage.SIGNATURE, new DiscardMessageEncoder(), - PullMessage.SIGNATURE, new PullMessageEncoder(), - BeginMessage.SIGNATURE, new BeginMessageEncoder(), - CommitMessage.SIGNATURE, new CommitMessageEncoder(), - RollbackMessage.SIGNATURE, new RollbackMessageEncoder(), - ResetMessage.SIGNATURE, new ResetMessageEncoder()); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageWriterV5.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageWriterV5.java deleted file mode 100644 index bb4e68caa5..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageWriterV5.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v5; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RouteV44MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -public class MessageWriterV5 extends AbstractMessageWriter { - public MessageWriterV5(PackOutput output) { - super(new CommonValuePacker(output, true), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.ofEntries( - Map.entry(HelloMessage.SIGNATURE, new HelloMessageEncoder()), - Map.entry(GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder()), - Map.entry(RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder()), - Map.entry(RouteMessage.SIGNATURE, new RouteV44MessageEncoder()), - Map.entry(DiscardMessage.SIGNATURE, new DiscardMessageEncoder()), - Map.entry(PullMessage.SIGNATURE, new PullMessageEncoder()), - Map.entry(BeginMessage.SIGNATURE, new BeginMessageEncoder()), - Map.entry(CommitMessage.SIGNATURE, new CommitMessageEncoder()), - Map.entry(RollbackMessage.SIGNATURE, new RollbackMessageEncoder()), - Map.entry(ResetMessage.SIGNATURE, new ResetMessageEncoder())); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageWriterV51.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageWriterV51.java deleted file mode 100644 index 6aee451d80..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v51/MessageWriterV51.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v51; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.LogoffMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.LogonMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RouteV44MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogoffMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -public class MessageWriterV51 extends AbstractMessageWriter { - public MessageWriterV51(PackOutput output) { - super(new CommonValuePacker(output, true), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.ofEntries( - Map.entry(HelloMessage.SIGNATURE, new HelloMessageEncoder()), - Map.entry(LogonMessage.SIGNATURE, new LogonMessageEncoder()), - Map.entry(LogoffMessage.SIGNATURE, new LogoffMessageEncoder()), - Map.entry(GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder()), - Map.entry(RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder()), - Map.entry(RouteMessage.SIGNATURE, new RouteV44MessageEncoder()), - Map.entry(DiscardMessage.SIGNATURE, new DiscardMessageEncoder()), - Map.entry(PullMessage.SIGNATURE, new PullMessageEncoder()), - Map.entry(BeginMessage.SIGNATURE, new BeginMessageEncoder()), - Map.entry(CommitMessage.SIGNATURE, new CommitMessageEncoder()), - Map.entry(RollbackMessage.SIGNATURE, new RollbackMessageEncoder()), - Map.entry(ResetMessage.SIGNATURE, new ResetMessageEncoder())); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageWriterV54.java b/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageWriterV54.java deleted file mode 100644 index fc2d549d79..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v54/MessageWriterV54.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v54; - -import java.util.Map; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.AbstractMessageWriter; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.common.CommonValuePacker; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.BeginMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.CommitMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.DiscardMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.GoodbyeMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.HelloMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.LogoffMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.LogonMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.PullMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.ResetMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RollbackMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RouteV44MessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.RunWithMetadataMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.encode.TelemetryMessageEncoder; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.BeginMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.CommitMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.GoodbyeMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.HelloMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogoffMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.LogonMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.PullMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.ResetMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RollbackMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RouteMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.RunWithMetadataMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.TelemetryMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackOutput; - -public class MessageWriterV54 extends AbstractMessageWriter { - public MessageWriterV54(PackOutput output) { - super(new CommonValuePacker(output, true), buildEncoders()); - } - - private static Map buildEncoders() { - return Map.ofEntries( - Map.entry(HelloMessage.SIGNATURE, new HelloMessageEncoder()), - Map.entry(LogonMessage.SIGNATURE, new LogonMessageEncoder()), - Map.entry(LogoffMessage.SIGNATURE, new LogoffMessageEncoder()), - Map.entry(GoodbyeMessage.SIGNATURE, new GoodbyeMessageEncoder()), - Map.entry(RunWithMetadataMessage.SIGNATURE, new RunWithMetadataMessageEncoder()), - Map.entry(RouteMessage.SIGNATURE, new RouteV44MessageEncoder()), - Map.entry(DiscardMessage.SIGNATURE, new DiscardMessageEncoder()), - Map.entry(PullMessage.SIGNATURE, new PullMessageEncoder()), - Map.entry(BeginMessage.SIGNATURE, new BeginMessageEncoder()), - Map.entry(CommitMessage.SIGNATURE, new CommitMessageEncoder()), - Map.entry(RollbackMessage.SIGNATURE, new RollbackMessageEncoder()), - Map.entry(ResetMessage.SIGNATURE, new ResetMessageEncoder()), - Map.entry(TelemetryMessage.SIGNATURE, new TelemetryMessageEncoder())); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/cursor/AbstractRecordStateResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/cursor/AbstractRecordStateResponseHandler.java index 1dc3edd2be..491ebcf0c0 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cursor/AbstractRecordStateResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cursor/AbstractRecordStateResponseHandler.java @@ -18,7 +18,7 @@ import java.util.List; import org.neo4j.driver.exceptions.ClientException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.summary.InternalGqlStatusObject; import org.neo4j.driver.summary.GqlStatusObject; diff --git a/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java b/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java index d9a84b4c5c..8235cff7cb 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java @@ -38,15 +38,15 @@ import org.neo4j.driver.exceptions.NoSuchRecordException; import org.neo4j.driver.internal.DatabaseBookmark; import org.neo4j.driver.internal.FailableCursor; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.InternalRecord; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; +import org.neo4j.driver.internal.adaptedbolt.summary.DiscardSummary; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.async.UnmanagedTransaction; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; -import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.bolt.api.summary.TelemetrySummary; import org.neo4j.driver.internal.telemetry.ApiTelemetryWork; diff --git a/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java b/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java index 173dd72917..7870787641 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java @@ -38,13 +38,13 @@ import org.neo4j.driver.exceptions.Neo4jException; import org.neo4j.driver.exceptions.TransactionNestingException; import org.neo4j.driver.internal.DatabaseBookmark; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.InternalRecord; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; +import org.neo4j.driver.internal.adaptedbolt.summary.DiscardSummary; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; -import org.neo4j.driver.internal.bolt.api.summary.DiscardSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.util.Futures; import org.neo4j.driver.internal.util.MetadataExtractor; diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/DevNullMetricsProvider.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/DevNullMetricsProvider.java index 67659be895..70c9365669 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/DevNullMetricsProvider.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/DevNullMetricsProvider.java @@ -18,7 +18,7 @@ import org.neo4j.driver.Metrics; import org.neo4j.driver.exceptions.ClientException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.bolt.api.MetricsListener; public enum DevNullMetricsProvider implements MetricsProvider { diff --git a/driver/src/main/java/org/neo4j/driver/internal/reactive/AbstractReactiveSession.java b/driver/src/main/java/org/neo4j/driver/internal/reactive/AbstractReactiveSession.java index de112b2781..26d1eb890c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/reactive/AbstractReactiveSession.java +++ b/driver/src/main/java/org/neo4j/driver/internal/reactive/AbstractReactiveSession.java @@ -31,9 +31,9 @@ import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.exceptions.TransactionNestingException; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.async.NetworkSession; import org.neo4j.driver.internal.async.UnmanagedTransaction; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.cursor.RxResultCursor; import org.neo4j.driver.internal.telemetry.ApiTelemetryWork; diff --git a/driver/src/main/java/org/neo4j/driver/internal/security/SSLContextManager.java b/driver/src/main/java/org/neo4j/driver/internal/security/SSLContextManager.java index dad6bc6f74..f912108e0a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/security/SSLContextManager.java +++ b/driver/src/main/java/org/neo4j/driver/internal/security/SSLContextManager.java @@ -37,8 +37,8 @@ import org.neo4j.driver.Logger; import org.neo4j.driver.Logging; import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.InternalClientCertificate; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.pki.PemParser; import org.neo4j.driver.internal.util.Futures; diff --git a/driver/src/main/java/org/neo4j/driver/internal/security/SecurityPlans.java b/driver/src/main/java/org/neo4j/driver/internal/security/SecurityPlans.java index 7ce56b735e..3e46afee68 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/security/SecurityPlans.java +++ b/driver/src/main/java/org/neo4j/driver/internal/security/SecurityPlans.java @@ -27,9 +27,9 @@ import org.neo4j.driver.Logging; import org.neo4j.driver.RevocationCheckingStrategy; import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.Scheme; import org.neo4j.driver.internal.SecuritySettings; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; public class SecurityPlans { public static SecurityPlan createSecurityPlan( 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 da9ec01552..4bab39f609 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 @@ -22,7 +22,7 @@ import org.neo4j.driver.exceptions.Neo4jException; import org.neo4j.driver.exceptions.ResultConsumedException; import org.neo4j.driver.exceptions.ServiceUnavailableException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; public final class ErrorUtil { private ErrorUtil() {} diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java b/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java index f554710e14..ed38d9bff9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java @@ -33,8 +33,8 @@ import org.neo4j.driver.Record; import org.neo4j.driver.Value; import org.neo4j.driver.exceptions.ClientException; +import org.neo4j.driver.internal.GqlStatusError; import org.neo4j.driver.internal.InternalPair; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; import org.neo4j.driver.internal.value.NodeValue; import org.neo4j.driver.internal.value.PathValue; import org.neo4j.driver.internal.value.RelationshipValue; diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/Futures.java b/driver/src/main/java/org/neo4j/driver/internal/util/Futures.java index aca1ce60a0..2141955de7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/Futures.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/Futures.java @@ -26,7 +26,7 @@ import java.util.concurrent.Future; import java.util.function.BiConsumer; import java.util.function.BiFunction; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.EventLoopGroupFactory; +import org.neo4j.driver.internal.bolt.basicimpl.EventLoopThread; public final class Futures { private static final CompletableFuture COMPLETED_WITH_NULL = completedFuture(null); @@ -43,7 +43,7 @@ public static V blockingGet(CompletionStage stage) { } public static V blockingGet(CompletionStage stage, Runnable interruptHandler) { - EventLoopGroupFactory.assertNotInEventLoopThread(); + assertNotInEventLoopThread(); Future future = stage.toCompletableFuture(); var interrupted = false; @@ -138,6 +138,31 @@ public static BiConsumer futureCompletingConsumer(CompletableF }; } + /** + * Assert that current thread is not an event loop used for async IO operations. This check is needed because + * blocking API methods are implemented on top of corresponding async API methods. Deadlocks might happen when + * IO thread executes blocking API call and has to wait for itself to read from the network. + * + * @throws IllegalStateException when current thread is an event loop IO thread. + */ + public static void assertNotInEventLoopThread() throws IllegalStateException { + if (isEventLoopThread(Thread.currentThread())) { + throw new IllegalStateException( + "Blocking operation can't be executed in IO thread because it might result in a deadlock. " + + "Please do not use blocking API when chaining futures returned by async API methods."); + } + } + + /** + * Check if given thread is an event loop IO thread. + * + * @param thread the thread to check. + * @return {@code true} when given thread belongs to the event loop, {@code false} otherwise. + */ + public static boolean isEventLoopThread(Thread thread) { + return thread instanceof EventLoopThread; + } + private static void safeRun(Runnable runnable) { try { runnable.run(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java b/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java index 18fb7fecec..e2b20a71d3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/MetadataExtractor.java @@ -288,7 +288,6 @@ private static Stream extractGqlStatusObjects(Map keys() { + return value.keys(); + } + + @Override + public int size() { + return value.size(); + } + + @Override + public org.neo4j.driver.internal.bolt.api.values.Value get(String key) { + return ((InternalValue) value.get(key)).asBoltValue(); + } + + @Override + public Iterable values() { + return () -> new Iterator<>() { + private final Iterator iterator = + value.values().iterator(); + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Value next() { + return ((InternalValue) iterator.next()).asBoltValue(); + } + }; + } + + @Override + public boolean containsKey(String key) { + return value.containsKey(key); + } + + @Override + public Map asMap(Function mapFunction) { + return value.asMap(v -> mapFunction.apply(((InternalValue) v).asBoltValue())); + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + var boltValue = (BoltValue) o; + return Objects.equals(value, boltValue.value) && type == boltValue.type; + } + + @Override + public int hashCode() { + return Objects.hash(value, type); + } + + @Override + public String toString() { + return value.toString(); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java b/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java new file mode 100644 index 0000000000..08324c7e6c --- /dev/null +++ b/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java @@ -0,0 +1,125 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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.value; + +import java.time.DateTimeException; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.neo4j.driver.Values; +import org.neo4j.driver.internal.InternalNode; +import org.neo4j.driver.internal.InternalPath; +import org.neo4j.driver.internal.InternalRelationship; +import org.neo4j.driver.internal.bolt.api.values.Node; +import org.neo4j.driver.internal.bolt.api.values.Path; +import org.neo4j.driver.internal.bolt.api.values.Relationship; +import org.neo4j.driver.internal.bolt.api.values.Segment; +import org.neo4j.driver.internal.bolt.api.values.Value; +import org.neo4j.driver.internal.bolt.api.values.ValueFactory; + +public class BoltValueFactory implements ValueFactory { + private static final BoltValueFactory INSTANCE = new BoltValueFactory(); + + public static BoltValueFactory getInstance() { + return INSTANCE; + } + + private BoltValueFactory() {} + + @Override + public Value value(Object value) { + return ((InternalValue) Values.value(value)).asBoltValue(); + } + + @Override + public Node node(long id, String elementId, Collection labels, Map properties) { + return new InternalNode(id, elementId, labels, toDriverMap(properties)); + } + + @Override + public Relationship relationship( + long id, + String elementId, + long start, + String startElementId, + long end, + String endElementId, + String type, + Map properties) { + return new InternalRelationship( + id, elementId, start, startElementId, end, endElementId, type, toDriverMap(properties)); + } + + @Override + public Segment segment(Node start, Relationship relationship, Node end) { + return new InternalPath.SelfContainedSegment( + (InternalNode) start, (InternalRelationship) relationship, (InternalNode) end); + } + + @Override + public Path path(List segments, List nodes, List relationships) { + var segments0 = segments.stream() + .map(segment -> (org.neo4j.driver.types.Path.Segment) segment) + .toList(); + var nodes0 = + nodes.stream().map(node -> (org.neo4j.driver.types.Node) node).toList(); + var relationships0 = relationships.stream() + .map(relationship -> (org.neo4j.driver.types.Relationship) relationship) + .toList(); + return new InternalPath(segments0, nodes0, relationships0); + } + + @Override + public Value isoDuration(long months, long days, long seconds, int nanoseconds) { + return ((InternalValue) Values.isoDuration(months, days, seconds, nanoseconds)).asBoltValue(); + } + + @Override + public Value point(int srid, double x, double y) { + return ((InternalValue) Values.point(srid, x, y)).asBoltValue(); + } + + @Override + public Value point(int srid, double x, double y, double z) { + return ((InternalValue) Values.point(srid, x, y, z)).asBoltValue(); + } + + @Override + public Value unsupportedDateTimeValue(DateTimeException e) { + return new UnsupportedDateTimeValue(e).asBoltValue(); + } + + public Map toBoltMap(Map map) { + var result = new HashMap(map.size()); + for (var entry : map.entrySet()) { + var boltValue = ((InternalValue) entry.getValue()).asBoltValue(); + result.put(entry.getKey(), boltValue); + } + return Collections.unmodifiableMap(result); + } + + public Map toDriverMap(Map map) { + var result = new HashMap(map.size()); + for (var entry : map.entrySet()) { + var boltValue = ((BoltValue) entry.getValue()).asDriverValue(); + result.put(entry.getKey(), boltValue); + } + return Collections.unmodifiableMap(result); + } +} diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java index 8a5111b736..d9d3aecd6a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java @@ -72,6 +72,11 @@ public boolean equals(Object obj) { public String toString() { return "TRUE"; } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.BOOLEAN); + } } private static class FalseValue extends BooleanValue { @@ -100,5 +105,10 @@ public boolean equals(Object obj) { public String toString() { return "FALSE"; } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.BOOLEAN); + } } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java index 655fec7f91..a5a6fdfce4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java @@ -84,4 +84,9 @@ public String toString() { } return s.toString(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.BYTES); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java index 9c1490d391..cf468b4a91 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java @@ -40,4 +40,9 @@ public ZonedDateTime asZonedDateTime() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.DATE_TIME(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.DATE_TIME); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java index c5981f5d39..3e7c4dd6d1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java @@ -34,4 +34,9 @@ public LocalDate asLocalDate() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.DATE(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.DATE); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java index b4145d08ad..aef301b698 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java @@ -34,4 +34,9 @@ public IsoDuration asIsoDuration() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.DURATION(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.DURATION); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java index 75a767c920..20dc650ce6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java @@ -95,4 +95,9 @@ public int hashCode() { public String toString() { return Double.toString(val); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.FLOAT); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java index b6ed83b872..e0eb6211e5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java @@ -87,4 +87,9 @@ public boolean equals(Object o) { public int hashCode() { return (int) (val ^ (val >>> 32)); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.INTEGER); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java index 9bb564232c..b487f45257 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java @@ -22,4 +22,6 @@ public interface InternalValue extends Value, AsValue { TypeConstructor typeConstructor(); + + BoltValue asBoltValue(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java index 206b3c138c..3985c5da35 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java @@ -115,4 +115,9 @@ public boolean equals(Object o) { public int hashCode() { return Arrays.hashCode(values); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.LIST); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java index 4dc22905f1..8ab6ca08f9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java @@ -34,4 +34,9 @@ public LocalDateTime asLocalDateTime() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.LOCAL_DATE_TIME(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.LOCAL_DATE_TIME); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java index 7aaa52a2d2..31ada4eb41 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java @@ -34,4 +34,9 @@ public LocalTime asLocalTime() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.LOCAL_TIME(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.LOCAL_TIME); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java index 3a5a02de6e..2df62e3b30 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java @@ -116,4 +116,9 @@ public boolean equals(Object o) { public int hashCode() { return val.hashCode(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.MAP); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java index 40b1bf4d2c..93d2bf4861 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java @@ -34,4 +34,9 @@ public Node asNode() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.NODE(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.NODE); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java index c0530aee88..23bc2f0fd3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java @@ -60,4 +60,9 @@ public int hashCode() { public String toString() { return "NULL"; } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.NULL); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java index be0b15201d..eb4287fa9f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java @@ -39,4 +39,9 @@ public int size() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.PATH(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.PATH); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java index bbe9bf4172..a512aeea8b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java @@ -34,4 +34,9 @@ public Point asPoint() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.POINT(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.POINT); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java index d0d7e70bed..3ec5b1260f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java @@ -34,4 +34,9 @@ public Relationship asRelationship() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.RELATIONSHIP(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.RELATIONSHIP); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java index bf816bc6e4..eb9f89d7f7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java @@ -76,4 +76,9 @@ public boolean equals(Object o) { public int hashCode() { return val.hashCode(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.STRING); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java index fc01a90438..e5e690251f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java @@ -34,4 +34,9 @@ public OffsetTime asOffsetTime() { public Type type() { return InternalTypeSystem.TYPE_SYSTEM.TIME(); } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.TIME); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java index a8f0f6f49b..1a518d29a4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java @@ -80,4 +80,9 @@ private DateTimeException instantiateDateTimeException() { } return newException; } + + @Override + public BoltValue asBoltValue() { + return new BoltValue(this, org.neo4j.driver.internal.bolt.api.values.Type.DATE_TIME); + } } diff --git a/driver/src/main/java/org/neo4j/driver/summary/QueryType.java b/driver/src/main/java/org/neo4j/driver/summary/QueryType.java index 7594f29107..47dc577e67 100644 --- a/driver/src/main/java/org/neo4j/driver/summary/QueryType.java +++ b/driver/src/main/java/org/neo4j/driver/summary/QueryType.java @@ -19,7 +19,7 @@ import java.util.function.Function; import org.neo4j.driver.exceptions.ClientException; import org.neo4j.driver.exceptions.Neo4jException; -import org.neo4j.driver.internal.bolt.api.GqlStatusError; +import org.neo4j.driver.internal.GqlStatusError; /** * The type of query executed. diff --git a/driver/src/main/jpms/module-info.java b/driver/src/main/jpms/module-info.java new file mode 100644 index 0000000000..07513234b0 --- /dev/null +++ b/driver/src/main/jpms/module-info.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) "Neo4j" + * Neo4j Sweden AB [https://neo4j.com] + * + * 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. + */ +/** + * The Neo4j Java Driver module. + */ +@SuppressWarnings({"requires-automatic", "requires-transitive-automatic"}) +module org.neo4j.driver { + exports org.neo4j.driver; + exports org.neo4j.driver.async; + exports org.neo4j.driver.reactive; + exports org.neo4j.driver.reactivestreams; + exports org.neo4j.driver.types; + exports org.neo4j.driver.summary; + exports org.neo4j.driver.net; + exports org.neo4j.driver.util; + exports org.neo4j.driver.exceptions; + exports org.neo4j.driver.exceptions.value; + + requires reactor.core; + requires io.netty.common; + requires io.netty.handler; + requires io.netty.transport; + requires io.netty.buffer; + requires io.netty.codec; + requires io.netty.resolver; + requires transitive java.logging; + requires transitive org.reactivestreams; + requires static micrometer.core; + requires static org.graalvm.nativeimage; + requires static org.slf4j; + requires static java.management; + requires static reactor.blockhound; +} diff --git a/driver/src/test/java/org/neo4j/driver/PackageTests.java b/driver/src/test/java/org/neo4j/driver/PackageTests.java deleted file mode 100644 index ac6fb5b8cd..0000000000 --- a/driver/src/test/java/org/neo4j/driver/PackageTests.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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; - -import static com.tngtech.archunit.core.domain.JavaClass.Predicates.assignableTo; -import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAPackage; -import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; - -import com.tngtech.archunit.base.DescribedPredicate; -import com.tngtech.archunit.core.domain.JavaClass; -import com.tngtech.archunit.core.domain.JavaClasses; -import com.tngtech.archunit.core.importer.ClassFileImporter; -import com.tngtech.archunit.core.importer.ImportOption; -import com.tngtech.archunit.library.Architectures; -import java.util.stream.Stream; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.neo4j.driver.internal.DriverFactory; -import org.neo4j.driver.internal.InternalNode; -import org.neo4j.driver.internal.InternalPath; -import org.neo4j.driver.internal.InternalRelationship; -import org.neo4j.driver.internal.bolt.basicimpl.NettyBoltConnectionProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.BootstrapFactory; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.EventLoopGroupFactory; -import org.neo4j.driver.internal.bolt.basicimpl.logging.ChannelActivityLogger; -import org.neo4j.driver.internal.bolt.pooledimpl.PooledBoltConnectionProvider; -import org.neo4j.driver.internal.bolt.routedimpl.RoutedBoltConnectionProvider; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.Rediscovery; -import org.neo4j.driver.internal.retry.ExponentialBackoffRetryLogic; -import org.neo4j.driver.internal.types.InternalTypeSystem; -import org.neo4j.driver.internal.types.TypeConstructor; -import org.neo4j.driver.internal.util.Futures; -import org.neo4j.driver.types.IsoDuration; -import org.neo4j.driver.types.MapAccessor; -import org.neo4j.driver.types.Node; -import org.neo4j.driver.types.Point; -import org.neo4j.driver.types.Type; -import org.neo4j.driver.types.TypeSystem; - -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -class PackageTests { - private JavaClasses allClasses; - - @BeforeAll - void importAllClasses() { - this.allClasses = new ClassFileImporter() - .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) - .importPackages("org.neo4j.driver.."); - } - - @Test - void nettyShouldOnlyBeAccessedByBasicBoltImpl() { - var rule = classes() - .that() - .resideInAPackage("io.netty..") - .should() - .onlyBeAccessed() - .byClassesThat(resideInAPackage("org.neo4j.driver.internal.bolt.basicimpl..") - .or(resideInAPackage("io.netty..")) - .or(assignableTo(DriverFactory.class)) - .or(assignableTo(ExponentialBackoffRetryLogic.class))); - rule.check(new ClassFileImporter() - .withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS) - .importPackages("org.neo4j.driver..", "io.netty..")); - } - - @Test - void boltLayerShouldBeSelfContained() { - // temporarily whitelisted classes - var whitelistedClasses = Stream.of( - // values - Value.class, - Value[].class, - Values.class, - Type.class, - TypeConstructor.class, - TypeSystem.class, - Node.class, - Record.class, - Point.class, - MapAccessor.class, - InternalNode.class, - InternalRelationship.class, - InternalPath.class, - InternalPath.SelfContainedSegment.class, - IsoDuration.class, - InternalTypeSystem.class) - .map(JavaClass.Predicates::assignableTo) - .reduce((one, two) -> DescribedPredicate.or(one, two)) - .get(); - - Architectures.layeredArchitecture() - .consideringOnlyDependenciesInAnyPackage("org.neo4j.driver..") - .layer("Bolt") - .definedBy("..internal.bolt..") - .layer("Whitelisted") - .definedBy(whitelistedClasses) - .whereLayer("Bolt") - .mayOnlyAccessLayers("Whitelisted") - .check(allClasses); - } - - @Test - void boltBasicImplLayerShouldNotBeAccessedDirectly() { - Architectures.layeredArchitecture() - .consideringOnlyDependenciesInAnyPackage("org.neo4j.driver..") - .layer("Bolt basic impl") - .definedBy("..internal.bolt.basicimpl..") - .whereLayer("Bolt basic impl") - .mayNotBeAccessedByAnyLayer() - .ignoreDependency(DriverFactory.class, BootstrapFactory.class) - .ignoreDependency(DriverFactory.class, NettyBoltConnectionProvider.class) - .ignoreDependency(ChannelActivityLogger.class, ChannelAttributes.class) - .ignoreDependency(Futures.class, EventLoopGroupFactory.class) - .check(allClasses); - } - - @Test - void boltPooledImplLayerShouldNotBeAccessedDirectly() { - Architectures.layeredArchitecture() - .consideringOnlyDependenciesInAnyPackage("org.neo4j.driver..") - .layer("Bolt pooled impl") - .definedBy("..internal.bolt.pooledimpl..") - .whereLayer("Bolt pooled impl") - .mayNotBeAccessedByAnyLayer() - .ignoreDependency(DriverFactory.class, PooledBoltConnectionProvider.class) - .check(allClasses); - } - - @Test - void boltRoutedImplLayerShouldNotBeAccessedDirectly() { - Architectures.layeredArchitecture() - .consideringOnlyDependenciesInAnyPackage("org.neo4j.driver..") - .layer("Bolt routed impl") - .definedBy("..internal.bolt.routedimpl..") - .whereLayer("Bolt routed impl") - .mayNotBeAccessedByAnyLayer() - .ignoreDependency(DriverFactory.class, RoutedBoltConnectionProvider.class) - .ignoreDependency(DriverFactory.class, Rediscovery.class) - .check(allClasses); - } -} 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 8710c2c58a..3c95347a8e 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/SessionMixIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/SessionMixIT.java @@ -17,13 +17,11 @@ package org.neo4j.driver.integration; import static java.util.concurrent.CompletableFuture.completedFuture; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.internal.util.Matchers.blockingOperationInEventLoopError; import static org.neo4j.driver.testutil.TestUtil.await; import java.util.concurrent.CompletionStage; @@ -38,7 +36,7 @@ import org.neo4j.driver.async.AsyncSession; import org.neo4j.driver.async.AsyncTransactionWork; import org.neo4j.driver.async.ResultCursor; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.EventLoopGroupFactory; +import org.neo4j.driver.internal.util.Futures; import org.neo4j.driver.testutil.DatabaseExtension; import org.neo4j.driver.testutil.ParallelizableIT; @@ -77,9 +75,9 @@ void shouldFailToExecuteBlockingRunChainedWithAsyncTransaction() { CompletionStage result = asyncSession .beginTransactionAsync(TransactionConfig.empty()) .thenApply(tx -> { - if (EventLoopGroupFactory.isEventLoopThread(Thread.currentThread())) { + if (Futures.isEventLoopThread(Thread.currentThread())) { var e = assertThrows(IllegalStateException.class, () -> session.run("CREATE ()")); - assertThat(e, is(blockingOperationInEventLoopError())); + assertTrue(e.getMessage().startsWith("Blocking operation can't be executed in IO thread")); } return null; }); @@ -110,12 +108,11 @@ void shouldAllowUsingBlockingApiInCommonPoolWhenChaining() { @SuppressWarnings("deprecation") void shouldFailToExecuteBlockingRunInAsyncTransactionFunction() { AsyncTransactionWork> completionStageTransactionWork = tx -> { - if (EventLoopGroupFactory.isEventLoopThread(Thread.currentThread())) { + if (Futures.isEventLoopThread(Thread.currentThread())) { var e = assertThrows( IllegalStateException.class, () -> session.run("UNWIND range(1, 10000) AS x CREATE (n:AsyncNode {x: x}) RETURN n")); - - assertThat(e, is(blockingOperationInEventLoopError())); + assertTrue(e.getMessage().startsWith("Blocking operation can't be executed in IO thread")); } return completedFuture(null); }; @@ -130,14 +127,13 @@ void shouldFailToExecuteBlockingRunChainedWithAsyncRun() { .runAsync("RETURN 1") .thenCompose(ResultCursor::singleAsync) .thenApply(record -> { - if (EventLoopGroupFactory.isEventLoopThread(Thread.currentThread())) { + if (Futures.isEventLoopThread(Thread.currentThread())) { var e = assertThrows( IllegalStateException.class, () -> session.run( "RETURN $x", parameters("x", record.get(0).asInt()))); - - assertThat(e, is(blockingOperationInEventLoopError())); + assertTrue(e.getMessage().startsWith("Blocking operation can't be executed in IO thread")); } return null; }); diff --git a/driver/src/test/java/org/neo4j/driver/internal/DriverFactoryTest.java b/driver/src/test/java/org/neo4j/driver/internal/DriverFactoryTest.java index e4a94d0f18..2cf234a080 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/DriverFactoryTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/DriverFactoryTest.java @@ -45,7 +45,7 @@ import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionProvider; import org.neo4j.driver.internal.async.LeakLoggingNetworkSession; import org.neo4j.driver.internal.async.NetworkSession; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.BootstrapFactory; +import org.neo4j.driver.internal.bolt.basicimpl.BootstrapFactory; import org.neo4j.driver.internal.metrics.DevNullMetricsProvider; import org.neo4j.driver.internal.metrics.InternalMetricsProvider; import org.neo4j.driver.internal.metrics.MicrometerMetricsProvider; diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java index 42800e436e..ddd902e385 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java @@ -49,9 +49,9 @@ import org.neo4j.driver.exceptions.NoSuchRecordException; import org.neo4j.driver.exceptions.ResultConsumedException; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.cursor.DisposableResultCursorImpl; import org.neo4j.driver.internal.cursor.ResultCursorImpl; diff --git a/driver/src/test/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapperTest.java b/driver/src/test/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapperTest.java index 79c87a732f..b23438fa4a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapperTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/adaptedbolt/ErrorMapperTest.java @@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import java.util.Collections; import javax.net.ssl.SSLHandshakeException; import org.junit.jupiter.api.Test; import org.neo4j.driver.exceptions.AuthenticationException; @@ -41,7 +42,7 @@ private BoltFailureException newError(String code, String message) { message, GqlStatusError.UNKNOWN.getStatus(), GqlStatusError.UNKNOWN.getStatusDescription(message), - GqlStatusError.DIAGNOSTIC_RECORD, + Collections.emptyMap(), null); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java index a4a08dc5f3..8ab7b9161e 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java @@ -57,13 +57,13 @@ import org.neo4j.driver.internal.InternalRecord; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionProvider; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; +import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RollbackSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; import org.neo4j.driver.internal.value.IntegerValue; class InternalAsyncTransactionTest { @@ -72,7 +72,7 @@ class InternalAsyncTransactionTest { @BeforeEach void setUp() { - connection = connectionMock(BoltProtocolV4.INSTANCE.version()); + connection = connectionMock(new BoltProtocolVersion(4, 0)); given(connection.onLoop()).willReturn(CompletableFuture.completedStage(connection)); var connectionProvider = mock(DriverBoltConnectionProvider.class); given(connectionProvider.connect(any(), any(), any(), any(), any(), any(), any(), any(), any())) diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/LeakLoggingNetworkSessionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/LeakLoggingNetworkSessionTest.java index eaa0954536..825a50fb6f 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/LeakLoggingNetworkSessionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/LeakLoggingNetworkSessionTest.java @@ -48,9 +48,9 @@ import org.neo4j.driver.TransactionConfig; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionProvider; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; import org.neo4j.driver.internal.security.BoltSecurityPlanManager; import org.neo4j.driver.internal.telemetry.ApiTelemetryWork; diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java index 2298caddfb..c68b97be59 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/NetworkSessionTest.java @@ -69,11 +69,11 @@ import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionProvider; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.DatabaseName; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.ResetSummary; import org.neo4j.driver.internal.bolt.api.summary.RollbackSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/UnmanagedTransactionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/UnmanagedTransactionTest.java index 49cbb1ac5a..caff5b522a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/UnmanagedTransactionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/UnmanagedTransactionTest.java @@ -65,13 +65,13 @@ import org.neo4j.driver.internal.FailableCursor; import org.neo4j.driver.internal.InternalBookmark; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.AccessMode; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.DatabaseNameUtil; import org.neo4j.driver.internal.bolt.api.TelemetryApi; import org.neo4j.driver.internal.bolt.api.summary.BeginSummary; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.ResetSummary; import org.neo4j.driver.internal.bolt.api.summary.RollbackSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilderImplTest.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilderImplTest.java deleted file mode 100644 index a38a9195e8..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/async/connection/ChannelPipelineBuilderImplTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.async.connection; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; -import static org.junit.jupiter.api.Assertions.assertFalse; - -import io.netty.channel.embedded.EmbeddedChannel; -import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.NoopLoggingProvider; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChannelErrorHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.ChunkDecoder; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.MessageDecoder; -import org.neo4j.driver.internal.bolt.basicimpl.async.outbound.OutboundMessageHandler; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.MessageFormatV3; - -class ChannelPipelineBuilderImplTest { - @Test - void shouldBuildPipeline() { - var channel = new EmbeddedChannel(); - ChannelAttributes.setMessageDispatcher( - channel, new InboundMessageDispatcher(channel, NoopLoggingProvider.INSTANCE)); - - new ChannelPipelineBuilderImpl().build(new MessageFormatV3(), channel.pipeline(), NoopLoggingProvider.INSTANCE); - - var iterator = channel.pipeline().iterator(); - assertThat(iterator.next().getValue(), instanceOf(ChunkDecoder.class)); - assertThat(iterator.next().getValue(), instanceOf(MessageDecoder.class)); - assertThat(iterator.next().getValue(), instanceOf(InboundMessageHandler.class)); - - assertThat(iterator.next().getValue(), instanceOf(OutboundMessageHandler.class)); - - assertThat(iterator.next().getValue(), instanceOf(ChannelErrorHandler.class)); - - assertFalse(iterator.hasNext()); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocolTest.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocolTest.java deleted file mode 100644 index 4bfdfeee96..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/BoltProtocolTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.instanceOf; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.neo4j.driver.internal.bolt.basicimpl.async.connection.ChannelAttributes.setProtocolVersion; - -import io.netty.channel.embedded.EmbeddedChannel; -import org.junit.jupiter.api.Test; -import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; -import org.neo4j.driver.internal.bolt.api.exception.BoltClientException; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v3.BoltProtocolV3; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v41.BoltProtocolV41; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v42.BoltProtocolV42; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v43.BoltProtocolV43; - -class BoltProtocolTest { - @Test - void shouldCreateProtocolForKnownVersions() { - assertAll( - () -> assertThat(BoltProtocol.forVersion(BoltProtocolV3.VERSION), instanceOf(BoltProtocolV3.class)), - () -> assertThat(BoltProtocol.forVersion(BoltProtocolV4.VERSION), instanceOf(BoltProtocolV4.class)), - () -> assertThat(BoltProtocol.forVersion(BoltProtocolV41.VERSION), instanceOf(BoltProtocolV41.class)), - () -> assertThat(BoltProtocol.forVersion(BoltProtocolV42.VERSION), instanceOf(BoltProtocolV42.class)), - () -> assertThat(BoltProtocol.forVersion(BoltProtocolV43.VERSION), instanceOf(BoltProtocolV43.class))); - } - - @Test - void shouldThrowForUnknownVersion() { - assertAll( - () -> assertThrows( - BoltClientException.class, () -> BoltProtocol.forVersion(new BoltProtocolVersion(42, 0))), - () -> assertThrows( - BoltClientException.class, () -> BoltProtocol.forVersion(new BoltProtocolVersion(142, 0))), - () -> assertThrows( - BoltClientException.class, () -> BoltProtocol.forVersion(new BoltProtocolVersion(-1, 0)))); - } - - @Test - void shouldThrowForChannelWithUnknownProtocolVersion() { - var channel = new EmbeddedChannel(); - setProtocolVersion(channel, new BoltProtocolVersion(42, 0)); - - assertThrows(BoltClientException.class, () -> BoltProtocol.forChannel(channel)); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/HelloMessageTest.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/HelloMessageTest.java deleted file mode 100644 index 2ea7615403..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/request/HelloMessageTest.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.request; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.not; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.security.InternalAuthToken.CREDENTIALS_KEY; -import static org.neo4j.driver.internal.security.InternalAuthToken.PRINCIPAL_KEY; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; -import org.neo4j.driver.Value; -import org.neo4j.driver.internal.bolt.api.BoltAgent; -import org.neo4j.driver.internal.bolt.api.BoltAgentUtil; - -class HelloMessageTest { - @Test - void shouldHaveCorrectMetadata() { - Map authToken = new HashMap<>(); - authToken.put("user", value("Alice")); - authToken.put("credentials", value("SecretPassword")); - - var message = new HelloMessage( - "MyDriver/1.0.2", BoltAgentUtil.VALUE, authToken, Collections.emptyMap(), false, null, false); - - Map expectedMetadata = new HashMap<>(authToken); - expectedMetadata.put("user_agent", value("MyDriver/1.0.2")); - expectedMetadata.put("bolt_agent", value(Map.of("product", BoltAgentUtil.VALUE.product()))); - expectedMetadata.put("routing", value(Collections.emptyMap())); - assertEquals(expectedMetadata, message.metadata()); - } - - @Test - void shouldHaveCorrectRoutingContext() { - Map authToken = new HashMap<>(); - authToken.put("user", value("Alice")); - authToken.put("credentials", value("SecretPassword")); - - Map routingContext = new HashMap<>(); - routingContext.put("region", "China"); - routingContext.put("speed", "Slow"); - - var message = - new HelloMessage("MyDriver/1.0.2", BoltAgentUtil.VALUE, authToken, routingContext, false, null, false); - - Map expectedMetadata = new HashMap<>(authToken); - expectedMetadata.put("user_agent", value("MyDriver/1.0.2")); - expectedMetadata.put("bolt_agent", value(Map.of("product", BoltAgentUtil.VALUE.product()))); - expectedMetadata.put("routing", value(routingContext)); - assertEquals(expectedMetadata, message.metadata()); - } - - @Test - void shouldNotExposeCredentialsInToString() { - Map authToken = new HashMap<>(); - authToken.put(PRINCIPAL_KEY, value("Alice")); - authToken.put(CREDENTIALS_KEY, value("SecretPassword")); - - var message = new HelloMessage( - "MyDriver/1.0.2", BoltAgentUtil.VALUE, authToken, Collections.emptyMap(), false, null, false); - - assertThat(message.toString(), not(containsString("SecretPassword"))); - } - - @Test - void shouldAcceptNullBoltAgent() { - var authToken = new HashMap(); - authToken.put("user", value("Alice")); - authToken.put("credentials", value("SecretPassword")); - - var message = new HelloMessage("MyDriver/1.0.2", null, authToken, Collections.emptyMap(), false, null, false); - - var expectedMetadata = new HashMap<>(authToken); - expectedMetadata.put("user_agent", value("MyDriver/1.0.2")); - expectedMetadata.put("routing", value(Collections.emptyMap())); - assertEquals(expectedMetadata, message.metadata()); - } - - @Test - void shouldAcceptDetailedBoltAgent() { - var authToken = new HashMap(); - authToken.put("user", value("Alice")); - authToken.put("credentials", value("SecretPassword")); - var boltAgent = new BoltAgent("1", "2", "3", "4"); - - var message = - new HelloMessage("MyDriver/1.0.2", boltAgent, authToken, Collections.emptyMap(), false, null, false); - - var expectedMetadata = new HashMap<>(authToken); - expectedMetadata.put("user_agent", value("MyDriver/1.0.2")); - expectedMetadata.put( - "bolt_agent", - value(Map.of( - "product", - boltAgent.product(), - "platform", - boltAgent.platform(), - "language", - boltAgent.language(), - "language_details", - boltAgent.languageDetails()))); - expectedMetadata.put("routing", value(Collections.emptyMap())); - assertEquals(expectedMetadata, message.metadata()); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageReaderV3Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageReaderV3Test.java deleted file mode 100644 index 6ee60e6fb9..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v3/MessageReaderV3Test.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v3; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV3} and not an specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV3Test extends AbstractMessageReaderTestBase { - - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV3.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageReaderV4Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageReaderV4Test.java deleted file mode 100644 index 352244461c..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v4/MessageReaderV4Test.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v4; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV4} and not an specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV4Test extends AbstractMessageReaderTestBase { - - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV4.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageReaderV41Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageReaderV41Test.java deleted file mode 100644 index 91edbaee60..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v41/MessageReaderV41Test.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v41; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV41} and not an specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV41Test extends AbstractMessageReaderTestBase { - - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV41.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageReaderV42Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageReaderV42Test.java deleted file mode 100644 index e296c23e8f..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v42/MessageReaderV42Test.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v42; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV42} and not an specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV42Test extends AbstractMessageReaderTestBase { - - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV42.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageReaderV43Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageReaderV43Test.java deleted file mode 100644 index e4987e9968..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v43/MessageReaderV43Test.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v43; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v42.BoltProtocolV42; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV43} and not an specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV43Test extends AbstractMessageReaderTestBase { - - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV42.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageReaderV44Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageReaderV44Test.java deleted file mode 100644 index 9671c81318..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v44/MessageReaderV44Test.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v44; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV44} and not a specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV44Test extends AbstractMessageReaderTestBase { - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV44.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageReaderV5Test.java b/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageReaderV5Test.java deleted file mode 100644 index dd692d697b..0000000000 --- a/driver/src/test/java/org/neo4j/driver/internal/bolt/basicimpl/messaging/v5/MessageReaderV5Test.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * 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.bolt.basicimpl.messaging.v5; - -import static java.util.Arrays.asList; -import static java.util.Calendar.APRIL; -import static java.util.Calendar.AUGUST; -import static org.neo4j.driver.Values.parameters; -import static org.neo4j.driver.Values.value; -import static org.neo4j.driver.internal.util.ValueFactory.emptyNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.emptyRelationshipValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledNodeValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; -import static org.neo4j.driver.internal.util.ValueFactory.filledRelationshipValue; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.util.HashMap; -import java.util.stream.Stream; -import org.neo4j.driver.Value; -import org.neo4j.driver.Values; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.Message; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.MessageFormat; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.request.DiscardAllMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.FailureMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.IgnoredMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.RecordMessage; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.response.SuccessMessage; -import org.neo4j.driver.internal.bolt.basicimpl.packstream.PackInput; -import org.neo4j.driver.internal.bolt.basicimpl.util.messaging.AbstractMessageReaderTestBase; - -/** - * The MessageReader under tests is the one provided by the {@link BoltProtocolV5} and not a specific class implementation. - *

- * It's done on this way to make easy to replace the implementation and still getting the same behaviour. - */ -public class MessageReaderV5Test extends AbstractMessageReaderTestBase { - @Override - protected Stream supportedMessages() { - return Stream.of( - // V2 Record types - record(value(new InternalPoint2D(42, 120.65, -99.2))), - record(value(new InternalPoint3D(42, 85.391, 98.8, 11.1))), - record(value(LocalDate.of(2012, AUGUST, 3))), - record(value(OffsetTime.of(23, 59, 59, 999, ZoneOffset.MAX))), - record(value(LocalTime.of(12, 25))), - record(value(LocalDateTime.of(1999, APRIL, 3, 19, 5, 5, 100_200_300))), - record(value( - ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneOffset.ofHoursMinutes(-7, -15)))), - record(value(ZonedDateTime.of(1823, 1, 12, 23, 59, 59, 999_999_999, ZoneId.of("Europe/Stockholm")))), - record(value(Values.isoDuration( - Long.MAX_VALUE - 1, Integer.MAX_VALUE - 1, Short.MAX_VALUE - 1, Byte.MAX_VALUE - 1) - .asIsoDuration())), - record(value(Values.isoDuration(17, 22, 99, 15).asIsoDuration())), - - // Bolt previous versions valid messages - new FailureMessage("Hello", "World!"), - IgnoredMessage.IGNORED, - new SuccessMessage(new HashMap<>()), - record(value(1337L)), - record(value(parameters("cat", null, "dog", null))), - record(value(parameters("k", 12, "a", "banana"))), - record(value(asList("k", 12, "a", "banana"))), - - // V3 Record Types - record(emptyNodeValue()), - record(filledNodeValue()), - record(emptyRelationshipValue()), - record(filledRelationshipValue()), - record(filledPathValue()), - record(emptyPathValue())); - } - - @Override - protected Stream unsupportedMessages() { - return Stream.of(DiscardAllMessage.DISCARD_ALL); - } - - @Override - protected MessageFormat.Reader newReader(PackInput input) { - return BoltProtocolV5.INSTANCE.createMessageFormat().newReader(input); - } - - private Message record(Value value) { - return new RecordMessage(new Value[] {value}); - } - - @Override - protected boolean isElementIdEnabled() { - return true; - } - - @Override - protected boolean isDateTimeUtcEnabled() { - return true; - } -} diff --git a/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java b/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java index 37574e73f4..3ab2160eee 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java @@ -28,11 +28,11 @@ import static org.mockito.MockitoAnnotations.openMocks; import java.util.Collections; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.function.Consumer; -import java.util.function.Supplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -44,11 +44,10 @@ import org.neo4j.driver.internal.DatabaseBookmark; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.handlers.PullResponseHandlerImpl; class ResultCursorImplTest { ResultCursorImpl cursor; @@ -62,9 +61,6 @@ class ResultCursorImplTest { @Mock RunSummary runSummary; - @Mock - Supplier termSupplier; - final Query query = new Query("query"); final long fetchSize = 1000; boolean closeOnSummary; @@ -80,7 +76,7 @@ void beforeEach() { @Test void shouldNextAsync() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); given(connection.flush(any())).willAnswer((Answer>) invocation -> { var handler = (DriverResponseHandler) invocation.getArgument(0); @@ -108,7 +104,7 @@ void shouldFailNextAsyncOnError() { @Test void shouldFailNextAsyncOnFlushError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); var error = new RuntimeException("message"); given(connection.flush(any())) @@ -133,7 +129,7 @@ var record = cursor.singleAsync().toCompletableFuture().join(); @Test void shouldFailSingleAsync() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); given(connection.flush(any())).willAnswer((Answer>) invocation -> { @@ -153,7 +149,7 @@ void shouldFailSingleAsync() { @Test void shouldFailSingleAsyncOnError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); var error = new Neo4jException("code", "message"); @@ -172,7 +168,7 @@ void shouldFailSingleAsyncOnError() { @Test void shouldFailSingleAsyncOnFlushError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); var error = new RuntimeException("message"); @@ -187,7 +183,7 @@ void shouldFailSingleAsyncOnFlushError() { @Test void shouldFetchMore() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); given(connection.flush(any())).willAnswer((Answer>) invocation -> { @@ -212,7 +208,7 @@ void shouldFetchMore() { @Test void shouldListAsync() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, -1)).willReturn(CompletableFuture.completedStage(connection)); given(connection.flush(any())).willAnswer((Answer>) invocation -> { @@ -230,7 +226,7 @@ void shouldListAsync() { @Test void shouldFailListAsyncOnError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, -1)).willReturn(CompletableFuture.completedStage(connection)); var error = new Neo4jException("code", "message"); @@ -249,7 +245,7 @@ void shouldFailListAsyncOnError() { @Test void shouldFailListAsyncOnFlushError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, -1)).willReturn(CompletableFuture.completedStage(connection)); var error = new RuntimeException("message"); @@ -264,7 +260,7 @@ void shouldFailListAsyncOnFlushError() { @Test void shouldFailPeekAsyncOnError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); var error = new Neo4jException("code", "message"); @@ -283,7 +279,7 @@ void shouldFailPeekAsyncOnError() { @Test void shouldFailListPeekOnFlushError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.pull(0, fetchSize)).willReturn(CompletableFuture.completedStage(connection)); var error = new RuntimeException("message"); @@ -298,7 +294,7 @@ void shouldFailListPeekOnFlushError() { @Test void shouldFailConsumeAsyncOnError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.discard(0, -1)).willReturn(CompletableFuture.completedStage(connection)); var error = new Neo4jException("code", "message"); @@ -317,7 +313,7 @@ void shouldFailConsumeAsyncOnError() { @Test void shouldFailConsumeAsyncOnFlushError() { - cursor.onPullSummary(new PullResponseHandlerImpl.PullSummaryImpl(true, Collections.emptyMap())); + cursor.onPullSummary(new PullSummaryImpl(true, Collections.emptyMap())); given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); given(connection.discard(0, -1)).willReturn(CompletableFuture.completedStage(connection)); var error = new RuntimeException("message"); @@ -329,4 +325,6 @@ void shouldFailConsumeAsyncOnFlushError() { var exception = assertThrows(CompletionException.class, future::join); assertEquals(error, exception.getCause()); } + + public record PullSummaryImpl(boolean hasMore, Map metadata) implements PullSummary {} } diff --git a/driver/src/test/java/org/neo4j/driver/testutil/LoggingUtil.java b/driver/src/test/java/org/neo4j/driver/testutil/LoggingUtil.java index 826094ccb9..42af990ced 100644 --- a/driver/src/test/java/org/neo4j/driver/testutil/LoggingUtil.java +++ b/driver/src/test/java/org/neo4j/driver/testutil/LoggingUtil.java @@ -16,29 +16,21 @@ */ package org.neo4j.driver.testutil; -import static org.hamcrest.Matchers.not; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; -import static org.mockito.hamcrest.MockitoHamcrest.argThat; import java.time.LocalDateTime; import java.util.List; import org.neo4j.driver.Logger; import org.neo4j.driver.Logging; -import org.neo4j.driver.internal.bolt.basicimpl.async.inbound.InboundMessageDispatcher; -import org.neo4j.driver.internal.bolt.basicimpl.async.outbound.OutboundMessageHandler; public class LoggingUtil { public static Logging boltLogging(List messages) { var logging = mock(Logging.class); - var noopLogger = mock(Logger.class); var accumulatingLogger = mock(Logger.class); - given(logging.getLog(argThat(not(InboundMessageDispatcher.class)))).willReturn(noopLogger); - given(logging.getLog(argThat(not(OutboundMessageHandler.class)))).willReturn(noopLogger); - given(logging.getLog(InboundMessageDispatcher.class)).willReturn(accumulatingLogger); - given(logging.getLog(OutboundMessageHandler.class)).willReturn(accumulatingLogger); + given(logging.getLog(any(Class.class))).willReturn(accumulatingLogger); given(accumulatingLogger.isDebugEnabled()).willReturn(true); willAnswer(invocationOnMock -> { var message = (String) invocationOnMock.getArgument(0); 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 2a4eca5aef..ee467117f3 100644 --- a/driver/src/test/java/org/neo4j/driver/testutil/TestUtil.java +++ b/driver/src/test/java/org/neo4j/driver/testutil/TestUtil.java @@ -19,8 +19,6 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.stream.Collectors.toList; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; @@ -36,7 +34,6 @@ import static org.neo4j.driver.internal.bolt.api.DatabaseNameUtil.defaultDatabase; import static org.neo4j.driver.internal.logging.DevNullLogging.DEV_NULL_LOGGING; -import io.netty.buffer.ByteBuf; import io.netty.util.internal.PlatformDependent; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -49,7 +46,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -76,15 +72,12 @@ import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionProvider; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; +import org.neo4j.driver.internal.adaptedbolt.summary.PullSummary; import org.neo4j.driver.internal.async.NetworkSession; import org.neo4j.driver.internal.bolt.api.BoltProtocolVersion; import org.neo4j.driver.internal.bolt.api.BoltServerAddress; import org.neo4j.driver.internal.bolt.api.summary.CommitSummary; -import org.neo4j.driver.internal.bolt.api.summary.PullSummary; import org.neo4j.driver.internal.bolt.api.summary.RunSummary; -import org.neo4j.driver.internal.bolt.basicimpl.async.connection.EventLoopGroupFactory; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.BoltProtocol; -import org.neo4j.driver.internal.bolt.basicimpl.messaging.v4.BoltProtocolV4; import org.neo4j.driver.internal.retry.RetryLogic; import org.neo4j.driver.internal.security.BoltSecurityPlanManager; import org.neo4j.driver.internal.util.FixedRetryLogic; @@ -93,9 +86,6 @@ import reactor.core.publisher.Mono; public final class TestUtil { - public static final BoltProtocolVersion DEFAULT_TEST_PROTOCOL_VERSION = BoltProtocolV4.VERSION; - public static final BoltProtocol DEFAULT_TEST_PROTOCOL = BoltProtocol.forVersion(DEFAULT_TEST_PROTOCOL_VERSION); - private static final long DEFAULT_WAIT_TIME_MS = MINUTES.toMillis(100); private static final String ALPHANUMERICS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789"; public static final Duration TX_TIMEOUT_TEST_TIMEOUT = Duration.ofSeconds(10); @@ -107,12 +97,12 @@ public static List await(Publisher publisher) { } public static T await(Mono publisher) { - EventLoopGroupFactory.assertNotInEventLoopThread(); + // EventLoopGroupFactory.assertNotInEventLoopThread(); return publisher.block(Duration.ofMillis(DEFAULT_WAIT_TIME_MS)); } public static List await(Flux publisher) { - EventLoopGroupFactory.assertNotInEventLoopThread(); + // EventLoopGroupFactory.assertNotInEventLoopThread(); return publisher.collectList().block(Duration.ofMillis(DEFAULT_WAIT_TIME_MS)); } @@ -142,37 +132,6 @@ public static > T await(U future) { } } - public static void assertByteBufContains(ByteBuf buf, Number... values) { - try { - assertNotNull(buf); - var expectedReadableBytes = - Arrays.stream(values).mapToInt(TestUtil::bytesCount).sum(); - assertEquals(expectedReadableBytes, buf.readableBytes(), "Unexpected number of bytes"); - for (var expectedValue : values) { - var actualValue = read(buf, expectedValue.getClass()); - var valueType = actualValue.getClass().getSimpleName(); - assertEquals(expectedValue, actualValue, valueType + " values not equal"); - } - } finally { - releaseIfPossible(buf); - } - } - - public static void assertByteBufEquals(ByteBuf expected, ByteBuf actual) { - try { - assertEquals(expected, actual); - } finally { - releaseIfPossible(expected); - releaseIfPossible(actual); - } - } - - @SafeVarargs - @SuppressWarnings("varargs") - public static Set asOrderedSet(T... elements) { - return new LinkedHashSet<>(Arrays.asList(elements)); - } - @SafeVarargs @SuppressWarnings("varargs") public static Set asSet(T... elements) { @@ -493,48 +452,6 @@ private static int deleteBatchOfNodes(Session session) { }); } - private static Number read(ByteBuf buf, Class type) { - if (type == Byte.class) { - return buf.readByte(); - } else if (type == Short.class) { - return buf.readShort(); - } else if (type == Integer.class) { - return buf.readInt(); - } else if (type == Long.class) { - return buf.readLong(); - } else if (type == Float.class) { - return buf.readFloat(); - } else if (type == Double.class) { - return buf.readDouble(); - } else { - throw new IllegalArgumentException("Unexpected numeric type: " + type); - } - } - - private static int bytesCount(Number value) { - if (value instanceof Byte) { - return 1; - } else if (value instanceof Short) { - return 2; - } else if (value instanceof Integer) { - return 4; - } else if (value instanceof Long) { - return 8; - } else if (value instanceof Float) { - return 4; - } else if (value instanceof Double) { - return 8; - } else { - throw new IllegalArgumentException("Unexpected number: '" + value + "' or type" + value.getClass()); - } - } - - private static void releaseIfPossible(ByteBuf buf) { - if (buf.refCnt() > 0) { - buf.release(); - } - } - public static T serializeAndReadBack(T instance, Class targetClass) throws IOException, ClassNotFoundException { diff --git a/pom.xml b/pom.xml index b48b265788..b0f0ad14f1 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,11 @@ + bolt-api + bolt-api-test-values + bolt-api-netty + bolt-api-pooled + bolt-api-routed driver bundle examples diff --git a/testkit-backend/pom.xml b/testkit-backend/pom.xml index 9b8e43f4e5..23eac517c3 100644 --- a/testkit-backend/pom.xml +++ b/testkit-backend/pom.xml @@ -27,6 +27,30 @@ neo4j-java-driver ${project.version} + + org.neo4j.driver + neo4j-bolt-api + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-netty + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-pooled + ${project.version} + true + + + org.neo4j.driver + neo4j-bolt-api-routed + ${project.version} + true + io.netty netty-handler diff --git a/testkit-backend/src/main/java/neo4j/org/testkit/backend/TestkitState.java b/testkit-backend/src/main/java/neo4j/org/testkit/backend/TestkitState.java index fdb48c02c7..e57c84588c 100644 --- a/testkit-backend/src/main/java/neo4j/org/testkit/backend/TestkitState.java +++ b/testkit-backend/src/main/java/neo4j/org/testkit/backend/TestkitState.java @@ -45,7 +45,7 @@ import org.neo4j.driver.BookmarkManager; import org.neo4j.driver.ClientCertificateManager; import org.neo4j.driver.Logging; -import org.neo4j.driver.internal.bolt.routedimpl.cluster.RoutingTableRegistry; +import org.neo4j.driver.internal.bolt.routedimpl.impl.cluster.RoutingTableRegistry; import reactor.core.publisher.Mono; public class TestkitState {