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