@@ -13,6 +13,7 @@ import (
13
13
"math/rand"
14
14
"strconv"
15
15
"sync"
16
+ "sync/atomic"
16
17
"testing"
17
18
"time"
18
19
@@ -553,6 +554,107 @@ func TestGossipReception(t *testing.T) {
553
554
}
554
555
}
555
556
557
+ func TestMetadataCompatibility (t * testing.T ) {
558
+ // Scenario: For each test, spawn a peer and supply it
559
+ // with a specific mock of PeersOfChannel from peers that
560
+ // either set both metadata properly, or only the properties, or none, or both.
561
+ // Ensure the logic handles all of the 4 possible cases as needed
562
+
563
+ // Returns whether the given networkMember was selected or not
564
+ wasNetworkMemberSelected := func (t * testing.T , networkMember discovery.NetworkMember , wg * sync.WaitGroup ) bool {
565
+ var wasGivenNetworkMemberSelected int32
566
+ finChan := make (chan struct {})
567
+ g := & mocks.GossipMock {}
568
+ g .On ("Send" , mock .Anything , mock .Anything ).Run (func (arguments mock.Arguments ) {
569
+ defer wg .Done ()
570
+ msg := arguments .Get (0 ).(* proto.GossipMessage )
571
+ assert .NotNil (t , msg .GetStateRequest ())
572
+ peer := arguments .Get (1 ).([]* comm.RemotePeer )[0 ]
573
+ if bytes .Equal (networkMember .PKIid , peer .PKIID ) {
574
+ atomic .StoreInt32 (& wasGivenNetworkMemberSelected , 1 )
575
+ }
576
+ finChan <- struct {}{}
577
+ })
578
+ g .On ("Accept" , mock .Anything , false ).Return (make (<- chan * proto.GossipMessage ), nil )
579
+ g .On ("Accept" , mock .Anything , true ).Return (nil , make (<- chan proto.ReceivedMessage ))
580
+ metaState := common .NewNodeMetastate (5 )
581
+ b , _ := metaState .Bytes ()
582
+ defaultPeer := discovery.NetworkMember {
583
+ InternalEndpoint : "b" ,
584
+ PKIid : common .PKIidType ("b" ),
585
+ Metadata : b ,
586
+ Properties : & proto.Properties {
587
+ LedgerHeight : 5 ,
588
+ },
589
+ }
590
+ g .On ("PeersOfChannel" , mock .Anything ).Return ([]discovery.NetworkMember {
591
+ defaultPeer ,
592
+ networkMember ,
593
+ })
594
+ mc := & mockCommitter {}
595
+ mc .On ("LedgerHeight" , mock .Anything ).Return (uint64 (1 ), nil )
596
+ p := newPeerNodeWithGossip (newGossipConfig (0 ), mc , noopPeerIdentityAcceptor , g )
597
+ defer p .shutdown ()
598
+ select {
599
+ case <- time .After (time .Second * 20 ):
600
+ t .Fatal ("Didn't send a request within a timely manner" )
601
+ case <- finChan :
602
+ }
603
+ return atomic .LoadInt32 (& wasGivenNetworkMemberSelected ) == 1
604
+ }
605
+
606
+ peerWithoutMetadata := discovery.NetworkMember {
607
+ PKIid : common .PKIidType ("peerWithoutMetadata" ),
608
+ Properties : & proto.Properties {
609
+ LedgerHeight : 10 ,
610
+ },
611
+ InternalEndpoint : "peerWithoutMetadata" ,
612
+ }
613
+
614
+ ms := common.NodeMetastate {
615
+ LedgerHeight : 10 ,
616
+ }
617
+ b , _ := ms .Bytes ()
618
+ peerWithoutProperties := discovery.NetworkMember {
619
+ PKIid : common .PKIidType ("peerWithoutProperties" ),
620
+ InternalEndpoint : "peerWithoutProperties" ,
621
+ Metadata : b ,
622
+ }
623
+
624
+ peerWithoutEverything := discovery.NetworkMember {
625
+ PKIid : common .PKIidType ("peerWithoutProperties" ),
626
+ InternalEndpoint : "peerWithoutProperties" ,
627
+ }
628
+
629
+ peerWithEverything := discovery.NetworkMember {
630
+ PKIid : common .PKIidType ("peerWitEverything" ),
631
+ InternalEndpoint : "peerWitEverything" ,
632
+ Metadata : b ,
633
+ Properties : & proto.Properties {
634
+ LedgerHeight : 10 ,
635
+ },
636
+ }
637
+
638
+ tests := []struct {
639
+ shouldGivenBeSelected bool
640
+ member discovery.NetworkMember
641
+ }{
642
+ {member : peerWithoutMetadata , shouldGivenBeSelected : true },
643
+ {member : peerWithoutProperties , shouldGivenBeSelected : true },
644
+ {member : peerWithoutEverything , shouldGivenBeSelected : false },
645
+ {member : peerWithEverything , shouldGivenBeSelected : true },
646
+ }
647
+
648
+ var wg sync.WaitGroup
649
+ wg .Add (len (tests ))
650
+ for _ , tst := range tests {
651
+ go func (shouldGivenBeSelected bool , member discovery.NetworkMember ) {
652
+ assert .Equal (t , shouldGivenBeSelected , wasNetworkMemberSelected (t , member , & wg ))
653
+ }(tst .shouldGivenBeSelected , tst .member )
654
+ }
655
+ wg .Wait ()
656
+ }
657
+
556
658
func TestAccessControl (t * testing.T ) {
557
659
viper .Set ("peer.fileSystemPath" , "/tmp/tests/ledger/node" )
558
660
ledgermgmt .InitializeTestEnv ()
0 commit comments