@@ -20,6 +20,7 @@ import (
20
20
"bytes"
21
21
"fmt"
22
22
"strconv"
23
+ "sync"
23
24
"testing"
24
25
"time"
25
26
@@ -28,12 +29,14 @@ import (
28
29
"github.com/hyperledger/fabric/core/ledger/ledgermgmt"
29
30
"github.com/hyperledger/fabric/core/util"
30
31
"github.com/hyperledger/fabric/gossip/api"
32
+ "github.com/hyperledger/fabric/gossip/comm"
31
33
"github.com/hyperledger/fabric/gossip/common"
32
34
"github.com/hyperledger/fabric/gossip/gossip"
33
35
"github.com/hyperledger/fabric/gossip/proto"
34
36
pcomm "github.com/hyperledger/fabric/protos/common"
35
37
"github.com/op/go-logging"
36
38
"github.com/spf13/viper"
39
+ "github.com/stretchr/testify/assert"
37
40
)
38
41
39
42
var (
@@ -332,6 +335,70 @@ func TestNewGossipStateProvider_SendingManyMessages(t *testing.T) {
332
335
}, 60 * time .Second )
333
336
}
334
337
338
+ func TestGossipStateProvider_TestStateMessages (t * testing.T ) {
339
+ viper .Set ("peer.fileSystemPath" , "/tmp/tests/ledger/node" )
340
+ ledgermgmt .InitializeTestEnv ()
341
+ defer ledgermgmt .CleanupTestEnv ()
342
+
343
+ bootPeer := newPeerNode (newGossipConfig (0 , 100 ), newCommitter (0 ))
344
+ defer bootPeer .shutdown ()
345
+
346
+ peer := newPeerNode (newGossipConfig (1 , 100 , 0 ), newCommitter (1 ))
347
+ defer peer .shutdown ()
348
+
349
+ _ , bootCh := bootPeer .g .Accept (remoteStateMsgFilter , true )
350
+ _ , peerCh := peer .g .Accept (remoteStateMsgFilter , true )
351
+
352
+ wg := sync.WaitGroup {}
353
+ wg .Add (2 )
354
+
355
+ go func () {
356
+ msg := <- bootCh
357
+ logger .Info ("Bootstrap node got message, " , msg )
358
+ assert .True (t , msg .GetGossipMessage ().GetStateRequest () != nil )
359
+ msg .Respond (& proto.GossipMessage {
360
+ Content : & proto.GossipMessage_StateResponse {& proto.RemoteStateResponse {nil }},
361
+ })
362
+ wg .Done ()
363
+ }()
364
+
365
+ go func () {
366
+ msg := <- peerCh
367
+ logger .Info ("Peer node got an answer, " , msg )
368
+ assert .True (t , msg .GetGossipMessage ().GetStateResponse () != nil )
369
+ wg .Done ()
370
+
371
+ }()
372
+
373
+ readyCh := make (chan struct {})
374
+ go func () {
375
+ wg .Wait ()
376
+ readyCh <- struct {}{}
377
+ }()
378
+
379
+ time .Sleep (time .Duration (5 ) * time .Second )
380
+ logger .Info ("Sending gossip message with remote state request" )
381
+
382
+ chainID := common .ChainID (util .GetTestChainID ())
383
+
384
+ peer .g .Send (& proto.GossipMessage {
385
+ Content : & proto.GossipMessage_StateRequest {& proto.RemoteStateRequest {nil }},
386
+ }, & comm.RemotePeer {peer .g .PeersOfChannel (chainID )[0 ].Endpoint , peer .g .PeersOfChannel (chainID )[0 ].PKIid })
387
+ logger .Info ("Waiting until peers exchange messages" )
388
+
389
+ select {
390
+ case <- readyCh :
391
+ {
392
+ logger .Info ("[XXX]: Done!!!" )
393
+
394
+ }
395
+ case <- time .After (time .Duration (10 ) * time .Second ):
396
+ {
397
+ t .Fail ()
398
+ }
399
+ }
400
+ }
401
+
335
402
func waitUntilTrueOrTimeout (t * testing.T , predicate func () bool , timeout time.Duration ) {
336
403
ch := make (chan struct {})
337
404
go func () {
0 commit comments