Skip to content

Commit a591337

Browse files
committed
[FAB-4114] Improve UT coverage of deliver
Added several tests to improve UT coverage of deliver. Also, some existing tests are renamed to be more precise. Change-Id: I03f6f2f1af9b64251b682ec30561ac27ab2ff4e0 Signed-off-by: Jay Guo <[email protected]>
1 parent a14912f commit a591337

File tree

1 file changed

+188
-2
lines changed

1 file changed

+188
-2
lines changed

orderer/common/deliver/deliver_test.go

+188-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,35 @@ func (m *mockD) Recv() (*cb.Envelope, error) {
7171
return msg, nil
7272
}
7373

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+
74103
type mockSupportManager struct {
75104
chains map[string]*mockSupport
76105
}
@@ -143,7 +172,7 @@ func makeSeek(chainID string, seekInfo *ab.SeekInfo) *cb.Envelope {
143172
}
144173
}
145174

146-
func TestOldestSeek(t *testing.T) {
175+
func TestWholeChainSeek(t *testing.T) {
147176
m := newMockD()
148177
defer close(m.recvChan)
149178

@@ -254,7 +283,7 @@ func TestUnauthorizedSeek(t *testing.T) {
254283
}
255284
}
256285

257-
func TestBadSeek(t *testing.T) {
286+
func TestOutOfBoundSeek(t *testing.T) {
258287
m := newMockD()
259288
defer close(m.recvChan)
260289

@@ -381,3 +410,160 @@ func TestReversedSeqSeek(t *testing.T) {
381410
t.Fatalf("Timed out waiting to get all blocks")
382411
}
383412
}
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

Comments
 (0)