github.com/tenywen/fabric@v1.0.0-beta.0.20170620030522-a5b1ed380643/protos/gossip/extensions_test.go (about)

     1  /*
     2  Copyright IBM Corp. 2017 All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8  		 http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package gossip
    18  
    19  import (
    20  	"errors"
    21  	"fmt"
    22  	"testing"
    23  
    24  	"github.com/golang/protobuf/proto"
    25  	"github.com/hyperledger/fabric/gossip/common"
    26  	"github.com/stretchr/testify/assert"
    27  )
    28  
    29  func TestToString(t *testing.T) {
    30  	// Ensure we don't print the byte content when we
    31  	// log messages.
    32  	// Each payload or signature contains '2' so we would've logged
    33  	// them if not for the overloading of the String() method in SignedGossipMessage
    34  
    35  	// The following line proves that the envelopes constructed in this test
    36  	// have "2" in them when they are printed
    37  	assert.Contains(t, fmt.Sprintf("%v", envelopes()[0]), "2")
    38  	// and the following does the same for payloads:
    39  	dMsg := &DataMessage{
    40  		Payload: &Payload{
    41  			SeqNum: 3,
    42  			Data:   []byte{2, 2, 2, 2, 2},
    43  		},
    44  	}
    45  	assert.Contains(t, fmt.Sprintf("%v", dMsg), "2")
    46  
    47  	// Now we construct all types of messages that have envelopes or payloads in them
    48  	// and see that "2" is not outputted into their formatting even though it is found
    49  	// as a sub-message of the outer message.
    50  
    51  	sMsg := &SignedGossipMessage{
    52  		GossipMessage: &GossipMessage{
    53  			Tag:     GossipMessage_EMPTY,
    54  			Nonce:   5,
    55  			Channel: []byte("A"),
    56  			Content: &GossipMessage_DataMsg{
    57  				DataMsg: &DataMessage{
    58  					Payload: &Payload{
    59  						SeqNum: 3,
    60  						Data:   []byte{2, 2, 2, 2, 2},
    61  					},
    62  				},
    63  			},
    64  		},
    65  		Envelope: &Envelope{
    66  			Payload:   []byte{0, 1, 2, 3, 4, 5, 6},
    67  			Signature: []byte{0, 1, 2},
    68  			SecretEnvelope: &SecretEnvelope{
    69  				Payload:   []byte{0, 1, 2, 3, 4, 5},
    70  				Signature: []byte{0, 1, 2},
    71  			},
    72  		},
    73  	}
    74  	assert.NotContains(t, fmt.Sprintf("%v", sMsg), "2")
    75  
    76  	sMsg = &SignedGossipMessage{
    77  		GossipMessage: &GossipMessage{
    78  			Channel: []byte("A"),
    79  			Tag:     GossipMessage_EMPTY,
    80  			Nonce:   5,
    81  			Content: &GossipMessage_DataUpdate{
    82  				DataUpdate: &DataUpdate{
    83  					Nonce:   11,
    84  					MsgType: PullMsgType_BLOCK_MSG,
    85  					Data:    envelopes(),
    86  				},
    87  			},
    88  		},
    89  		Envelope: envelopes()[0],
    90  	}
    91  	assert.NotContains(t, fmt.Sprintf("%v", sMsg), "2")
    92  
    93  	sMsg = &SignedGossipMessage{
    94  		GossipMessage: &GossipMessage{
    95  			Channel: []byte("A"),
    96  			Tag:     GossipMessage_EMPTY,
    97  			Nonce:   5,
    98  			Content: &GossipMessage_MemRes{
    99  				MemRes: &MembershipResponse{
   100  					Alive: envelopes(),
   101  					Dead:  envelopes(),
   102  				},
   103  			},
   104  		},
   105  		Envelope: envelopes()[0],
   106  	}
   107  	assert.NotContains(t, fmt.Sprintf("%v", sMsg), "2")
   108  
   109  	sMsg = &SignedGossipMessage{
   110  		GossipMessage: &GossipMessage{
   111  			Channel: []byte("A"),
   112  			Tag:     GossipMessage_EMPTY,
   113  			Nonce:   5,
   114  			Content: &GossipMessage_StateSnapshot{
   115  				StateSnapshot: &StateInfoSnapshot{
   116  					Elements: envelopes(),
   117  				},
   118  			},
   119  		},
   120  		Envelope: envelopes()[0],
   121  	}
   122  	assert.NotContains(t, fmt.Sprintf("%v", sMsg), "2")
   123  
   124  	sMsg = &SignedGossipMessage{
   125  		GossipMessage: &GossipMessage{
   126  			Channel: []byte("A"),
   127  			Tag:     GossipMessage_EMPTY,
   128  			Nonce:   5,
   129  			Content: &GossipMessage_StateResponse{
   130  				StateResponse: &RemoteStateResponse{
   131  					Payloads: []*Payload{
   132  						{Data: []byte{2, 2, 2}},
   133  					},
   134  				},
   135  			},
   136  		},
   137  		Envelope: envelopes()[0],
   138  	}
   139  	assert.NotContains(t, fmt.Sprintf("%v", sMsg), "2")
   140  }
   141  
   142  func TestAliveMessageNoActionTaken(t *testing.T) {
   143  	comparator := NewGossipMessageComparator(1)
   144  
   145  	sMsg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   146  		AliveMsg: &AliveMessage{
   147  			Membership: &Member{
   148  				Endpoint: "localhost",
   149  				Metadata: []byte{1, 2, 3, 4, 5},
   150  				PkiId:    []byte{17},
   151  			},
   152  			Timestamp: &PeerTime{
   153  				IncNum: 1,
   154  				SeqNum: 1,
   155  			},
   156  			Identity: []byte("peerID1"),
   157  		},
   158  	})
   159  
   160  	sMsg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   161  		AliveMsg: &AliveMessage{
   162  			Membership: &Member{
   163  				Endpoint: "localhost",
   164  				Metadata: []byte{1, 2, 3, 4, 5},
   165  				PkiId:    []byte{15},
   166  			},
   167  			Timestamp: &PeerTime{
   168  				IncNum: 2,
   169  				SeqNum: 2,
   170  			},
   171  			Identity: []byte("peerID1"),
   172  		},
   173  	})
   174  
   175  	assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageNoAction)
   176  }
   177  
   178  func TestStateInfoMessageNoActionTaken(t *testing.T) {
   179  	comparator := NewGossipMessageComparator(1)
   180  
   181  	// msg1 and msg2 have same channel mac, while different pkid, while
   182  	// msg and msg3 same pkid and different channel mac
   183  
   184  	sMsg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY,
   185  		stateInfoMessage(1, 1, []byte{17}, []byte{17, 13}))
   186  	sMsg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY,
   187  		stateInfoMessage(1, 1, []byte{13}, []byte{17, 13}))
   188  
   189  	// We only should compare comparable messages, e.g. message from same peer
   190  	// In any other cases no invalidation should be taken.
   191  	assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageNoAction)
   192  }
   193  
   194  func TestStateInfoMessagesInvalidation(t *testing.T) {
   195  	comparator := NewGossipMessageComparator(1)
   196  
   197  	sMsg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY,
   198  		stateInfoMessage(1, 1, []byte{17}, []byte{17}))
   199  	sMsg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY,
   200  		stateInfoMessage(1, 1, []byte{17}, []byte{17}))
   201  	sMsg3 := signedGossipMessage("testChannel", GossipMessage_EMPTY,
   202  		stateInfoMessage(1, 2, []byte{17}, []byte{17}))
   203  	sMsg4 := signedGossipMessage("testChannel", GossipMessage_EMPTY,
   204  		stateInfoMessage(2, 1, []byte{17}, []byte{17}))
   205  
   206  	assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageInvalidated)
   207  
   208  	assert.Equal(t, comparator(sMsg1, sMsg3), common.MessageInvalidated)
   209  	assert.Equal(t, comparator(sMsg3, sMsg1), common.MessageInvalidates)
   210  
   211  	assert.Equal(t, comparator(sMsg1, sMsg4), common.MessageInvalidated)
   212  	assert.Equal(t, comparator(sMsg4, sMsg1), common.MessageInvalidates)
   213  
   214  	assert.Equal(t, comparator(sMsg3, sMsg4), common.MessageInvalidated)
   215  	assert.Equal(t, comparator(sMsg4, sMsg3), common.MessageInvalidates)
   216  }
   217  
   218  func TestAliveMessageInvalidation(t *testing.T) {
   219  	comparator := NewGossipMessageComparator(1)
   220  
   221  	sMsg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   222  		AliveMsg: &AliveMessage{
   223  			Membership: &Member{
   224  				Endpoint: "localhost",
   225  				Metadata: []byte{1, 2, 3, 4, 5},
   226  				PkiId:    []byte{17},
   227  			},
   228  			Timestamp: &PeerTime{
   229  				IncNum: 1,
   230  				SeqNum: 1,
   231  			},
   232  			Identity: []byte("peerID1"),
   233  		},
   234  	})
   235  
   236  	sMsg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   237  		AliveMsg: &AliveMessage{
   238  			Membership: &Member{
   239  				Endpoint: "localhost",
   240  				Metadata: []byte{1, 2, 3, 4, 5},
   241  				PkiId:    []byte{17},
   242  			},
   243  			Timestamp: &PeerTime{
   244  				IncNum: 2,
   245  				SeqNum: 2,
   246  			},
   247  			Identity: []byte("peerID1"),
   248  		},
   249  	})
   250  
   251  	sMsg3 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   252  		AliveMsg: &AliveMessage{
   253  			Membership: &Member{
   254  				Endpoint: "localhost",
   255  				Metadata: []byte{1, 2, 3, 4, 5},
   256  				PkiId:    []byte{17},
   257  			},
   258  			Timestamp: &PeerTime{
   259  				IncNum: 1,
   260  				SeqNum: 2,
   261  			},
   262  			Identity: []byte("peerID1"),
   263  		},
   264  	})
   265  
   266  	assert.Equal(t, comparator(sMsg1, sMsg2), common.MessageInvalidated)
   267  	assert.Equal(t, comparator(sMsg2, sMsg1), common.MessageInvalidates)
   268  	assert.Equal(t, comparator(sMsg1, sMsg3), common.MessageInvalidated)
   269  	assert.Equal(t, comparator(sMsg3, sMsg1), common.MessageInvalidates)
   270  }
   271  
   272  func TestDataMessageInvalidation(t *testing.T) {
   273  	comparator := NewGossipMessageComparator(5)
   274  
   275  	data := []byte{1, 1, 1}
   276  	sMsg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY, dataMessage(1, data))
   277  	sMsg1Clone := signedGossipMessage("testChannel", GossipMessage_EMPTY, dataMessage(1, data))
   278  	sMsg3 := signedGossipMessage("testChannel", GossipMessage_EMPTY, dataMessage(2, data))
   279  	sMsg4 := signedGossipMessage("testChannel", GossipMessage_EMPTY, dataMessage(7, data))
   280  
   281  	assert.Equal(t, comparator(sMsg1, sMsg1Clone), common.MessageInvalidated)
   282  	assert.Equal(t, comparator(sMsg1, sMsg3), common.MessageNoAction)
   283  	assert.Equal(t, comparator(sMsg1, sMsg4), common.MessageInvalidated)
   284  	assert.Equal(t, comparator(sMsg4, sMsg1), common.MessageInvalidates)
   285  }
   286  
   287  func TestIdentityMessagesInvalidation(t *testing.T) {
   288  	comparator := NewGossipMessageComparator(5)
   289  
   290  	msg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_PeerIdentity{
   291  		PeerIdentity: &PeerIdentity{
   292  			PkiId:    []byte{17},
   293  			Cert:     []byte{1, 2, 3, 4},
   294  			Metadata: nil,
   295  		},
   296  	})
   297  
   298  	msg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_PeerIdentity{
   299  		PeerIdentity: &PeerIdentity{
   300  			PkiId:    []byte{17},
   301  			Cert:     []byte{1, 2, 3, 4},
   302  			Metadata: nil,
   303  		},
   304  	})
   305  
   306  	msg3 := signedGossipMessage("testChannel", GossipMessage_EMPTY, &GossipMessage_PeerIdentity{
   307  		PeerIdentity: &PeerIdentity{
   308  			PkiId:    []byte{11},
   309  			Cert:     []byte{11, 21, 31, 41},
   310  			Metadata: nil,
   311  		},
   312  	})
   313  
   314  	assert.Equal(t, comparator(msg1, msg2), common.MessageInvalidated)
   315  	assert.Equal(t, comparator(msg1, msg3), common.MessageNoAction)
   316  }
   317  
   318  func TestLeadershipMessagesNoAction(t *testing.T) {
   319  	comparator := NewGossipMessageComparator(5)
   320  
   321  	msg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY, leadershipMessage(1, 1, []byte{17}))
   322  	msg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY, leadershipMessage(1, 1, []byte{11}))
   323  
   324  	// If message with different pkid's no action should be taken
   325  	assert.Equal(t, comparator(msg1, msg2), common.MessageNoAction)
   326  }
   327  
   328  func TestLeadershipMessagesInvalidation(t *testing.T) {
   329  	comparator := NewGossipMessageComparator(5)
   330  
   331  	pkiID := []byte{17}
   332  	msg1 := signedGossipMessage("testChannel", GossipMessage_EMPTY, leadershipMessage(1, 1, pkiID))
   333  	msg2 := signedGossipMessage("testChannel", GossipMessage_EMPTY, leadershipMessage(1, 2, pkiID))
   334  	msg3 := signedGossipMessage("testChannel", GossipMessage_EMPTY, leadershipMessage(2, 1, pkiID))
   335  
   336  	// If message with different pkid's no action should be taken
   337  	assert.Equal(t, comparator(msg1, msg2), common.MessageInvalidated)
   338  	assert.Equal(t, comparator(msg2, msg1), common.MessageInvalidates)
   339  	assert.Equal(t, comparator(msg1, msg3), common.MessageInvalidated)
   340  	assert.Equal(t, comparator(msg3, msg1), common.MessageInvalidates)
   341  	assert.Equal(t, comparator(msg2, msg3), common.MessageInvalidated)
   342  	assert.Equal(t, comparator(msg3, msg2), common.MessageInvalidates)
   343  }
   344  
   345  func TestCheckGossipMessageTypes(t *testing.T) {
   346  	var msg *SignedGossipMessage
   347  	channelID := "testID1"
   348  
   349  	// Create State info pull request
   350  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_StateInfoPullReq{
   351  		StateInfoPullReq: &StateInfoPullRequest{
   352  			Channel_MAC: []byte{17},
   353  		},
   354  	})
   355  
   356  	assert.True(t, msg.IsStateInfoPullRequestMsg())
   357  
   358  	// Create alive message
   359  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   360  		AliveMsg: &AliveMessage{
   361  			Identity: []byte("peerID"),
   362  			Membership: &Member{
   363  				PkiId:    []byte("pkiID"),
   364  				Metadata: []byte{17},
   365  				Endpoint: "localhost",
   366  			},
   367  			Timestamp: &PeerTime{
   368  				SeqNum: 1,
   369  				IncNum: 1,
   370  			},
   371  		},
   372  	})
   373  
   374  	assert.True(t, msg.IsAliveMsg())
   375  
   376  	// Create gossip data message
   377  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, dataMessage(1, []byte{1, 2, 3, 4, 5}))
   378  	assert.True(t, msg.IsDataMsg())
   379  
   380  	// Create data request message
   381  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataReq{
   382  		DataReq: &DataRequest{
   383  			MsgType: PullMsgType_UNDEFINED,
   384  			Nonce:   0,
   385  			Digests: []string{"msg1", "msg2", "msg3"},
   386  		},
   387  	})
   388  	assert.True(t, msg.IsDataReq())
   389  	assert.True(t, msg.IsPullMsg())
   390  
   391  	// Create data request message
   392  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataDig{
   393  		DataDig: &DataDigest{
   394  			MsgType: PullMsgType_UNDEFINED,
   395  			Nonce:   0,
   396  			Digests: []string{"msg1", "msg2", "msg3"},
   397  		},
   398  	})
   399  	assert.True(t, msg.IsDigestMsg())
   400  	assert.True(t, msg.IsPullMsg())
   401  
   402  	// Create data update message
   403  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataUpdate{
   404  		DataUpdate: &DataUpdate{
   405  			MsgType: PullMsgType_UNDEFINED,
   406  			Nonce:   0,
   407  			Data:    []*Envelope{envelopes()[0]},
   408  		},
   409  	})
   410  	assert.True(t, msg.IsDataUpdate())
   411  	assert.True(t, msg.IsPullMsg())
   412  
   413  	// Create gossip hello message
   414  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_Hello{
   415  		Hello: &GossipHello{
   416  			MsgType: PullMsgType_UNDEFINED,
   417  			Nonce:   0,
   418  		},
   419  	})
   420  	assert.True(t, msg.IsHelloMsg())
   421  	assert.True(t, msg.IsPullMsg())
   422  
   423  	// Create state request message
   424  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_StateRequest{
   425  		StateRequest: &RemoteStateRequest{
   426  			StartSeqNum: 1,
   427  			EndSeqNum:   10,
   428  		},
   429  	})
   430  	assert.True(t, msg.IsRemoteStateMessage())
   431  
   432  	// Create state response message
   433  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_StateResponse{
   434  		StateResponse: &RemoteStateResponse{
   435  			Payloads: []*Payload{&Payload{
   436  				SeqNum: 1,
   437  				Data:   []byte{1, 2, 3, 4, 5},
   438  			}},
   439  		},
   440  	})
   441  	assert.True(t, msg.IsRemoteStateMessage())
   442  }
   443  
   444  func TestGossipPullMessageType(t *testing.T) {
   445  	var msg *SignedGossipMessage
   446  	channelID := "testID1"
   447  
   448  	// Create gossip hello message
   449  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_Hello{
   450  		Hello: &GossipHello{
   451  			MsgType: PullMsgType_BLOCK_MSG,
   452  			Nonce:   0,
   453  		},
   454  	})
   455  
   456  	assert.True(t, msg.IsHelloMsg())
   457  	assert.True(t, msg.IsPullMsg())
   458  	assert.Equal(t, msg.GetPullMsgType(), PullMsgType_BLOCK_MSG)
   459  
   460  	// Create data request message
   461  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataDig{
   462  		DataDig: &DataDigest{
   463  			MsgType: PullMsgType_IDENTITY_MSG,
   464  			Nonce:   0,
   465  			Digests: []string{"msg1", "msg2", "msg3"},
   466  		},
   467  	})
   468  	assert.True(t, msg.IsDigestMsg())
   469  	assert.True(t, msg.IsPullMsg())
   470  	assert.Equal(t, msg.GetPullMsgType(), PullMsgType_IDENTITY_MSG)
   471  
   472  	// Create data request message
   473  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataReq{
   474  		DataReq: &DataRequest{
   475  			MsgType: PullMsgType_BLOCK_MSG,
   476  			Nonce:   0,
   477  			Digests: []string{"msg1", "msg2", "msg3"},
   478  		},
   479  	})
   480  	assert.True(t, msg.IsDataReq())
   481  	assert.True(t, msg.IsPullMsg())
   482  	assert.Equal(t, msg.GetPullMsgType(), PullMsgType_BLOCK_MSG)
   483  
   484  	// Create data update message
   485  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataUpdate{
   486  		DataUpdate: &DataUpdate{
   487  			MsgType: PullMsgType_IDENTITY_MSG,
   488  			Nonce:   0,
   489  			Data:    []*Envelope{envelopes()[0]},
   490  		},
   491  	})
   492  	assert.True(t, msg.IsDataUpdate())
   493  	assert.True(t, msg.IsPullMsg())
   494  	assert.Equal(t, msg.GetPullMsgType(), PullMsgType_IDENTITY_MSG)
   495  
   496  	// Create gossip data message
   497  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, dataMessage(1, []byte{1, 2, 3, 4, 5}))
   498  	assert.True(t, msg.IsDataMsg())
   499  	assert.Equal(t, msg.GetPullMsgType(), PullMsgType_UNDEFINED)
   500  }
   501  
   502  func TestGossipMessageDataMessageTagType(t *testing.T) {
   503  	var msg *SignedGossipMessage
   504  	channelID := "testID1"
   505  
   506  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_AND_ORG, dataMessage(1, []byte{1}))
   507  	assert.True(t, msg.IsChannelRestricted())
   508  	assert.True(t, msg.IsOrgRestricted())
   509  	assert.NoError(t, msg.IsTagLegal())
   510  
   511  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, dataMessage(1, []byte{1}))
   512  	assert.Error(t, msg.IsTagLegal())
   513  
   514  	msg = signedGossipMessage(channelID, GossipMessage_UNDEFINED, dataMessage(1, []byte{1}))
   515  	assert.Error(t, msg.IsTagLegal())
   516  
   517  	msg = signedGossipMessage(channelID, GossipMessage_ORG_ONLY, dataMessage(1, []byte{1}))
   518  	assert.False(t, msg.IsChannelRestricted())
   519  	assert.True(t, msg.IsOrgRestricted())
   520  
   521  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, dataMessage(1, []byte{1}))
   522  	assert.True(t, msg.IsChannelRestricted())
   523  	assert.False(t, msg.IsOrgRestricted())
   524  
   525  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, dataMessage(1, []byte{1}))
   526  	assert.False(t, msg.IsChannelRestricted())
   527  	assert.False(t, msg.IsOrgRestricted())
   528  
   529  	msg = signedGossipMessage(channelID, GossipMessage_UNDEFINED, dataMessage(1, []byte{1}))
   530  	assert.False(t, msg.IsChannelRestricted())
   531  	assert.False(t, msg.IsOrgRestricted())
   532  }
   533  
   534  func TestGossipMessageAliveMessageTagType(t *testing.T) {
   535  	var msg *SignedGossipMessage
   536  	channelID := "testID1"
   537  
   538  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_AliveMsg{
   539  		AliveMsg: &AliveMessage{},
   540  	})
   541  	assert.NoError(t, msg.IsTagLegal())
   542  
   543  	msg = signedGossipMessage(channelID, GossipMessage_ORG_ONLY, &GossipMessage_AliveMsg{
   544  		AliveMsg: &AliveMessage{},
   545  	})
   546  	assert.Error(t, msg.IsTagLegal())
   547  }
   548  
   549  func TestGossipMessageMembershipMessageTagType(t *testing.T) {
   550  	var msg *SignedGossipMessage
   551  	channelID := "testID1"
   552  
   553  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_MemReq{
   554  		MemReq: &MembershipRequest{},
   555  	})
   556  	assert.NoError(t, msg.IsTagLegal())
   557  
   558  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_MemRes{
   559  		MemRes: &MembershipResponse{},
   560  	})
   561  	assert.NoError(t, msg.IsTagLegal())
   562  }
   563  
   564  func TestGossipMessageIdentityMessageTagType(t *testing.T) {
   565  	var msg *SignedGossipMessage
   566  	channelID := "testID1"
   567  
   568  	msg = signedGossipMessage(channelID, GossipMessage_ORG_ONLY, &GossipMessage_PeerIdentity{
   569  		PeerIdentity: &PeerIdentity{},
   570  	})
   571  	assert.NoError(t, msg.IsTagLegal())
   572  
   573  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_PeerIdentity{
   574  		PeerIdentity: &PeerIdentity{},
   575  	})
   576  	assert.Error(t, msg.IsTagLegal())
   577  }
   578  
   579  func TestGossipMessagePullMessageTagType(t *testing.T) {
   580  	var msg *SignedGossipMessage
   581  	channelID := "testID1"
   582  
   583  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_AND_ORG, &GossipMessage_DataReq{
   584  		DataReq: &DataRequest{
   585  			MsgType: PullMsgType_BLOCK_MSG,
   586  		},
   587  	})
   588  	assert.NoError(t, msg.IsTagLegal())
   589  
   590  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataReq{
   591  		DataReq: &DataRequest{
   592  			MsgType: PullMsgType_BLOCK_MSG,
   593  		},
   594  	})
   595  	assert.Error(t, msg.IsTagLegal())
   596  
   597  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataDig{
   598  		DataDig: &DataDigest{
   599  			MsgType: PullMsgType_IDENTITY_MSG,
   600  		},
   601  	})
   602  	assert.NoError(t, msg.IsTagLegal())
   603  
   604  	msg = signedGossipMessage(channelID, GossipMessage_ORG_ONLY, &GossipMessage_DataDig{
   605  		DataDig: &DataDigest{
   606  			MsgType: PullMsgType_IDENTITY_MSG,
   607  		},
   608  	})
   609  	assert.Error(t, msg.IsTagLegal())
   610  
   611  	msg = signedGossipMessage(channelID, GossipMessage_ORG_ONLY, &GossipMessage_DataDig{
   612  		DataDig: &DataDigest{
   613  			MsgType: PullMsgType_UNDEFINED,
   614  		},
   615  	})
   616  	assert.Error(t, msg.IsTagLegal())
   617  }
   618  
   619  func TestGossipMessageStateInfoMessageTagType(t *testing.T) {
   620  	var msg *SignedGossipMessage
   621  	channelID := "testID1"
   622  
   623  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_StateInfo{
   624  		StateInfo: &StateInfo{},
   625  	})
   626  	assert.NoError(t, msg.IsTagLegal())
   627  
   628  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_StateInfoPullReq{
   629  		StateInfoPullReq: &StateInfoPullRequest{},
   630  	})
   631  	assert.NoError(t, msg.IsTagLegal())
   632  
   633  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_StateResponse{
   634  		StateResponse: &RemoteStateResponse{},
   635  	})
   636  	assert.NoError(t, msg.IsTagLegal())
   637  
   638  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_StateRequest{
   639  		StateRequest: &RemoteStateRequest{},
   640  	})
   641  	assert.NoError(t, msg.IsTagLegal())
   642  
   643  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_StateSnapshot{
   644  		StateSnapshot: &StateInfoSnapshot{},
   645  	})
   646  	assert.NoError(t, msg.IsTagLegal())
   647  
   648  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_StateInfo{
   649  		StateInfo: &StateInfo{},
   650  	})
   651  	assert.Error(t, msg.IsTagLegal())
   652  }
   653  
   654  func TestGossipMessageLeadershipMessageTagType(t *testing.T) {
   655  	var msg *SignedGossipMessage
   656  	channelID := "testID1"
   657  
   658  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_AND_ORG, &GossipMessage_LeadershipMsg{
   659  		LeadershipMsg: &LeadershipMessage{},
   660  	})
   661  	assert.NoError(t, msg.IsTagLegal())
   662  
   663  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_LeadershipMsg{
   664  		LeadershipMsg: &LeadershipMessage{},
   665  	})
   666  	assert.Error(t, msg.IsTagLegal())
   667  
   668  	msg = signedGossipMessage(channelID, GossipMessage_CHAN_OR_ORG, &GossipMessage_Empty{})
   669  	assert.Error(t, msg.IsTagLegal())
   670  }
   671  
   672  func TestConnectionInfo_IsAuthenticated(t *testing.T) {
   673  	connInfo := &ConnectionInfo{
   674  		ID: common.PKIidType("peerID"),
   675  	}
   676  
   677  	assert.False(t, connInfo.IsAuthenticated())
   678  
   679  	connInfo = &ConnectionInfo{
   680  		ID:   common.PKIidType("peerID"),
   681  		Auth: &AuthInfo{},
   682  	}
   683  
   684  	assert.True(t, connInfo.IsAuthenticated())
   685  }
   686  
   687  func TestGossipMessageSign(t *testing.T) {
   688  	idSigner := func(msg []byte) ([]byte, error) {
   689  		return msg, nil
   690  	}
   691  
   692  	errSigner := func(msg []byte) ([]byte, error) {
   693  		return nil, errors.New("Error")
   694  	}
   695  
   696  	msg := signedGossipMessage("testChannelID", GossipMessage_EMPTY, &GossipMessage_DataMsg{
   697  		DataMsg: &DataMessage{},
   698  	})
   699  
   700  	signedMsg, _ := msg.Sign(idSigner)
   701  
   702  	// Since checking the identity signer, signature will be same as the payload
   703  	assert.Equal(t, signedMsg.Payload, signedMsg.Signature)
   704  
   705  	env, err := msg.Sign(errSigner)
   706  	assert.Error(t, err)
   707  	assert.Nil(t, env)
   708  }
   709  
   710  func TestEnvelope_NoopSign(t *testing.T) {
   711  	channelID := "testChannelID"
   712  	msg := signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataMsg{
   713  		DataMsg: &DataMessage{},
   714  	})
   715  
   716  	signedMsg, err := msg.NoopSign()
   717  
   718  	// Since checking the identity signer, signature will be same as the payload
   719  	assert.Nil(t, signedMsg.Signature)
   720  	assert.NoError(t, err)
   721  }
   722  
   723  func TestSignedGossipMessage_Verify(t *testing.T) {
   724  	channelID := "testChannelID"
   725  	peerID := []byte("peer")
   726  	msg := signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataMsg{
   727  		DataMsg: &DataMessage{},
   728  	})
   729  
   730  	assert.True(t, msg.IsSigned())
   731  
   732  	verifier := func(peerIdentity []byte, signature, message []byte) error {
   733  		return nil
   734  	}
   735  
   736  	res := msg.Verify(peerID, verifier)
   737  	assert.Nil(t, res)
   738  
   739  	msg = signedGossipMessage(channelID, GossipMessage_EMPTY, &GossipMessage_DataMsg{
   740  		DataMsg: &DataMessage{},
   741  	})
   742  
   743  	env := msg.Envelope
   744  	msg.Envelope = nil
   745  	res = msg.Verify(peerID, verifier)
   746  	assert.Error(t, res)
   747  
   748  	msg.Envelope = env
   749  	payload := msg.Envelope.Payload
   750  	msg.Envelope.Payload = nil
   751  	res = msg.Verify(peerID, verifier)
   752  	assert.Error(t, res)
   753  
   754  	msg.Envelope.Payload = payload
   755  	sig := msg.Signature
   756  	msg.Signature = nil
   757  	res = msg.Verify(peerID, verifier)
   758  	assert.Error(t, res)
   759  	msg.Signature = sig
   760  
   761  	errVerifier := func(peerIdentity []byte, signature, message []byte) error {
   762  		return errors.New("Test")
   763  	}
   764  
   765  	res = msg.Verify(peerID, errVerifier)
   766  	assert.Error(t, res)
   767  }
   768  
   769  func TestEnvelope(t *testing.T) {
   770  	dataMsg := &GossipMessage{
   771  		Content: dataMessage(1, []byte("data")),
   772  	}
   773  	bytes, err := proto.Marshal(dataMsg)
   774  	assert.NoError(t, err)
   775  
   776  	env := envelopes()[0]
   777  	env.Payload = bytes
   778  
   779  	msg, err := env.ToGossipMessage()
   780  	assert.NoError(t, err)
   781  	assert.NotNil(t, msg)
   782  
   783  	assert.True(t, msg.IsDataMsg())
   784  }
   785  
   786  func TestEnvelope_SignSecret(t *testing.T) {
   787  	dataMsg := &GossipMessage{
   788  		Content: dataMessage(1, []byte("data")),
   789  	}
   790  	bytes, err := proto.Marshal(dataMsg)
   791  	assert.NoError(t, err)
   792  
   793  	env := envelopes()[0]
   794  	env.Payload = bytes
   795  	env.SecretEnvelope = nil
   796  
   797  	env.SignSecret(func(message []byte) ([]byte, error) {
   798  		return message, nil
   799  	}, &Secret{
   800  		Content: &Secret_InternalEndpoint{
   801  			InternalEndpoint: "localhost:5050",
   802  		},
   803  	})
   804  
   805  	assert.NotNil(t, env.SecretEnvelope)
   806  	assert.Equal(t, env.SecretEnvelope.InternalEndpoint(), "localhost:5050")
   807  }
   808  
   809  func envelopes() []*Envelope {
   810  	return []*Envelope{
   811  		{Payload: []byte{2, 2, 2},
   812  			Signature: []byte{2, 2, 2},
   813  			SecretEnvelope: &SecretEnvelope{
   814  				Payload:   []byte{2, 2, 2},
   815  				Signature: []byte{2, 2, 2},
   816  			},
   817  		},
   818  	}
   819  }
   820  
   821  func leadershipMessage(incNum uint64, seqNum uint64, pkid []byte) *GossipMessage_LeadershipMsg {
   822  	return &GossipMessage_LeadershipMsg{
   823  		LeadershipMsg: &LeadershipMessage{
   824  			PkiId:         pkid,
   825  			IsDeclaration: false,
   826  			Timestamp: &PeerTime{
   827  				IncNum: incNum,
   828  				SeqNum: seqNum,
   829  			},
   830  		},
   831  	}
   832  }
   833  
   834  func stateInfoMessage(incNum uint64, seqNum uint64, pkid []byte, mac []byte) *GossipMessage_StateInfo {
   835  	return &GossipMessage_StateInfo{
   836  		StateInfo: &StateInfo{
   837  			Metadata: []byte{},
   838  			Timestamp: &PeerTime{
   839  				IncNum: incNum,
   840  				SeqNum: seqNum,
   841  			},
   842  			PkiId:       pkid,
   843  			Channel_MAC: mac,
   844  		},
   845  	}
   846  }
   847  
   848  func dataMessage(seqNum uint64, data []byte) *GossipMessage_DataMsg {
   849  	return &GossipMessage_DataMsg{
   850  		DataMsg: &DataMessage{
   851  			Payload: &Payload{
   852  				SeqNum: seqNum,
   853  				Data:   data,
   854  			},
   855  		},
   856  	}
   857  }
   858  
   859  func signedGossipMessage(channelID string, tag GossipMessage_Tag, content isGossipMessage_Content) *SignedGossipMessage {
   860  	return &SignedGossipMessage{
   861  		GossipMessage: &GossipMessage{
   862  			Channel: []byte(channelID),
   863  			Tag:     tag,
   864  			Nonce:   0,
   865  			Content: content,
   866  		},
   867  		Envelope: envelopes()[0],
   868  	}
   869  }