github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/gossip/util/msgs_test.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package util
     8  
     9  import (
    10  	"reflect"
    11  	"testing"
    12  
    13  	"github.com/hechain20/hechain/gossip/common"
    14  	"github.com/hechain20/hechain/gossip/protoext"
    15  	proto "github.com/hyperledger/fabric-protos-go/gossip"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func init() {
    20  	SetupTestLogging()
    21  }
    22  
    23  func TestMembershipStore(t *testing.T) {
    24  	membershipStore := NewMembershipStore()
    25  
    26  	id1 := common.PKIidType("id1")
    27  	id2 := common.PKIidType("id2")
    28  
    29  	msg1 := &protoext.SignedGossipMessage{}
    30  	msg2 := &protoext.SignedGossipMessage{Envelope: &proto.Envelope{}}
    31  
    32  	// Test initially created store is empty
    33  	require.Nil(t, membershipStore.MsgByID(id1))
    34  	require.Equal(t, membershipStore.Size(), 0)
    35  	// Test put works as expected
    36  	membershipStore.Put(id1, msg1)
    37  	require.NotNil(t, membershipStore.MsgByID(id1))
    38  	// Test MsgByID returns the right instance stored
    39  	membershipStore.Put(id2, msg2)
    40  	require.Equal(t, msg1, membershipStore.MsgByID(id1))
    41  	require.NotEqual(t, msg2, membershipStore.MsgByID(id1))
    42  	// Test capacity grows
    43  	require.Equal(t, membershipStore.Size(), 2)
    44  	// Test remove works
    45  	membershipStore.Remove(id1)
    46  	require.Nil(t, membershipStore.MsgByID(id1))
    47  	require.Equal(t, membershipStore.Size(), 1)
    48  	// Test returned instance is not a copy
    49  	msg3 := &protoext.SignedGossipMessage{GossipMessage: &proto.GossipMessage{}}
    50  	msg3Clone := &protoext.SignedGossipMessage{GossipMessage: &proto.GossipMessage{}}
    51  	id3 := common.PKIidType("id3")
    52  	membershipStore.Put(id3, msg3)
    53  	require.Equal(t, msg3Clone, msg3)
    54  	membershipStore.MsgByID(id3).Channel = []byte{0, 1, 2, 3}
    55  	require.NotEqual(t, msg3Clone, msg3)
    56  }
    57  
    58  func TestToSlice(t *testing.T) {
    59  	membershipStore := NewMembershipStore()
    60  	id1 := common.PKIidType("id1")
    61  	id2 := common.PKIidType("id2")
    62  	id3 := common.PKIidType("id3")
    63  	id4 := common.PKIidType("id4")
    64  
    65  	msg1 := &protoext.SignedGossipMessage{}
    66  	msg2 := &protoext.SignedGossipMessage{Envelope: &proto.Envelope{}}
    67  	msg3 := &protoext.SignedGossipMessage{GossipMessage: &proto.GossipMessage{}}
    68  	msg4 := &protoext.SignedGossipMessage{GossipMessage: &proto.GossipMessage{}, Envelope: &proto.Envelope{}}
    69  
    70  	membershipStore.Put(id1, msg1)
    71  	membershipStore.Put(id2, msg2)
    72  	membershipStore.Put(id3, msg3)
    73  	membershipStore.Put(id4, msg4)
    74  
    75  	require.Len(t, membershipStore.ToSlice(), 4)
    76  
    77  	existsInSlice := func(slice []*protoext.SignedGossipMessage, msg *protoext.SignedGossipMessage) bool {
    78  		for _, m := range slice {
    79  			if reflect.DeepEqual(m, msg) {
    80  				return true
    81  			}
    82  		}
    83  		return false
    84  	}
    85  
    86  	expectedMsgs := []*protoext.SignedGossipMessage{msg1, msg2, msg3, msg4}
    87  	for _, msg := range membershipStore.ToSlice() {
    88  		require.True(t, existsInSlice(expectedMsgs, msg))
    89  	}
    90  }