From 537c102352e2e85a06a5fb9568ee75f2e243ad32 Mon Sep 17 00:00:00 2001 From: Antonio Barcelos Date: Tue, 8 Dec 2020 16:50:50 +0100 Subject: [PATCH 1/2] Add suport to 4.2 by implementign the extended handshake --- .../async/connection/BoltProtocolUtil.java | 4 +-- .../messaging/BoltProtocolVersion.java | 15 ++++++++ .../connection/BoltProtocolUtilTest.java | 8 ++--- .../messaging/BoltProtocolVersionTest.java | 35 +++++++++++++++++++ 4 files changed, 56 insertions(+), 6 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtil.java b/driver/src/main/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtil.java index 68d7241b35..ca52895823 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtil.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtil.java @@ -42,9 +42,9 @@ public final class BoltProtocolUtil private static final ByteBuf HANDSHAKE_BUF = unreleasableBuffer( copyInt( BOLT_MAGIC_PREAMBLE, - BoltProtocolV43.VERSION.toInt(), - BoltProtocolV42.VERSION.toInt(), + BoltProtocolV43.VERSION.toIntRange( BoltProtocolV42.VERSION ), BoltProtocolV41.VERSION.toInt(), + BoltProtocolV4.VERSION.toInt(), BoltProtocolV3.VERSION.toInt() ) ).asReadOnly(); private static final String HANDSHAKE_STRING = createHandshakeString(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java index cd372f22f2..49ea35358f 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java @@ -55,6 +55,21 @@ public int toInt() return shiftedMinor | majorVersion; } + public int toIntRange(BoltProtocolVersion minVersion) + { + if(majorVersion != minVersion.majorVersion) + { + throw new IllegalArgumentException( "Versions should be from the same version" ); + } + else if (minorVersion < minVersion.minorVersion) + { + throw new IllegalArgumentException("Max version should be newest than min version"); + } + int range = minorVersion - minVersion.minorVersion; + int shiftedRange = range << 16; + return shiftedRange | toInt(); + } + /** * @return the version in format X.Y where X is the major version and Y is the minor version */ diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtilTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtilTest.java index 7f3d1c0d8a..c940095a74 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtilTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/connection/BoltProtocolUtilTest.java @@ -23,8 +23,8 @@ import org.junit.jupiter.api.Test; import org.neo4j.driver.internal.messaging.v3.BoltProtocolV3; +import org.neo4j.driver.internal.messaging.v4.BoltProtocolV4; import org.neo4j.driver.internal.messaging.v41.BoltProtocolV41; -import org.neo4j.driver.internal.messaging.v42.BoltProtocolV42; import org.neo4j.driver.internal.messaging.v43.BoltProtocolV43; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -43,15 +43,15 @@ void shouldReturnHandshakeBuf() { assertByteBufContains( handshakeBuf(), - BOLT_MAGIC_PREAMBLE, BoltProtocolV43.VERSION.toInt(), BoltProtocolV42.VERSION.toInt(), - BoltProtocolV41.VERSION.toInt(), BoltProtocolV3.VERSION.toInt() + BOLT_MAGIC_PREAMBLE, (1 << 16) | BoltProtocolV43.VERSION.toInt(), BoltProtocolV41.VERSION.toInt(), + BoltProtocolV4.VERSION.toInt(), BoltProtocolV3.VERSION.toInt() ); } @Test void shouldReturnHandshakeString() { - assertEquals( "[0x6060b017, 772, 516, 260, 3]", handshakeString() ); + assertEquals( "[0x6060b017, 66308, 260, 4, 3]", handshakeString() ); } @Test diff --git a/driver/src/test/java/org/neo4j/driver/internal/messaging/BoltProtocolVersionTest.java b/driver/src/test/java/org/neo4j/driver/internal/messaging/BoltProtocolVersionTest.java index 6f9ddb0fe5..c491a1a53f 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/messaging/BoltProtocolVersionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/messaging/BoltProtocolVersionTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class BoltProtocolVersionTest { @@ -50,6 +51,40 @@ void shouldCompareTo(int majorA, int minorA, int majorB, int minorB, int expecte } + @ParameterizedTest( name = "V{0}.{1} toIntRange V{2}.{3}") + @CsvSource({ + "1, 0, 1, 0, 0x000001", + "4, 3, 4, 2, 0x010304", + "4, 3, 4, 1, 0x020304", + "4, 3, 4, 0, 0x030304", + "100, 100, 100, 0, 0x646464", + "255, 255, 255, 0, 0xFFFFFF" + } ) + void shouldOutputCorrectIntRange(int majorA, int minorA, int majorB, int minorB, int expectedResult) + { + BoltProtocolVersion versionA = new BoltProtocolVersion( majorA, minorA ); + BoltProtocolVersion versionB = new BoltProtocolVersion( majorB, minorB ); + + assertEquals( expectedResult, versionA.toIntRange( versionB ) ); + } + + @ParameterizedTest( name = "V{0}.{1} toIntRange V{2}.{3}") + @CsvSource({ + "1, 0, 2, 0", + "2, 0, 1, 0", + "4, 3, 4, 5", + "4, 6, 3, 7", + "3, 7, 4, 6", + "255, 255, 100, 0" + } ) + void shouldThrowsIllegalArgumentExceptionForIncorrectIntRange(int majorA, int minorA, int majorB, int minorB) + { + BoltProtocolVersion versionA = new BoltProtocolVersion( majorA, minorA ); + BoltProtocolVersion versionB = new BoltProtocolVersion( majorB, minorB ); + + assertThrows( IllegalArgumentException.class, () -> versionA.toIntRange( versionB )); + } + @Test void shouldOutputCorrectLongFormatForMajorVersionOnly() { From 859a78483f00637b155c44bad8a0cd45130147e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Barc=C3=A9los?= Date: Tue, 8 Dec 2020 17:20:09 +0100 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Florent Biville <445792+fbiville@users.noreply.github.com> --- .../internal/messaging/BoltProtocolVersion.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java b/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java index 49ea35358f..c6efe64c4e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java +++ b/driver/src/main/java/org/neo4j/driver/internal/messaging/BoltProtocolVersion.java @@ -34,7 +34,7 @@ public BoltProtocolVersion( int majorVersion, int minorVersion ) public static BoltProtocolVersion fromRawBytes( int rawVersion ) { int major = rawVersion & 0x000000FF; - int minor = ( rawVersion >> 8 ) & 0x000000FF; + int minor = (rawVersion >> 8) & 0x000000FF; return new BoltProtocolVersion( major, minor ); } @@ -55,15 +55,15 @@ public int toInt() return shiftedMinor | majorVersion; } - public int toIntRange(BoltProtocolVersion minVersion) + public int toIntRange( BoltProtocolVersion minVersion ) { - if(majorVersion != minVersion.majorVersion) + if ( majorVersion != minVersion.majorVersion ) { - throw new IllegalArgumentException( "Versions should be from the same version" ); + throw new IllegalArgumentException( "Versions should be from the same major version" ); } - else if (minorVersion < minVersion.minorVersion) + else if ( minorVersion < minVersion.minorVersion ) { - throw new IllegalArgumentException("Max version should be newest than min version"); + throw new IllegalArgumentException( "Max version should be newer than min version" ); } int range = minorVersion - minVersion.minorVersion; int shiftedRange = range << 16;