@@ -18,6 +18,7 @@ package deliver
18
18
19
19
import (
20
20
"fmt"
21
+ "io"
21
22
"testing"
22
23
"time"
23
24
@@ -30,6 +31,7 @@ import (
30
31
ab "github.com/hyperledger/fabric/protos/orderer"
31
32
"github.com/hyperledger/fabric/protos/utils"
32
33
logging "github.com/op/go-logging"
34
+ "github.com/stretchr/testify/assert"
33
35
"google.golang.org/grpc"
34
36
)
35
37
@@ -64,7 +66,7 @@ func (m *mockD) Send(br *ab.DeliverResponse) error {
64
66
func (m * mockD ) Recv () (* cb.Envelope , error ) {
65
67
msg , ok := <- m .recvChan
66
68
if ! ok {
67
- return msg , fmt . Errorf ( "Channel closed" )
69
+ return msg , io . EOF
68
70
}
69
71
return msg , nil
70
72
}
@@ -98,6 +100,16 @@ func NewRAMLedger() ledger.ReadWriter {
98
100
return rl
99
101
}
100
102
103
+ func initializeDeliverHandler () Handler {
104
+ mm := newMockMultichainManager ()
105
+ for i := 1 ; i < ledgerSize ; i ++ {
106
+ l := mm .chains [systemChainID ].ledger
107
+ l .Append (ledger .CreateNextBlock (l , []* cb.Envelope {& cb.Envelope {Payload : []byte (fmt .Sprintf ("%d" , i ))}}))
108
+ }
109
+
110
+ return NewHandlerImpl (mm )
111
+ }
112
+
101
113
func newMockMultichainManager () * mockSupportManager {
102
114
rl := NewRAMLedger ()
103
115
mm := & mockSupportManager {
@@ -132,16 +144,10 @@ func makeSeek(chainID string, seekInfo *ab.SeekInfo) *cb.Envelope {
132
144
}
133
145
134
146
func TestOldestSeek (t * testing.T ) {
135
- mm := newMockMultichainManager ()
136
- for i := 1 ; i < ledgerSize ; i ++ {
137
- l := mm .chains [systemChainID ].ledger
138
- l .Append (ledger .CreateNextBlock (l , []* cb.Envelope {& cb.Envelope {Payload : []byte (fmt .Sprintf ("%d" , i ))}}))
139
- }
140
-
141
147
m := newMockD ()
142
148
defer close (m .recvChan )
143
- ds := NewHandlerImpl (mm )
144
149
150
+ ds := initializeDeliverHandler ()
145
151
go ds .Handle (m )
146
152
147
153
m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekOldest , Stop : seekNewest , Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
@@ -170,27 +176,18 @@ func TestOldestSeek(t *testing.T) {
170
176
}
171
177
172
178
func TestNewestSeek (t * testing.T ) {
173
- mm := newMockMultichainManager ()
174
- for i := 1 ; i < ledgerSize ; i ++ {
175
- l := mm .chains [systemChainID ].ledger
176
- l .Append (ledger .CreateNextBlock (l , []* cb.Envelope {& cb.Envelope {Payload : []byte (fmt .Sprintf ("%d" , i ))}}))
177
- }
178
-
179
179
m := newMockD ()
180
180
defer close (m .recvChan )
181
- ds := NewHandlerImpl (mm )
182
181
182
+ ds := initializeDeliverHandler ()
183
183
go ds .Handle (m )
184
184
185
185
m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekNewest , Stop : seekNewest , Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
186
186
187
187
select {
188
188
case deliverReply := <- m .sendChan :
189
189
if deliverReply .GetBlock () == nil {
190
- if deliverReply .GetStatus () != cb .Status_SUCCESS {
191
- t .Fatalf ("Received an error on the reply channel" )
192
- }
193
- return
190
+ t .Fatalf ("Received an error on the reply channel" )
194
191
}
195
192
if deliverReply .GetBlock ().Header .Number != uint64 (ledgerSize - 1 ) {
196
193
t .Fatalf ("Expected only the most recent block" )
@@ -201,20 +198,14 @@ func TestNewestSeek(t *testing.T) {
201
198
}
202
199
203
200
func TestSpecificSeek (t * testing.T ) {
204
- mm := newMockMultichainManager ()
205
- for i := 1 ; i < ledgerSize ; i ++ {
206
- l := mm .chains [systemChainID ].ledger
207
- l .Append (ledger .CreateNextBlock (l , []* cb.Envelope {& cb.Envelope {Payload : []byte (fmt .Sprintf ("%d" , i ))}}))
208
- }
209
-
210
201
m := newMockD ()
211
202
defer close (m .recvChan )
212
- ds := NewHandlerImpl (mm )
213
- specifiedStart := uint64 (3 )
214
- specifiedStop := uint64 (7 )
215
203
204
+ ds := initializeDeliverHandler ()
216
205
go ds .Handle (m )
217
206
207
+ specifiedStart := uint64 (3 )
208
+ specifiedStop := uint64 (7 )
218
209
m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekSpecified (specifiedStart ), Stop : seekSpecified (specifiedStop ), Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
219
210
220
211
count := uint64 (0 )
@@ -264,16 +255,10 @@ func TestUnauthorizedSeek(t *testing.T) {
264
255
}
265
256
266
257
func TestBadSeek (t * testing.T ) {
267
- mm := newMockMultichainManager ()
268
- for i := 1 ; i < ledgerSize ; i ++ {
269
- l := mm .chains [systemChainID ].ledger
270
- l .Append (ledger .CreateNextBlock (l , []* cb.Envelope {& cb.Envelope {Payload : []byte (fmt .Sprintf ("%d" , i ))}}))
271
- }
272
-
273
258
m := newMockD ()
274
259
defer close (m .recvChan )
275
- ds := NewHandlerImpl (mm )
276
260
261
+ ds := initializeDeliverHandler ()
277
262
go ds .Handle (m )
278
263
279
264
m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekSpecified (uint64 (3 * ledgerSize )), Stop : seekSpecified (uint64 (3 * ledgerSize )), Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
@@ -289,16 +274,10 @@ func TestBadSeek(t *testing.T) {
289
274
}
290
275
291
276
func TestFailFastSeek (t * testing.T ) {
292
- mm := newMockMultichainManager ()
293
- for i := 1 ; i < ledgerSize ; i ++ {
294
- l := mm .chains [systemChainID ].ledger
295
- l .Append (ledger .CreateNextBlock (l , []* cb.Envelope {& cb.Envelope {Payload : []byte (fmt .Sprintf ("%d" , i ))}}))
296
- }
297
-
298
277
m := newMockD ()
299
278
defer close (m .recvChan )
300
- ds := NewHandlerImpl (mm )
301
279
280
+ ds := initializeDeliverHandler ()
302
281
go ds .Handle (m )
303
282
304
283
m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekSpecified (uint64 (ledgerSize - 1 )), Stop : seekSpecified (ledgerSize ), Behavior : ab .SeekInfo_FAIL_IF_NOT_READY })
@@ -373,3 +352,32 @@ func TestBlockingSeek(t *testing.T) {
373
352
t .Fatalf ("Timed out waiting to get all blocks" )
374
353
}
375
354
}
355
+
356
+ func TestSGracefulShutdown (t * testing.T ) {
357
+ m := newMockD ()
358
+ ds := NewHandlerImpl (nil )
359
+
360
+ close (m .recvChan )
361
+ assert .NoError (t , ds .Handle (m ), "Expected no error for hangup" )
362
+ }
363
+
364
+ func TestReversedSeqSeek (t * testing.T ) {
365
+ m := newMockD ()
366
+ defer close (m .recvChan )
367
+
368
+ ds := initializeDeliverHandler ()
369
+ go ds .Handle (m )
370
+
371
+ specifiedStart := uint64 (7 )
372
+ specifiedStop := uint64 (3 )
373
+ m .recvChan <- makeSeek (systemChainID , & ab.SeekInfo {Start : seekSpecified (specifiedStart ), Stop : seekSpecified (specifiedStop ), Behavior : ab .SeekInfo_BLOCK_UNTIL_READY })
374
+
375
+ select {
376
+ case deliverReply := <- m .sendChan :
377
+ if deliverReply .GetStatus () != cb .Status_BAD_REQUEST {
378
+ t .Fatalf ("Received wrong error on the reply channel" )
379
+ }
380
+ case <- time .After (time .Second ):
381
+ t .Fatalf ("Timed out waiting to get all blocks" )
382
+ }
383
+ }
0 commit comments