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 }