github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/stream/streamer_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:44</date> 10 //</624450115813249024> 11 12 13 package stream 14 15 import ( 16 "bytes" 17 "context" 18 "errors" 19 "fmt" 20 "strconv" 21 "testing" 22 "time" 23 24 "github.com/ethereum/go-ethereum/common" 25 "github.com/ethereum/go-ethereum/log" 26 "github.com/ethereum/go-ethereum/p2p/enode" 27 p2ptest "github.com/ethereum/go-ethereum/p2p/testing" 28 "github.com/ethereum/go-ethereum/swarm/network" 29 "golang.org/x/crypto/sha3" 30 ) 31 32 func TestStreamerSubscribe(t *testing.T) { 33 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 34 defer teardown() 35 if err != nil { 36 t.Fatal(err) 37 } 38 39 stream := NewStream("foo", "", true) 40 err = streamer.Subscribe(tester.Nodes[0].ID(), stream, NewRange(0, 0), Top) 41 if err == nil || err.Error() != "stream foo not registered" { 42 t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) 43 } 44 } 45 46 func TestStreamerRequestSubscription(t *testing.T) { 47 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 48 defer teardown() 49 if err != nil { 50 t.Fatal(err) 51 } 52 53 stream := NewStream("foo", "", false) 54 err = streamer.RequestSubscription(tester.Nodes[0].ID(), stream, &Range{}, Top) 55 if err == nil || err.Error() != "stream foo not registered" { 56 t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) 57 } 58 } 59 60 var ( 61 hash0 = sha3.Sum256([]byte{0}) 62 hash1 = sha3.Sum256([]byte{1}) 63 hash2 = sha3.Sum256([]byte{2}) 64 hashesTmp = append(hash0[:], hash1[:]...) 65 hashes = append(hashesTmp, hash2[:]...) 66 corruptHashes = append(hashes[:40]) 67 ) 68 69 type testClient struct { 70 t string 71 wait0 chan bool 72 wait2 chan bool 73 batchDone chan bool 74 receivedHashes map[string][]byte 75 } 76 77 func newTestClient(t string) *testClient { 78 return &testClient{ 79 t: t, 80 wait0: make(chan bool), 81 wait2: make(chan bool), 82 batchDone: make(chan bool), 83 receivedHashes: make(map[string][]byte), 84 } 85 } 86 87 func (self *testClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error { 88 self.receivedHashes[string(hash)] = hash 89 if bytes.Equal(hash, hash0[:]) { 90 return func(context.Context) error { 91 <-self.wait0 92 return nil 93 } 94 } else if bytes.Equal(hash, hash2[:]) { 95 return func(context.Context) error { 96 <-self.wait2 97 return nil 98 } 99 } 100 return nil 101 } 102 103 func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) { 104 close(self.batchDone) 105 return nil 106 } 107 108 func (self *testClient) Close() {} 109 110 type testServer struct { 111 t string 112 sessionIndex uint64 113 } 114 115 func newTestServer(t string, sessionIndex uint64) *testServer { 116 return &testServer{ 117 t: t, 118 sessionIndex: sessionIndex, 119 } 120 } 121 122 func (s *testServer) SessionIndex() (uint64, error) { 123 return s.sessionIndex, nil 124 } 125 126 func (self *testServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { 127 return make([]byte, HashSize), from + 1, to + 1, nil, nil 128 } 129 130 func (self *testServer) GetData(context.Context, []byte) ([]byte, error) { 131 return nil, nil 132 } 133 134 func (self *testServer) Close() { 135 } 136 137 func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { 138 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 139 defer teardown() 140 if err != nil { 141 t.Fatal(err) 142 } 143 144 streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { 145 return newTestClient(t), nil 146 }) 147 148 node := tester.Nodes[0] 149 150 stream := NewStream("foo", "", true) 151 err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) 152 if err != nil { 153 t.Fatalf("Expected no error, got %v", err) 154 } 155 156 err = tester.TestExchanges( 157 p2ptest.Exchange{ 158 Label: "Subscribe message", 159 Expects: []p2ptest.Expect{ 160 { 161 Code: 4, 162 Msg: &SubscribeMsg{ 163 Stream: stream, 164 History: NewRange(5, 8), 165 Priority: Top, 166 }, 167 Peer: node.ID(), 168 }, 169 }, 170 }, 171 //触发器offeredhashemsg以实际创建客户端 172 p2ptest.Exchange{ 173 Label: "OfferedHashes message", 174 Triggers: []p2ptest.Trigger{ 175 { 176 Code: 1, 177 Msg: &OfferedHashesMsg{ 178 HandoverProof: &HandoverProof{ 179 Handover: &Handover{}, 180 }, 181 Hashes: hashes, 182 From: 5, 183 To: 8, 184 Stream: stream, 185 }, 186 Peer: node.ID(), 187 }, 188 }, 189 Expects: []p2ptest.Expect{ 190 { 191 Code: 2, 192 Msg: &WantedHashesMsg{ 193 Stream: stream, 194 Want: []byte{5}, 195 From: 9, 196 To: 0, 197 }, 198 Peer: node.ID(), 199 }, 200 }, 201 }, 202 ) 203 if err != nil { 204 t.Fatal(err) 205 } 206 207 err = streamer.Unsubscribe(node.ID(), stream) 208 if err != nil { 209 t.Fatalf("Expected no error, got %v", err) 210 } 211 212 err = tester.TestExchanges(p2ptest.Exchange{ 213 Label: "Unsubscribe message", 214 Expects: []p2ptest.Expect{ 215 { 216 Code: 0, 217 Msg: &UnsubscribeMsg{ 218 Stream: stream, 219 }, 220 Peer: node.ID(), 221 }, 222 }, 223 }) 224 225 if err != nil { 226 t.Fatal(err) 227 } 228 } 229 230 func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { 231 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 232 defer teardown() 233 if err != nil { 234 t.Fatal(err) 235 } 236 237 stream := NewStream("foo", "", false) 238 239 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 240 return newTestServer(t, 10), nil 241 }) 242 243 node := tester.Nodes[0] 244 245 err = tester.TestExchanges(p2ptest.Exchange{ 246 Label: "Subscribe message", 247 Triggers: []p2ptest.Trigger{ 248 { 249 Code: 4, 250 Msg: &SubscribeMsg{ 251 Stream: stream, 252 History: NewRange(5, 8), 253 Priority: Top, 254 }, 255 Peer: node.ID(), 256 }, 257 }, 258 Expects: []p2ptest.Expect{ 259 { 260 Code: 1, 261 Msg: &OfferedHashesMsg{ 262 Stream: stream, 263 HandoverProof: &HandoverProof{ 264 Handover: &Handover{}, 265 }, 266 Hashes: make([]byte, HashSize), 267 From: 6, 268 To: 9, 269 }, 270 Peer: node.ID(), 271 }, 272 }, 273 }) 274 275 if err != nil { 276 t.Fatal(err) 277 } 278 279 err = tester.TestExchanges(p2ptest.Exchange{ 280 Label: "unsubscribe message", 281 Triggers: []p2ptest.Trigger{ 282 { 283 Code: 0, 284 Msg: &UnsubscribeMsg{ 285 Stream: stream, 286 }, 287 Peer: node.ID(), 288 }, 289 }, 290 }) 291 292 if err != nil { 293 t.Fatal(err) 294 } 295 } 296 297 func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) { 298 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 299 defer teardown() 300 if err != nil { 301 t.Fatal(err) 302 } 303 304 stream := NewStream("foo", "", true) 305 306 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 307 return newTestServer(t, 0), nil 308 }) 309 310 node := tester.Nodes[0] 311 312 err = tester.TestExchanges(p2ptest.Exchange{ 313 Label: "Subscribe message", 314 Triggers: []p2ptest.Trigger{ 315 { 316 Code: 4, 317 Msg: &SubscribeMsg{ 318 Stream: stream, 319 Priority: Top, 320 }, 321 Peer: node.ID(), 322 }, 323 }, 324 Expects: []p2ptest.Expect{ 325 { 326 Code: 1, 327 Msg: &OfferedHashesMsg{ 328 Stream: stream, 329 HandoverProof: &HandoverProof{ 330 Handover: &Handover{}, 331 }, 332 Hashes: make([]byte, HashSize), 333 From: 1, 334 To: 0, 335 }, 336 Peer: node.ID(), 337 }, 338 }, 339 }) 340 341 if err != nil { 342 t.Fatal(err) 343 } 344 345 err = tester.TestExchanges(p2ptest.Exchange{ 346 Label: "unsubscribe message", 347 Triggers: []p2ptest.Trigger{ 348 { 349 Code: 0, 350 Msg: &UnsubscribeMsg{ 351 Stream: stream, 352 }, 353 Peer: node.ID(), 354 }, 355 }, 356 }) 357 358 if err != nil { 359 t.Fatal(err) 360 } 361 } 362 363 func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) { 364 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 365 defer teardown() 366 if err != nil { 367 t.Fatal(err) 368 } 369 370 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 371 return newTestServer(t, 0), nil 372 }) 373 374 stream := NewStream("bar", "", true) 375 376 node := tester.Nodes[0] 377 378 err = tester.TestExchanges(p2ptest.Exchange{ 379 Label: "Subscribe message", 380 Triggers: []p2ptest.Trigger{ 381 { 382 Code: 4, 383 Msg: &SubscribeMsg{ 384 Stream: stream, 385 History: NewRange(5, 8), 386 Priority: Top, 387 }, 388 Peer: node.ID(), 389 }, 390 }, 391 Expects: []p2ptest.Expect{ 392 { 393 Code: 7, 394 Msg: &SubscribeErrorMsg{ 395 Error: "stream bar not registered", 396 }, 397 Peer: node.ID(), 398 }, 399 }, 400 }) 401 402 if err != nil { 403 t.Fatal(err) 404 } 405 } 406 407 func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) { 408 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 409 defer teardown() 410 if err != nil { 411 t.Fatal(err) 412 } 413 414 stream := NewStream("foo", "", true) 415 416 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 417 return newTestServer(t, 10), nil 418 }) 419 420 node := tester.Nodes[0] 421 422 err = tester.TestExchanges(p2ptest.Exchange{ 423 Label: "Subscribe message", 424 Triggers: []p2ptest.Trigger{ 425 { 426 Code: 4, 427 Msg: &SubscribeMsg{ 428 Stream: stream, 429 History: NewRange(5, 8), 430 Priority: Top, 431 }, 432 Peer: node.ID(), 433 }, 434 }, 435 Expects: []p2ptest.Expect{ 436 { 437 Code: 1, 438 Msg: &OfferedHashesMsg{ 439 Stream: NewStream("foo", "", false), 440 HandoverProof: &HandoverProof{ 441 Handover: &Handover{}, 442 }, 443 Hashes: make([]byte, HashSize), 444 From: 6, 445 To: 9, 446 }, 447 Peer: node.ID(), 448 }, 449 { 450 Code: 1, 451 Msg: &OfferedHashesMsg{ 452 Stream: stream, 453 HandoverProof: &HandoverProof{ 454 Handover: &Handover{}, 455 }, 456 From: 11, 457 To: 0, 458 Hashes: make([]byte, HashSize), 459 }, 460 Peer: node.ID(), 461 }, 462 }, 463 }) 464 465 if err != nil { 466 t.Fatal(err) 467 } 468 } 469 470 func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) { 471 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 472 defer teardown() 473 if err != nil { 474 t.Fatal(err) 475 } 476 477 stream := NewStream("foo", "", true) 478 479 var tc *testClient 480 481 streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { 482 tc = newTestClient(t) 483 return tc, nil 484 }) 485 486 node := tester.Nodes[0] 487 488 err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) 489 if err != nil { 490 t.Fatalf("Expected no error, got %v", err) 491 } 492 493 err = tester.TestExchanges(p2ptest.Exchange{ 494 Label: "Subscribe message", 495 Expects: []p2ptest.Expect{ 496 { 497 Code: 4, 498 Msg: &SubscribeMsg{ 499 Stream: stream, 500 History: NewRange(5, 8), 501 Priority: Top, 502 }, 503 Peer: node.ID(), 504 }, 505 }, 506 }, 507 p2ptest.Exchange{ 508 Label: "Corrupt offered hash message", 509 Triggers: []p2ptest.Trigger{ 510 { 511 Code: 1, 512 Msg: &OfferedHashesMsg{ 513 HandoverProof: &HandoverProof{ 514 Handover: &Handover{}, 515 }, 516 Hashes: corruptHashes, 517 From: 5, 518 To: 8, 519 Stream: stream, 520 }, 521 Peer: node.ID(), 522 }, 523 }, 524 }) 525 if err != nil { 526 t.Fatal(err) 527 } 528 529 expectedError := errors.New("Message handler error: (msg code 1): error invalid hashes length (len: 40)") 530 if err := tester.TestDisconnected(&p2ptest.Disconnect{Peer: node.ID(), Error: expectedError}); err != nil { 531 t.Fatal(err) 532 } 533 } 534 535 func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) { 536 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 537 defer teardown() 538 if err != nil { 539 t.Fatal(err) 540 } 541 542 stream := NewStream("foo", "", true) 543 544 var tc *testClient 545 546 streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { 547 tc = newTestClient(t) 548 return tc, nil 549 }) 550 551 node := tester.Nodes[0] 552 553 err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) 554 if err != nil { 555 t.Fatalf("Expected no error, got %v", err) 556 } 557 558 err = tester.TestExchanges(p2ptest.Exchange{ 559 Label: "Subscribe message", 560 Expects: []p2ptest.Expect{ 561 { 562 Code: 4, 563 Msg: &SubscribeMsg{ 564 Stream: stream, 565 History: NewRange(5, 8), 566 Priority: Top, 567 }, 568 Peer: node.ID(), 569 }, 570 }, 571 }, 572 p2ptest.Exchange{ 573 Label: "WantedHashes message", 574 Triggers: []p2ptest.Trigger{ 575 { 576 Code: 1, 577 Msg: &OfferedHashesMsg{ 578 HandoverProof: &HandoverProof{ 579 Handover: &Handover{}, 580 }, 581 Hashes: hashes, 582 From: 5, 583 To: 8, 584 Stream: stream, 585 }, 586 Peer: node.ID(), 587 }, 588 }, 589 Expects: []p2ptest.Expect{ 590 { 591 Code: 2, 592 Msg: &WantedHashesMsg{ 593 Stream: stream, 594 Want: []byte{5}, 595 From: 9, 596 To: 0, 597 }, 598 Peer: node.ID(), 599 }, 600 }, 601 }) 602 if err != nil { 603 t.Fatal(err) 604 } 605 606 if len(tc.receivedHashes) != 3 { 607 t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes)) 608 } 609 610 close(tc.wait0) 611 612 timeout := time.NewTimer(100 * time.Millisecond) 613 defer timeout.Stop() 614 615 select { 616 case <-tc.batchDone: 617 t.Fatal("batch done early") 618 case <-timeout.C: 619 } 620 621 close(tc.wait2) 622 623 timeout2 := time.NewTimer(10000 * time.Millisecond) 624 defer timeout2.Stop() 625 626 select { 627 case <-tc.batchDone: 628 case <-timeout2.C: 629 t.Fatal("timeout waiting batchdone call") 630 } 631 632 } 633 634 func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) { 635 tester, streamer, _, teardown, err := newStreamerTester(t, nil) 636 defer teardown() 637 if err != nil { 638 t.Fatal(err) 639 } 640 641 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 642 return newTestServer(t, 10), nil 643 }) 644 645 node := tester.Nodes[0] 646 647 stream := NewStream("foo", "", true) 648 err = streamer.RequestSubscription(node.ID(), stream, NewRange(5, 8), Top) 649 if err != nil { 650 t.Fatalf("Expected no error, got %v", err) 651 } 652 653 err = tester.TestExchanges( 654 p2ptest.Exchange{ 655 Label: "RequestSubscription message", 656 Expects: []p2ptest.Expect{ 657 { 658 Code: 8, 659 Msg: &RequestSubscriptionMsg{ 660 Stream: stream, 661 History: NewRange(5, 8), 662 Priority: Top, 663 }, 664 Peer: node.ID(), 665 }, 666 }, 667 }, 668 p2ptest.Exchange{ 669 Label: "Subscribe message", 670 Triggers: []p2ptest.Trigger{ 671 { 672 Code: 4, 673 Msg: &SubscribeMsg{ 674 Stream: stream, 675 History: NewRange(5, 8), 676 Priority: Top, 677 }, 678 Peer: node.ID(), 679 }, 680 }, 681 Expects: []p2ptest.Expect{ 682 { 683 Code: 1, 684 Msg: &OfferedHashesMsg{ 685 Stream: NewStream("foo", "", false), 686 HandoverProof: &HandoverProof{ 687 Handover: &Handover{}, 688 }, 689 Hashes: make([]byte, HashSize), 690 From: 6, 691 To: 9, 692 }, 693 Peer: node.ID(), 694 }, 695 { 696 Code: 1, 697 Msg: &OfferedHashesMsg{ 698 Stream: stream, 699 HandoverProof: &HandoverProof{ 700 Handover: &Handover{}, 701 }, 702 From: 11, 703 To: 0, 704 Hashes: make([]byte, HashSize), 705 }, 706 Peer: node.ID(), 707 }, 708 }, 709 }, 710 ) 711 if err != nil { 712 t.Fatal(err) 713 } 714 715 err = streamer.Quit(node.ID(), stream) 716 if err != nil { 717 t.Fatalf("Expected no error, got %v", err) 718 } 719 720 err = tester.TestExchanges(p2ptest.Exchange{ 721 Label: "Quit message", 722 Expects: []p2ptest.Expect{ 723 { 724 Code: 9, 725 Msg: &QuitMsg{ 726 Stream: stream, 727 }, 728 Peer: node.ID(), 729 }, 730 }, 731 }) 732 733 if err != nil { 734 t.Fatal(err) 735 } 736 737 historyStream := getHistoryStream(stream) 738 739 err = streamer.Quit(node.ID(), historyStream) 740 if err != nil { 741 t.Fatalf("Expected no error, got %v", err) 742 } 743 744 err = tester.TestExchanges(p2ptest.Exchange{ 745 Label: "Quit message", 746 Expects: []p2ptest.Expect{ 747 { 748 Code: 9, 749 Msg: &QuitMsg{ 750 Stream: historyStream, 751 }, 752 Peer: node.ID(), 753 }, 754 }, 755 }) 756 757 if err != nil { 758 t.Fatal(err) 759 } 760 } 761 762 //testmaxpeerserverswithunsubscribe创建一个注册表,其中 763 //流服务器的数量,并使用订阅和 764 //取消订阅,检查取消订阅是否将删除流, 765 //离开新河流的地方。 766 func TestMaxPeerServersWithUnsubscribe(t *testing.T) { 767 var maxPeerServers = 6 768 tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ 769 Retrieval: RetrievalDisabled, 770 Syncing: SyncingDisabled, 771 MaxPeerServers: maxPeerServers, 772 }) 773 defer teardown() 774 if err != nil { 775 t.Fatal(err) 776 } 777 778 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 779 return newTestServer(t, 0), nil 780 }) 781 782 node := tester.Nodes[0] 783 784 for i := 0; i < maxPeerServers+10; i++ { 785 stream := NewStream("foo", strconv.Itoa(i), true) 786 787 err = tester.TestExchanges(p2ptest.Exchange{ 788 Label: "Subscribe message", 789 Triggers: []p2ptest.Trigger{ 790 { 791 Code: 4, 792 Msg: &SubscribeMsg{ 793 Stream: stream, 794 Priority: Top, 795 }, 796 Peer: node.ID(), 797 }, 798 }, 799 Expects: []p2ptest.Expect{ 800 { 801 Code: 1, 802 Msg: &OfferedHashesMsg{ 803 Stream: stream, 804 HandoverProof: &HandoverProof{ 805 Handover: &Handover{}, 806 }, 807 Hashes: make([]byte, HashSize), 808 From: 1, 809 To: 0, 810 }, 811 Peer: node.ID(), 812 }, 813 }, 814 }) 815 816 if err != nil { 817 t.Fatal(err) 818 } 819 820 err = tester.TestExchanges(p2ptest.Exchange{ 821 Label: "unsubscribe message", 822 Triggers: []p2ptest.Trigger{ 823 { 824 Code: 0, 825 Msg: &UnsubscribeMsg{ 826 Stream: stream, 827 }, 828 Peer: node.ID(), 829 }, 830 }, 831 }) 832 833 if err != nil { 834 t.Fatal(err) 835 } 836 } 837 } 838 839 //testmaxpeerserverswithountsubscribe创建一个注册表,其中 840 //流服务器的数量,并执行订阅以检测订阅 841 //错误消息交换。 842 func TestMaxPeerServersWithoutUnsubscribe(t *testing.T) { 843 var maxPeerServers = 6 844 tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ 845 MaxPeerServers: maxPeerServers, 846 }) 847 defer teardown() 848 if err != nil { 849 t.Fatal(err) 850 } 851 852 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 853 return newTestServer(t, 0), nil 854 }) 855 856 node := tester.Nodes[0] 857 858 for i := 0; i < maxPeerServers+10; i++ { 859 stream := NewStream("foo", strconv.Itoa(i), true) 860 861 if i >= maxPeerServers { 862 err = tester.TestExchanges(p2ptest.Exchange{ 863 Label: "Subscribe message", 864 Triggers: []p2ptest.Trigger{ 865 { 866 Code: 4, 867 Msg: &SubscribeMsg{ 868 Stream: stream, 869 Priority: Top, 870 }, 871 Peer: node.ID(), 872 }, 873 }, 874 Expects: []p2ptest.Expect{ 875 { 876 Code: 7, 877 Msg: &SubscribeErrorMsg{ 878 Error: ErrMaxPeerServers.Error(), 879 }, 880 Peer: node.ID(), 881 }, 882 }, 883 }) 884 885 if err != nil { 886 t.Fatal(err) 887 } 888 continue 889 } 890 891 err = tester.TestExchanges(p2ptest.Exchange{ 892 Label: "Subscribe message", 893 Triggers: []p2ptest.Trigger{ 894 { 895 Code: 4, 896 Msg: &SubscribeMsg{ 897 Stream: stream, 898 Priority: Top, 899 }, 900 Peer: node.ID(), 901 }, 902 }, 903 Expects: []p2ptest.Expect{ 904 { 905 Code: 1, 906 Msg: &OfferedHashesMsg{ 907 Stream: stream, 908 HandoverProof: &HandoverProof{ 909 Handover: &Handover{}, 910 }, 911 Hashes: make([]byte, HashSize), 912 From: 1, 913 To: 0, 914 }, 915 Peer: node.ID(), 916 }, 917 }, 918 }) 919 920 if err != nil { 921 t.Fatal(err) 922 } 923 } 924 } 925 926 //TestHasPriceImplementation将检查注册表是否具有 927 //`price`接口实现 928 func TestHasPriceImplementation(t *testing.T) { 929 _, r, _, teardown, err := newStreamerTester(t, &RegistryOptions{ 930 Retrieval: RetrievalDisabled, 931 Syncing: SyncingDisabled, 932 }) 933 defer teardown() 934 if err != nil { 935 t.Fatal(err) 936 } 937 938 if r.prices == nil { 939 t.Fatal("No prices implementation available for the stream protocol") 940 } 941 942 pricesInstance, ok := r.prices.(*StreamerPrices) 943 if !ok { 944 t.Fatal("`Registry` does not have the expected Prices instance") 945 } 946 price := pricesInstance.Price(&ChunkDeliveryMsgRetrieval{}) 947 if price == nil || price.Value == 0 || price.Value != pricesInstance.getChunkDeliveryMsgRetrievalPrice() { 948 t.Fatal("No prices set for chunk delivery msg") 949 } 950 951 price = pricesInstance.Price(&RetrieveRequestMsg{}) 952 if price == nil || price.Value == 0 || price.Value != pricesInstance.getRetrieveRequestMsgPrice() { 953 t.Fatal("No prices set for chunk delivery msg") 954 } 955 } 956 957 /* 958 TestRequestPeerSubscriptions是流的请求同步订阅的单元测试。 959 960 测试如下: 961 *将每个连接的对等机分配给一个箱映射 962 *提前建立一个已知的花环 963 *运行eachconn函数,该函数返回假定的订阅容器 964 *在地图中存储每个对等机的所有假定箱 965 *检查所有对等方是否具有预期订阅 966 967 此KAD表及其对等项从network.testKademliacase1复制, 968 它表示一个边缘情况,但用于测试 969 同步订阅很好。 970 971 此测试中使用的地址作为仿真网络的一部分被发现 972 在流的高级测试中。它们是随机产生的。 973 974 生成的卡德米利亚如下: 975 ========================================================= 976 12月21日星期五20:02:39 UTC 2018 K∧∧Mli∧Hive:皇后地址:7EFEF1 977 人口:12(12),MinProxBin大小:2,MinBin大小:2,MaxBin大小:4 978 000 2 8196 835F 2 8196(0)835F(0) 979 001 2 2690 28f0 2 2690(0)28f0(0) 980 002 2 4D72 4A45 2 4D72(0)4A45(0) 981 003 1 646E 1 646E(0) 982 004 3 769C 76D1 7656 3 769C(0)76D1(0)7656(0) 983 ===========深度:5============================= 984 005 1 7A48 1 7A48(0) 985 006 1 7CBD 1 7CBD(0) 986 007 0_0 987 008 0_0 988 009 0_0 989 010 0_0 990 011 0_0 991 012 0_0 992 013 0_0 993 014 0_0 994 015 0_0 995 ========================================================= 996 **/ 997 998 func TestRequestPeerSubscriptions(t *testing.T) { 999 //透视地址;这是实际的Kademlia节点 1000 pivotAddr := "7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e" 1001 1002 //从给定的卡德米利亚到地址的bin编号的地图 1003 binMap := make(map[int][]string) 1004 binMap[0] = []string{ 1005 "835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc", 1006 "81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009", 1007 } 1008 binMap[1] = []string{ 1009 "28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19", 1010 "2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e", 1011 } 1012 binMap[2] = []string{ 1013 "4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51", 1014 "4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112", 1015 } 1016 binMap[3] = []string{ 1017 "646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d", 1018 } 1019 binMap[4] = []string{ 1020 "7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3", 1021 "76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0", 1022 "769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a", 1023 } 1024 binMap[5] = []string{ 1025 "7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8", 1026 } 1027 binMap[6] = []string{ 1028 "7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0", 1029 } 1030 1031 //创建轴的花环 1032 addr := common.FromHex(pivotAddr) 1033 k := network.NewKademlia(addr, network.NewKadParams()) 1034 1035 //构建同行和卡德米利亚 1036 for _, binaddrs := range binMap { 1037 for _, a := range binaddrs { 1038 addr := common.FromHex(a) 1039 k.On(network.NewPeer(&network.BzzPeer{BzzAddr: &network.BzzAddr{OAddr: addr}}, k)) 1040 } 1041 } 1042 1043 //TODO:检查KAD表是否相同 1044 //当前k.string()打印日期,使其永远不会相同:) 1045 //-->KAD表的JSON表示实现 1046 log.Debug(k.String()) 1047 1048 //模拟一下我们要订阅:只需存储bin编号 1049 fakeSubscriptions := make(map[string][]int) 1050 //测试完成后,我们需要将subscriptionUnc重置为默认值 1051 defer func() { subscriptionFunc = doRequestSubscription }() 1052 //定义应该为每个连接运行的函数 1053 //我们不做真正的订阅,只存储箱号 1054 subscriptionFunc = func(r *Registry, p *network.Peer, bin uint8, subs map[enode.ID]map[Stream]struct{}) bool { 1055 //获取对等体ID 1056 peerstr := fmt.Sprintf("%x", p.Over()) 1057 //为每个对等机创建容器数组 1058 if _, ok := fakeSubscriptions[peerstr]; !ok { 1059 fakeSubscriptions[peerstr] = make([]int, 0) 1060 } 1061 //存储(假)bin订阅 1062 log.Debug(fmt.Sprintf("Adding fake subscription for peer %s with bin %d", peerstr, bin)) 1063 fakeSubscriptions[peerstr] = append(fakeSubscriptions[peerstr], int(bin)) 1064 return true 1065 } 1066 //只创建一个简单的注册表对象,以便能够调用… 1067 r := &Registry{} 1068 r.requestPeerSubscriptions(k, nil) 1069 //计算Kademlia深度 1070 kdepth := k.NeighbourhoodDepth() 1071 1072 //现在,检查所有对等方是否都有预期(假)订阅 1073 //迭代bin映射 1074 for bin, peers := range binMap { 1075 //对于每一个同伴… 1076 for _, peer := range peers { 1077 //…获取其(假的)订阅 1078 fakeSubsForPeer := fakeSubscriptions[peer] 1079 //如果同伴的箱子比花环的深度浅… 1080 if bin < kdepth { 1081 //(重复所有(假)订阅) 1082 for _, subbin := range fakeSubsForPeer { 1083 //…只应“订阅”对等机的bin 1084 //(因此只有一个订阅) 1085 if subbin != bin || len(fakeSubsForPeer) != 1 { 1086 t.Fatalf("Did not get expected subscription for bin < depth; bin of peer %s: %d, subscription: %d", peer, bin, subbin) 1087 } 1088 } 1089 } else { //如果同伴的箱子等于或高于卡德米利亚深度… 1090 //(重复所有(假)订阅) 1091 for i, subbin := range fakeSubsForPeer { 1092 //…从对等机的bin号到k.maxproxydisplay的每个bin都应该是“订阅的” 1093 //当我们从深度开始时,我们可以使用迭代索引来检查 1094 if subbin != i+kdepth { 1095 t.Fatalf("Did not get expected subscription for bin > depth; bin of peer %s: %d, subscription: %d", peer, bin, subbin) 1096 } 1097 //最后一个“订阅”应该是k.maxproxplay 1098 if i == len(fakeSubsForPeer)-1 && subbin != k.MaxProxDisplay { 1099 t.Fatalf("Expected last subscription to be: %d, but is: %d", k.MaxProxDisplay, subbin) 1100 } 1101 } 1102 } 1103 } 1104 } 1105 1106 //打印一些输出 1107 for p, subs := range fakeSubscriptions { 1108 log.Debug(fmt.Sprintf("Peer %s has the following fake subscriptions: ", p)) 1109 for _, bin := range subs { 1110 log.Debug(fmt.Sprintf("%d,", bin)) 1111 } 1112 } 1113 } 1114