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  }