@@ -71,6 +71,35 @@ func (m *mockD) Recv() (*cb.Envelope, error) {
71
71
return msg , nil
72
72
}
73
73
74
+ type erroneousRecvMockD struct {
75
+ grpc.ServerStream
76
+ }
77
+
78
+ func (m * erroneousRecvMockD ) Send (br * ab.DeliverResponse ) error {
79
+ return nil
80
+ }
81
+
82
+ func (m * erroneousRecvMockD ) Recv () (* cb.Envelope , error ) {
83
+ // The point here is to simulate an error other than EOF.
84
+ // We don't bother to create a new custom error type.
85
+ return nil , io .ErrUnexpectedEOF
86
+ }
87
+
88
+ type erroneousSendMockD struct {
89
+ grpc.ServerStream
90
+ recvVal * cb.Envelope
91
+ }
92
+
93
+ func (m * erroneousSendMockD ) Send (br * ab.DeliverResponse ) error {
94
+ // The point here is to simulate an error other than EOF.
95
+ // We don't bother to create a new custom error type.
96
+ return io .ErrUnexpectedEOF
97
+ }
98
+
99
+ func (m * erroneousSendMockD ) Recv () (* cb.Envelope , error ) {
100
+ return m .recvVal , nil
101
+ }
102
+
74
103
type mockSupportManager struct {
75
104
chains map [string ]* mockSupport
76
105
}
@@ -143,7 +172,7 @@ func makeSeek(chainID string, seekInfo *ab.SeekInfo) *cb.Envelope {
143
172
}
144
173
}
145
174
146
- func TestOldestSeek (t * testing.T ) {
175
+ func TestWholeChainSeek (t * testing.T ) {
147
176
m := newMockD ()
148
177
defer close (m .recvChan )
149
178
@@ -254,7 +283,7 @@ func TestUnauthorizedSeek(t *testing.T) {
254
283
}
255
284
}
256
285
257
- func TestBadSeek (t * testing.T ) {
286
+ func TestOutOfBoundSeek (t * testing.T ) {
258
287
m := newMockD ()
259
288
defer close (m .recvChan )
260
289
@@ -381,3 +410,160 @@ func TestReversedSeqSeek(t *testing.T) {
381
410
t .Fatalf ("Timed out waiting to get all blocks" )
382
411
}
383
412
}
413
+
414
+ func TestBadStreamRecv (t * testing.T ) {
415
+ bh := NewHandlerImpl (nil )
416
+ assert .Error (t , bh .Handle (& erroneousRecvMockD {}), "Should catch unexpected stream error" )
417
+ }
418
+
419
+ func TestBadStreamSend (t * testing.T ) {
420
+ m := & erroneousSendMockD {recvVal : makeSeek (systemChainID , & ab.SeekInfo {Start : seekNewest , Stop : seekNewest , Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })}
421
+ ds := initializeDeliverHandler ()
422
+ assert .Error (t , ds .Handle (m ), "Should catch unexpected stream error" )
423
+ }
424
+
425
+ func TestOldestSeek (t * testing.T ) {
426
+ m := newMockD ()
427
+ defer close (m .recvChan )
428
+
429
+ ds := initializeDeliverHandler ()
430
+ go ds .Handle (m )
431
+
432
+ m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekOldest , Stop : seekOldest , Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
433
+
434
+ select {
435
+ case deliverReply := <- m .sendChan :
436
+ assert .NotEqual (t , nil , deliverReply .GetBlock (), "Received an error on the reply channel" )
437
+ assert .Equal (t , uint64 (0 ), deliverReply .GetBlock ().Header .Number , "Expected only the most recent block" )
438
+ case <- time .After (time .Second ):
439
+ t .Fatalf ("Timed out waiting to get all blocks" )
440
+ }
441
+ }
442
+
443
+ func TestNoPayloadSeek (t * testing.T ) {
444
+ m := newMockD ()
445
+ defer close (m .recvChan )
446
+
447
+ ds := initializeDeliverHandler ()
448
+ go ds .Handle (m )
449
+
450
+ m .recvChan <- & cb.Envelope {Payload : []byte ("Foo" )}
451
+
452
+ select {
453
+ case deliverReply := <- m .sendChan :
454
+ assert .Equal (t , cb .Status_BAD_REQUEST , deliverReply .GetStatus (), "Received wrong error on the reply channel" )
455
+ case <- time .After (time .Second ):
456
+ t .Fatalf ("Timed out waiting to get all blocks" )
457
+ }
458
+ }
459
+
460
+ func TestNilPayloadHeaderSeek (t * testing.T ) {
461
+ m := newMockD ()
462
+ defer close (m .recvChan )
463
+
464
+ ds := initializeDeliverHandler ()
465
+ go ds .Handle (m )
466
+
467
+ m .recvChan <- & cb.Envelope {Payload : utils .MarshalOrPanic (& cb.Payload {})}
468
+
469
+ select {
470
+ case deliverReply := <- m .sendChan :
471
+ assert .Equal (t , cb .Status_BAD_REQUEST , deliverReply .GetStatus (), "Received wrong error on the reply channel" )
472
+ case <- time .After (time .Second ):
473
+ t .Fatalf ("Timed out waiting to get all blocks" )
474
+ }
475
+ }
476
+
477
+ func TestBadChannelHeader (t * testing.T ) {
478
+ m := newMockD ()
479
+ defer close (m .recvChan )
480
+
481
+ ds := initializeDeliverHandler ()
482
+ go ds .Handle (m )
483
+
484
+ m .recvChan <- & cb.Envelope {Payload : utils .MarshalOrPanic (& cb.Payload {
485
+ Header : & cb.Header {ChannelHeader : []byte ("Foo" )},
486
+ })}
487
+
488
+ select {
489
+ case deliverReply := <- m .sendChan :
490
+ assert .Equal (t , cb .Status_BAD_REQUEST , deliverReply .GetStatus (), "Received wrong error on the reply channel" )
491
+ case <- time .After (time .Second ):
492
+ t .Fatalf ("Timed out waiting to get all blocks" )
493
+ }
494
+ }
495
+
496
+ func TestChainNotFound (t * testing.T ) {
497
+ mm := & mockSupportManager {
498
+ chains : make (map [string ]* mockSupport ),
499
+ }
500
+
501
+ m := newMockD ()
502
+ defer close (m .recvChan )
503
+
504
+ ds := NewHandlerImpl (mm )
505
+ go ds .Handle (m )
506
+
507
+ m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekNewest , Stop : seekNewest , Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
508
+
509
+ select {
510
+ case deliverReply := <- m .sendChan :
511
+ assert .Equal (t , cb .Status_NOT_FOUND , deliverReply .GetStatus (), "Received wrong error on the reply channel" )
512
+ case <- time .After (time .Second ):
513
+ t .Fatalf ("Timed out waiting to get all blocks" )
514
+ }
515
+ }
516
+
517
+ func TestBadSeekInfoPayload (t * testing.T ) {
518
+ m := newMockD ()
519
+ defer close (m .recvChan )
520
+
521
+ ds := initializeDeliverHandler ()
522
+ go ds .Handle (m )
523
+
524
+ m .recvChan <- & cb.Envelope {
525
+ Payload : utils .MarshalOrPanic (& cb.Payload {
526
+ Header : & cb.Header {
527
+ ChannelHeader : utils .MarshalOrPanic (& cb.ChannelHeader {
528
+ ChannelId : systemChainID ,
529
+ }),
530
+ SignatureHeader : utils .MarshalOrPanic (& cb.SignatureHeader {}),
531
+ },
532
+ Data : []byte ("Foo" ),
533
+ }),
534
+ }
535
+
536
+ select {
537
+ case deliverReply := <- m .sendChan :
538
+ assert .Equal (t , cb .Status_BAD_REQUEST , deliverReply .GetStatus (), "Received wrong error on the reply channel" )
539
+ case <- time .After (time .Second ):
540
+ t .Fatalf ("Timed out waiting to get all blocks" )
541
+ }
542
+ }
543
+
544
+ func TestMissingSeekPosition (t * testing.T ) {
545
+ m := newMockD ()
546
+ defer close (m .recvChan )
547
+
548
+ ds := initializeDeliverHandler ()
549
+ go ds .Handle (m )
550
+
551
+ m .recvChan <- & cb.Envelope {
552
+ Payload : utils .MarshalOrPanic (& cb.Payload {
553
+ Header : & cb.Header {
554
+ ChannelHeader : utils .MarshalOrPanic (& cb.ChannelHeader {
555
+ ChannelId : systemChainID ,
556
+ }),
557
+ SignatureHeader : utils .MarshalOrPanic (& cb.SignatureHeader {}),
558
+ },
559
+ Data : nil ,
560
+ }),
561
+ }
562
+
563
+ select {
564
+ case deliverReply := <- m .sendChan :
565
+ assert .Equal (t , cb .Status_BAD_REQUEST , deliverReply .GetStatus (), "Received wrong error on the reply channel" )
566
+ case <- time .After (time .Second ):
567
+ t .Fatalf ("Timed out waiting to get all blocks" )
568
+ }
569
+ }
0 commit comments