github.com/kaituanwang/hyperledger@v2.0.1+incompatible/discovery/cmd/peers_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package discovery_test 8 9 import ( 10 "bytes" 11 "fmt" 12 "testing" 13 "time" 14 15 "github.com/hyperledger/fabric-protos-go/gossip" 16 "github.com/hyperledger/fabric-protos-go/msp" 17 "github.com/hyperledger/fabric/cmd/common" 18 . "github.com/hyperledger/fabric/discovery/client" 19 discovery "github.com/hyperledger/fabric/discovery/cmd" 20 "github.com/hyperledger/fabric/discovery/cmd/mocks" 21 "github.com/hyperledger/fabric/gossip/protoext" 22 "github.com/hyperledger/fabric/protoutil" 23 "github.com/pkg/errors" 24 "github.com/stretchr/testify/assert" 25 "github.com/stretchr/testify/mock" 26 ) 27 28 func TestPeerCmd(t *testing.T) { 29 server := "peer0" 30 stub := &mocks.Stub{} 31 parser := &mocks.ResponseParser{} 32 cmd := discovery.NewPeerCmd(stub, parser) 33 34 t.Run("no server supplied", func(t *testing.T) { 35 cmd.SetServer(nil) 36 err := cmd.Execute(common.Config{}) 37 assert.Equal(t, err.Error(), "no server specified") 38 }) 39 40 t.Run("Server return error", func(t *testing.T) { 41 cmd.SetServer(&server) 42 stub.On("Send", server, mock.Anything, mock.Anything).Return(nil, errors.New("deadline exceeded")).Once() 43 err := cmd.Execute(common.Config{}) 44 assert.Contains(t, err.Error(), "deadline exceeded") 45 }) 46 47 t.Run("Channel(less) peer query", func(t *testing.T) { 48 stub.On("Send", server, mock.Anything, mock.Anything).Return(nil, nil).Twice() 49 cmd.SetServer(&server) 50 cmd.SetChannel(nil) 51 52 var emptyChannel string 53 parser.On("ParseResponse", emptyChannel, mock.Anything).Return(nil) 54 err := cmd.Execute(common.Config{}) 55 assert.NoError(t, err) 56 57 channel := "mychannel" 58 cmd.SetChannel(&channel) 59 parser.On("ParseResponse", channel, mock.Anything).Return(nil) 60 err = cmd.Execute(common.Config{}) 61 assert.NoError(t, err) 62 }) 63 } 64 65 func TestParsePeers(t *testing.T) { 66 buff := &bytes.Buffer{} 67 parser := &discovery.PeerResponseParser{Writer: buff} 68 res := &mocks.ServiceResponse{} 69 70 sID := &msp.SerializedIdentity{ 71 Mspid: "Org1MSP", 72 IdBytes: []byte("identity"), 73 } 74 75 idBytes := protoutil.MarshalOrPanic(sID) 76 77 validPeer := &Peer{ 78 MSPID: "Org1MSP", 79 Identity: idBytes, 80 AliveMessage: aliveMessage(0), 81 StateInfoMessage: stateInfoMessage(100), 82 } 83 invalidPeer := &Peer{ 84 MSPID: "Org2MSP", 85 } 86 87 chanRes := &mocks.ChannelResponse{} 88 chanRes.On("Peers").Return([]*Peer{validPeer, invalidPeer}, nil) 89 locRes := &mocks.LocalResponse{} 90 locRes.On("Peers").Return([]*Peer{validPeer, invalidPeer}, nil) 91 92 res.On("ForChannel", "mychannel").Return(chanRes) 93 res.On("ForLocal").Return(locRes) 94 95 channel2expected := map[string]string{ 96 "mychannel": "[\n\t{\n\t\t\"MSPID\": \"Org1MSP\",\n\t\t\"LedgerHeight\": 100,\n\t\t\"Endpoint\": \"p0\",\n\t\t\"Identity\": \"identity\",\n\t\t\"Chaincodes\": [\n\t\t\t\"mycc\",\n\t\t\t\"mycc2\"\n\t\t]\n\t},\n\t{\n\t\t\"MSPID\": \"Org2MSP\",\n\t\t\"LedgerHeight\": 0,\n\t\t\"Endpoint\": \"\",\n\t\t\"Identity\": \"\",\n\t\t\"Chaincodes\": null\n\t}\n]", 97 "": "[\n\t{\n\t\t\"MSPID\": \"Org1MSP\",\n\t\t\"Endpoint\": \"p0\",\n\t\t\"Identity\": \"identity\"\n\t},\n\t{\n\t\t\"MSPID\": \"Org2MSP\",\n\t\t\"Endpoint\": \"\",\n\t\t\"Identity\": \"\"\n\t}\n]", 98 } 99 100 for channel, expected := range channel2expected { 101 buff.Reset() 102 err := parser.ParseResponse(channel, res) 103 assert.NoError(t, err) 104 assert.Equal(t, fmt.Sprintf("%s\n", expected), buff.String()) 105 } 106 } 107 108 func aliveMessage(id int) *protoext.SignedGossipMessage { 109 g := &gossip.GossipMessage{ 110 Content: &gossip.GossipMessage_AliveMsg{ 111 AliveMsg: &gossip.AliveMessage{ 112 Timestamp: &gossip.PeerTime{ 113 SeqNum: uint64(id), 114 IncNum: uint64(time.Now().UnixNano()), 115 }, 116 Membership: &gossip.Member{ 117 Endpoint: fmt.Sprintf("p%d", id), 118 }, 119 }, 120 }, 121 } 122 sMsg, _ := protoext.NoopSign(g) 123 return sMsg 124 } 125 126 func stateInfoMessage(height uint64) *protoext.SignedGossipMessage { 127 g := &gossip.GossipMessage{ 128 Content: &gossip.GossipMessage_StateInfo{ 129 StateInfo: &gossip.StateInfo{ 130 Timestamp: &gossip.PeerTime{ 131 SeqNum: 5, 132 IncNum: uint64(time.Now().UnixNano()), 133 }, 134 Properties: &gossip.Properties{ 135 LedgerHeight: height, 136 Chaincodes: []*gossip.Chaincode{ 137 {Name: "mycc"}, 138 {Name: "mycc2"}, 139 }, 140 }, 141 }, 142 }, 143 } 144 sMsg, _ := protoext.NoopSign(g) 145 return sMsg 146 }