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 }