Skip to content

Commit 5c71e11

Browse files
committed
Merge branch 1.4 into 1.5
2 parents 794be0d + 5c68377 commit 5c71e11

File tree

3 files changed

+73
-43
lines changed

3 files changed

+73
-43
lines changed

driver/src/main/java/org/neo4j/driver/internal/packstream/PackStream.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@
7171
* <tr><td><code>DB</code></td><td><code>11011011</code></td><td><em>RESERVED</em></td><td></td></tr>
7272
* <tr><td><code>DC</code></td><td><code>11011100</code></td><td>STRUCT_8</td><td>Structure (fewer than 2<sup>8</sup> fields)</td></tr>
7373
* <tr><td><code>DD</code></td><td><code>11011101</code></td><td>STRUCT_16</td><td>Structure (fewer than 2<sup>16</sup> fields)</td></tr>
74-
* <tr><td><code>DE</code></td><td><code>11011110</code></td><td>STRUCT_32</td><td>Structure (fewer than 2<sup>32</sup> fields)</td></tr>
74+
* <tr><td><code>DE</code></td><td><code>11011110</code></td><td><em>RESERVED</em></td><td></td></tr>
75+
* <tr><td><code>DF</code></td><td><code>11011111</code></td><td><em>RESERVED</em></td><td></td></tr>
7576
* <tr><td><code>DF</code></td><td><code>11011111</code></td><td><em>RESERVED</em></td><td></td></tr>
7677
* <tr><td><code>E0..EF</code></td><td><code>1110xxxx</code></td><td><em>RESERVED</em></td><td></td></tr>
7778
* <tr><td><code>F0..FF</code></td><td><code>1111xxxx</code></td><td>-TINY_INT</td><td>Integer -1 to -16</td></tr>
@@ -115,7 +116,7 @@ public class PackStream
115116
public static final byte RESERVED_DB = (byte) 0xDB;
116117
public static final byte STRUCT_8 = (byte) 0xDC;
117118
public static final byte STRUCT_16 = (byte) 0xDD;
118-
public static final byte RESERVED_DE = (byte) 0xDE; // TODO STRUCT_32? or the class javadoc is wrong?
119+
public static final byte RESERVED_DE = (byte) 0xDE;
119120
public static final byte RESERVED_DF = (byte) 0xDF;
120121
public static final byte RESERVED_E0 = (byte) 0xE0;
121122
public static final byte RESERVED_E1 = (byte) 0xE1;
@@ -144,6 +145,7 @@ public class PackStream
144145
private static final long MINUS_2_TO_THE_31 = -2147483648L;
145146

146147
private static final String EMPTY_STRING = "";
148+
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
147149
private static final Charset UTF_8 = Charset.forName( "UTF-8" );
148150

149151
private PackStream() {}
@@ -604,6 +606,10 @@ private long unpackUINT32() throws IOException
604606

605607
private byte[] unpackRawBytes(int size ) throws IOException
606608
{
609+
if ( size == 0 )
610+
{
611+
return EMPTY_BYTE_ARRAY;
612+
}
607613
byte[] heapBuffer = new byte[size];
608614
in.readBytes( heapBuffer, 0, heapBuffer.length );
609615
return heapBuffer;

driver/src/test/java/org/neo4j/driver/internal/packstream/PackStreamTest.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -311,22 +311,25 @@ public void testCanPackAndUnpackByteArrays() throws Throwable
311311
// Given
312312
Machine machine = new Machine();
313313

314+
testByteArrayPackingAndUnpacking( machine, 0 );
314315
for ( int i = 0; i < 24; i++ )
315316
{
316-
byte[] array = new byte[(int) Math.pow( 2, i )];
317+
testByteArrayPackingAndUnpacking( machine, (int) Math.pow( 2, i ) );
318+
}
319+
}
317320

318-
// When
319-
machine.reset();
320-
machine.packer().pack( array );
321+
private void testByteArrayPackingAndUnpacking( Machine machine, int length ) throws Throwable
322+
{
323+
byte[] array = new byte[length];
321324

322-
// Then
323-
PackStream.Unpacker unpacker = newUnpacker( machine.output() );
324-
PackType packType = unpacker.peekNextType();
325+
machine.reset();
326+
machine.packer().pack( array );
325327

326-
// Then
327-
assertThat( packType, equalTo( PackType.BYTES ) );
328-
assertArrayEquals( array, unpacker.unpackBytes() );
329-
}
328+
PackStream.Unpacker unpacker = newUnpacker( machine.output() );
329+
PackType packType = unpacker.peekNextType();
330+
331+
assertThat( packType, equalTo( PackType.BYTES ) );
332+
assertArrayEquals( array, unpacker.unpackBytes() );
330333
}
331334

332335
@Test

driver/src/test/java/org/neo4j/driver/v1/integration/ParametersIT.java

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.junit.Test;
2323
import org.junit.rules.ExpectedException;
2424

25+
import java.util.concurrent.ThreadLocalRandom;
26+
2527
import org.neo4j.driver.internal.util.ServerVersion;
2628
import org.neo4j.driver.v1.Record;
2729
import org.neo4j.driver.v1.StatementResult;
@@ -149,30 +151,17 @@ public void shouldBeAbleToSetAndReturnDoubleProperty()
149151
}
150152
}
151153

152-
private boolean supportsBytes()
153-
{
154-
String versionString = session.run( "RETURN 1" ).consume().server().version();
155-
return version( versionString ).greaterThanOrEqual( ServerVersion.v3_2_0 );
156-
}
157-
158154
@Test
159155
public void shouldBeAbleToSetAndReturnBytesProperty()
160156
{
161157
assumeTrue( supportsBytes() );
162158

163-
// Given
164-
byte[] byteArray = "hello, world".getBytes();
165-
166-
// When
167-
StatementResult result = session.run(
168-
"CREATE (a {value:{value}}) RETURN a.value", parameters( "value", byteArray ) );
169-
170-
// Then
171-
for ( Record record : result.list() )
159+
testBytesProperty( new byte[0] );
160+
for ( int i = 0; i < 16; i++ )
172161
{
173-
Value value = record.get( "a.value" );
174-
assertThat( value.hasType( session.typeSystem().BYTES() ), equalTo( true ) );
175-
assertThat( value.asByteArray(), equalTo( byteArray ) );
162+
int length = (int) Math.pow( 2, i );
163+
testBytesProperty( randomByteArray( length ) );
164+
testBytesProperty( randomByteArray( length - 1 ) );
176165
}
177166
}
178167

@@ -201,18 +190,10 @@ public void shouldThrowExceptionWhenServerDoesNotSupportBytes()
201190
@Test
202191
public void shouldBeAbleToSetAndReturnStringProperty()
203192
{
204-
// When
205-
StatementResult result = session.run(
206-
"CREATE (a {value:{value}}) RETURN a.value", parameters( "value", "Mjölnir" ) );
207-
208-
// Then
209-
for ( Record record : result.list() )
210-
{
211-
Value value = record.get( "a.value" );
212-
assertThat( value.hasType( session.typeSystem().STRING() ), equalTo( true ) );
213-
assertThat( value.asString(), equalTo( "Mjölnir" ) );
214-
}
215-
193+
testStringProperty( "" );
194+
testStringProperty( "π≈3.14" );
195+
testStringProperty( "Mjölnir" );
196+
testStringProperty( "*** Hello World! ***" );
216197
}
217198

218199
@Test
@@ -459,4 +440,44 @@ public void shouldNotBePossibleToUsePathAsParameter()
459440
// WHEN
460441
session.run( "RETURN {a}", parameters( "a", path ) );
461442
}
443+
444+
private void testBytesProperty( byte[] array )
445+
{
446+
assumeTrue( supportsBytes() );
447+
448+
StatementResult result = session.run(
449+
"CREATE (a {value:{value}}) RETURN a.value", parameters( "value", array ) );
450+
451+
for ( Record record : result.list() )
452+
{
453+
Value value = record.get( "a.value" );
454+
assertThat( value.hasType( session.typeSystem().BYTES() ), equalTo( true ) );
455+
assertThat( value.asByteArray(), equalTo( array ) );
456+
}
457+
}
458+
459+
private void testStringProperty( String string )
460+
{
461+
StatementResult result = session.run(
462+
"CREATE (a {value:{value}}) RETURN a.value", parameters( "value", string ) );
463+
464+
for ( Record record : result.list() )
465+
{
466+
Value value = record.get( "a.value" );
467+
assertThat( value.hasType( session.typeSystem().STRING() ), equalTo( true ) );
468+
assertThat( value.asString(), equalTo( string ) );
469+
}
470+
}
471+
472+
private boolean supportsBytes()
473+
{
474+
return version( session.driver() ).greaterThanOrEqual( ServerVersion.v3_2_0 );
475+
}
476+
477+
private static byte[] randomByteArray( int length )
478+
{
479+
byte[] result = new byte[length];
480+
ThreadLocalRandom.current().nextBytes( result );
481+
return result;
482+
}
462483
}

0 commit comments

Comments
 (0)