18
18
*/
19
19
package org .neo4j .driver .internal .packstream ;
20
20
21
+ import org .hamcrest .MatcherAssert ;
22
+ import org .junit .Rule ;
23
+ import org .junit .Test ;
24
+ import org .junit .rules .ExpectedException ;
25
+
21
26
import java .io .ByteArrayInputStream ;
22
27
import java .io .ByteArrayOutputStream ;
23
28
import java .io .IOException ;
24
29
import java .nio .channels .Channels ;
25
30
import java .nio .channels .ReadableByteChannel ;
26
31
import java .nio .channels .WritableByteChannel ;
32
+ import java .util .ArrayList ;
33
+ import java .util .HashMap ;
27
34
import java .util .LinkedHashMap ;
28
35
import java .util .Map ;
29
36
30
- import org .hamcrest .MatcherAssert ;
31
- import org .junit .Test ;
32
-
33
37
import org .neo4j .driver .internal .util .BytePrinter ;
34
38
35
39
import static java .nio .charset .StandardCharsets .UTF_8 ;
36
40
import static java .util .Arrays .asList ;
37
-
38
41
import static junit .framework .TestCase .assertFalse ;
39
42
import static org .hamcrest .CoreMatchers .equalTo ;
40
43
import static org .hamcrest .MatcherAssert .assertThat ;
47
50
public class PackStreamTest
48
51
{
49
52
53
+ @ Rule
54
+ public ExpectedException exception = ExpectedException .none ();
55
+
50
56
public static Map <String , Object > asMap ( Object ... keysAndValues )
51
57
{
52
58
Map <String , Object > map = new LinkedHashMap <>( keysAndValues .length / 2 );
@@ -497,10 +503,10 @@ public void testCanPackAndUnpackListOneItemAtATime() throws Throwable
497
503
PackType packType = unpacker .peekNextType ();
498
504
499
505
assertThat ( packType , equalTo ( PackType .LIST ) );
500
- assertThat ( unpacker .unpackListHeader (), equalTo ( 3l ) );
501
- assertThat ( unpacker .unpackLong (), equalTo ( 12l ) );
502
- assertThat ( unpacker .unpackLong (), equalTo ( 13l ) );
503
- assertThat ( unpacker .unpackLong (), equalTo ( 14l ) );
506
+ assertThat ( unpacker .unpackListHeader (), equalTo ( 3L ) );
507
+ assertThat ( unpacker .unpackLong (), equalTo ( 12L ) );
508
+ assertThat ( unpacker .unpackLong (), equalTo ( 13L ) );
509
+ assertThat ( unpacker .unpackLong (), equalTo ( 14L ) );
504
510
505
511
}
506
512
@@ -520,7 +526,7 @@ public void testCanPackAndUnpackListOfString() throws Throwable
520
526
PackType packType = unpacker .peekNextType ();
521
527
522
528
assertThat ( packType , equalTo ( PackType .LIST ) );
523
- assertThat ( unpacker .unpackListHeader (), equalTo ( 3l ) );
529
+ assertThat ( unpacker .unpackListHeader (), equalTo ( 3L ) );
524
530
assertThat ( unpacker .unpackString (), equalTo ( "eins" ) );
525
531
assertThat ( unpacker .unpackString (), equalTo ( "zwei" ) );
526
532
assertThat ( unpacker .unpackString (), equalTo ( "drei" ) );
@@ -530,23 +536,10 @@ public void testCanPackAndUnpackListOfString() throws Throwable
530
536
@ Test
531
537
public void testCanPackAndUnpackListOfSpecialStrings () throws Throwable
532
538
{
533
- // Given
534
- Machine machine = new Machine ();
535
-
536
- // When
537
- PackStream .Packer packer = machine .packer ();
538
- packer .pack ( asList ( "Mjölnir" , "Mjölnir" , "Mjölnir" ) );
539
- packer .flush ();
540
-
541
- // Then
542
- PackStream .Unpacker unpacker = newUnpacker ( machine .output () );
543
- PackType packType = unpacker .peekNextType ();
544
-
545
- assertThat ( packType , equalTo ( PackType .LIST ) );
546
- assertThat ( unpacker .unpackListHeader (), equalTo ( 3l ) );
547
- assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
548
- assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
549
- assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
539
+ assertPackStringLists ( 3 , "Mjölnir" );
540
+ assertPackStringLists ( 126 , "Mjölnir" );
541
+ assertPackStringLists ( 3000 , "Mjölnir" );
542
+ assertPackStringLists ( 32768 , "Mjölnir" );
550
543
}
551
544
552
545
@ Test
@@ -571,7 +564,7 @@ public void testCanPackAndUnpackListOfStringOneByOne() throws Throwable
571
564
PackType packType = unpacker .peekNextType ();
572
565
573
566
assertThat ( packType , equalTo ( PackType .LIST ) );
574
- assertThat ( unpacker .unpackListHeader (), equalTo ( 3l ) );
567
+ assertThat ( unpacker .unpackListHeader (), equalTo ( 3L ) );
575
568
assertThat ( unpacker .unpackString (), equalTo ( "eins" ) );
576
569
assertThat ( unpacker .unpackString (), equalTo ( "zwei" ) );
577
570
assertThat ( unpacker .unpackString (), equalTo ( "drei" ) );
@@ -600,7 +593,7 @@ public void testCanPackAndUnpackListOfSpecialStringOneByOne() throws Throwable
600
593
PackType packType = unpacker .peekNextType ();
601
594
602
595
assertThat ( packType , equalTo ( PackType .LIST ) );
603
- assertThat ( unpacker .unpackListHeader (), equalTo ( 3l ) );
596
+ assertThat ( unpacker .unpackListHeader (), equalTo ( 3L ) );
604
597
assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
605
598
assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
606
599
assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
@@ -610,26 +603,10 @@ public void testCanPackAndUnpackListOfSpecialStringOneByOne() throws Throwable
610
603
@ Test
611
604
public void testCanPackAndUnpackMap () throws Throwable
612
605
{
613
- // Given
614
- Machine machine = new Machine ();
615
-
616
- // When
617
- PackStream .Packer packer = machine .packer ();
618
- packer .pack ( asMap ( "one" , 1 , "two" , 2 ) );
619
- packer .flush ();
620
-
621
- // Then
622
- PackStream .Unpacker unpacker = newUnpacker ( machine .output () );
623
- PackType packType = unpacker .peekNextType ();
624
-
625
- assertThat ( packType , equalTo ( PackType .MAP ) );
626
- assertThat ( unpacker .unpackMapHeader (), equalTo ( 2l ) );
627
-
628
- assertThat ( unpacker .unpackString (), equalTo ( "one" ) );
629
- assertThat ( unpacker .unpackLong (), equalTo ( 1l ) );
630
-
631
- assertThat ( unpacker .unpackString (), equalTo ( "two" ) );
632
- assertThat ( unpacker .unpackLong (), equalTo ( 2l ) );
606
+ assertMap ( 2 );
607
+ assertMap ( 126 );
608
+ assertMap ( 2439 );
609
+ assertMap ( 32768 );
633
610
}
634
611
635
612
@ Test
@@ -651,20 +628,32 @@ public void testCanPackAndUnpackStruct() throws Throwable
651
628
PackType packType = unpacker .peekNextType ();
652
629
653
630
assertThat ( packType , equalTo ( PackType .STRUCT ) );
654
- assertThat ( unpacker .unpackStructHeader (), equalTo ( 3l ) );
631
+ assertThat ( unpacker .unpackStructHeader (), equalTo ( 3L ) );
655
632
assertThat ( unpacker .unpackStructSignature (), equalTo ( (byte )'N' ) );
656
633
657
- assertThat ( unpacker .unpackLong (), equalTo ( 12l ) );
634
+ assertThat ( unpacker .unpackLong (), equalTo ( 12L ) );
658
635
659
- assertThat ( unpacker .unpackListHeader (), equalTo ( 2l ) );
636
+ assertThat ( unpacker .unpackListHeader (), equalTo ( 2L ) );
660
637
assertThat ( unpacker .unpackString (), equalTo ( "Person" ));
661
638
assertThat ( unpacker .unpackString (), equalTo ( "Employee" ));
662
639
663
- assertThat ( unpacker .unpackMapHeader (), equalTo ( 2l ) );
640
+ assertThat ( unpacker .unpackMapHeader (), equalTo ( 2L ) );
664
641
assertThat ( unpacker .unpackString (), equalTo ( "name" ));
665
642
assertThat ( unpacker .unpackString (), equalTo ( "Alice" ));
666
643
assertThat ( unpacker .unpackString (), equalTo ( "age" ));
667
- assertThat ( unpacker .unpackLong (), equalTo ( 33l ));
644
+ assertThat ( unpacker .unpackLong (), equalTo ( 33L ) );
645
+ }
646
+
647
+ @ Test
648
+ public void testCanPackAndUnpackStructsOfDifferentSizes () throws Throwable
649
+ {
650
+ assertStruct ( 2 );
651
+ assertStruct ( 126 );
652
+ assertStruct ( 2439 );
653
+
654
+ //we cannot have 'too many' fields
655
+ exception .expect ( PackStream .Overflow .class );
656
+ assertStruct ( 32768 );
668
657
}
669
658
670
659
@ Test
@@ -843,6 +832,22 @@ public void testCanPeekOnNextType() throws Throwable
843
832
assertPeekType ( PackType .MAP , asMap ( "l" ,3 ) );
844
833
}
845
834
835
+ @ Test
836
+ public void shouldFailForUnknownValue () throws IOException
837
+ {
838
+ // Given
839
+ Machine machine = new Machine ();
840
+ PackStream .Packer packer = machine .packer ();
841
+
842
+ // Expect
843
+ exception .expect ( PackStream .UnPackable .class );
844
+
845
+ // When
846
+ packer .pack ( new MyRandomClass () );
847
+ }
848
+
849
+ private static class MyRandomClass {}
850
+
846
851
void assertPeekType ( PackType type , Object value ) throws IOException
847
852
{
848
853
// Given
@@ -856,4 +861,90 @@ void assertPeekType( PackType type, Object value ) throws IOException
856
861
// When & Then
857
862
assertEquals ( type , unpacker .peekNextType () );
858
863
}
864
+
865
+ private void assertPackStringLists ( int size , String value ) throws Throwable
866
+ {
867
+ // Given
868
+ Machine machine = new Machine ();
869
+
870
+ // When
871
+ PackStream .Packer packer = machine .packer ();
872
+ ArrayList <String > strings = new ArrayList <>( size );
873
+ for ( int i = 0 ; i < size ; i ++ )
874
+ {
875
+ strings .add ( i , value );
876
+ }
877
+ packer .pack ( strings );
878
+ packer .flush ();
879
+
880
+ // Then
881
+ PackStream .Unpacker unpacker = newUnpacker ( machine .output () );
882
+ PackType packType = unpacker .peekNextType ();
883
+ assertThat ( packType , equalTo ( PackType .LIST ) );
884
+
885
+ assertThat ( unpacker .unpackListHeader (), equalTo ( (long ) size ) );
886
+ for ( int i = 0 ; i < size ; i ++ )
887
+ {
888
+ assertThat ( unpacker .unpackString (), equalTo ( "Mjölnir" ) );
889
+ }
890
+ }
891
+
892
+ private void assertMap ( int size ) throws Throwable
893
+ {
894
+ // Given
895
+ Machine machine = new Machine ();
896
+
897
+ // When
898
+ PackStream .Packer packer = machine .packer ();
899
+ HashMap <String ,Integer > map = new HashMap <>();
900
+ for ( int i = 0 ; i < size ; i ++ )
901
+ {
902
+ map .put ( Integer .toString ( i ), i );
903
+ }
904
+ packer .pack ( map );
905
+ packer .flush ();
906
+
907
+ // Then
908
+ PackStream .Unpacker unpacker = newUnpacker ( machine .output () );
909
+ PackType packType = unpacker .peekNextType ();
910
+
911
+ assertThat ( packType , equalTo ( PackType .MAP ) );
912
+
913
+
914
+ assertThat ( unpacker .unpackMapHeader (), equalTo ( (long ) size ) );
915
+
916
+ for ( int i = 0 ; i < size ; i ++ )
917
+ {
918
+ assertThat ( unpacker .unpackString (), equalTo ( Long .toString ( unpacker .unpackLong () ) ) );
919
+ }
920
+ }
921
+
922
+ private void assertStruct ( int size ) throws Throwable
923
+ {
924
+ // Given
925
+ Machine machine = new Machine ();
926
+
927
+ // When
928
+ PackStream .Packer packer = machine .packer ();
929
+ packer .packStructHeader ( size , (byte ) 'N' );
930
+ for ( int i = 0 ; i < size ; i ++ )
931
+ {
932
+ packer .pack ( i );
933
+ }
934
+
935
+ packer .flush ();
936
+
937
+ // Then
938
+ PackStream .Unpacker unpacker = newUnpacker ( machine .output () );
939
+ PackType packType = unpacker .peekNextType ();
940
+
941
+ assertThat ( packType , equalTo ( PackType .STRUCT ) );
942
+ assertThat ( unpacker .unpackStructHeader (), equalTo ( (long ) size ) );
943
+ assertThat ( unpacker .unpackStructSignature (), equalTo ( (byte ) 'N' ) );
944
+
945
+ for ( int i = 0 ; i < size ; i ++ )
946
+ {
947
+ assertThat ( unpacker .unpackLong (), equalTo ( (long ) i ) );
948
+ }
949
+ }
859
950
}
0 commit comments