github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/network/stream/streamer_test.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 // 10 // 11 // 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 25 package stream 26 27 import ( 28 "bytes" 29 "context" 30 "testing" 31 "time" 32 33 "github.com/ethereum/go-ethereum/crypto/sha3" 34 p2ptest "github.com/ethereum/go-ethereum/p2p/testing" 35 ) 36 37 func TestStreamerSubscribe(t *testing.T) { 38 tester, streamer, _, teardown, err := newStreamerTester(t) 39 defer teardown() 40 if err != nil { 41 t.Fatal(err) 42 } 43 44 stream := NewStream("foo", "", true) 45 err = streamer.Subscribe(tester.IDs[0], stream, NewRange(0, 0), Top) 46 if err == nil || err.Error() != "stream foo not registered" { 47 t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) 48 } 49 } 50 51 func TestStreamerRequestSubscription(t *testing.T) { 52 tester, streamer, _, teardown, err := newStreamerTester(t) 53 defer teardown() 54 if err != nil { 55 t.Fatal(err) 56 } 57 58 stream := NewStream("foo", "", false) 59 err = streamer.RequestSubscription(tester.IDs[0], stream, &Range{}, Top) 60 if err == nil || err.Error() != "stream foo not registered" { 61 t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) 62 } 63 } 64 65 var ( 66 hash0 = sha3.Sum256([]byte{0}) 67 hash1 = sha3.Sum256([]byte{1}) 68 hash2 = sha3.Sum256([]byte{2}) 69 hashesTmp = append(hash0[:], hash1[:]...) 70 hashes = append(hashesTmp, hash2[:]...) 71 ) 72 73 type testClient struct { 74 t string 75 wait0 chan bool 76 wait2 chan bool 77 batchDone chan bool 78 receivedHashes map[string][]byte 79 } 80 81 func newTestClient(t string) *testClient { 82 return &testClient{ 83 t: t, 84 wait0: make(chan bool), 85 wait2: make(chan bool), 86 batchDone: make(chan bool), 87 receivedHashes: make(map[string][]byte), 88 } 89 } 90 91 func (self *testClient) NeedData(ctx context.Context, hash []byte) func() { 92 self.receivedHashes[string(hash)] = hash 93 if bytes.Equal(hash, hash0[:]) { 94 return func() { 95 <-self.wait0 96 } 97 } else if bytes.Equal(hash, hash2[:]) { 98 return func() { 99 <-self.wait2 100 } 101 } 102 return nil 103 } 104 105 func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) { 106 close(self.batchDone) 107 return nil 108 } 109 110 func (self *testClient) Close() {} 111 112 type testServer struct { 113 t string 114 } 115 116 func newTestServer(t string) *testServer { 117 return &testServer{ 118 t: t, 119 } 120 } 121 122 func (self *testServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { 123 return make([]byte, HashSize), from + 1, to + 1, nil, nil 124 } 125 126 func (self *testServer) GetData(context.Context, []byte) ([]byte, error) { 127 return nil, nil 128 } 129 130 func (self *testServer) Close() { 131 } 132 133 func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { 134 tester, streamer, _, teardown, err := newStreamerTester(t) 135 defer teardown() 136 if err != nil { 137 t.Fatal(err) 138 } 139 140 streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { 141 return newTestClient(t), nil 142 }) 143 144 peerID := tester.IDs[0] 145 146 stream := NewStream("foo", "", true) 147 err = streamer.Subscribe(peerID, stream, NewRange(5, 8), Top) 148 if err != nil { 149 t.Fatalf("Expected no error, got %v", err) 150 } 151 152 err = tester.TestExchanges( 153 p2ptest.Exchange{ 154 Label: "Subscribe message", 155 Expects: []p2ptest.Expect{ 156 { 157 Code: 4, 158 Msg: &SubscribeMsg{ 159 Stream: stream, 160 History: NewRange(5, 8), 161 Priority: Top, 162 }, 163 Peer: peerID, 164 }, 165 }, 166 }, 167 // 168 p2ptest.Exchange{ 169 Label: "OfferedHashes message", 170 Triggers: []p2ptest.Trigger{ 171 { 172 Code: 1, 173 Msg: &OfferedHashesMsg{ 174 HandoverProof: &HandoverProof{ 175 Handover: &Handover{}, 176 }, 177 Hashes: hashes, 178 From: 5, 179 To: 8, 180 Stream: stream, 181 }, 182 Peer: peerID, 183 }, 184 }, 185 Expects: []p2ptest.Expect{ 186 { 187 Code: 2, 188 Msg: &WantedHashesMsg{ 189 Stream: stream, 190 Want: []byte{5}, 191 From: 9, 192 To: 0, 193 }, 194 Peer: peerID, 195 }, 196 }, 197 }, 198 ) 199 if err != nil { 200 t.Fatal(err) 201 } 202 203 err = streamer.Unsubscribe(peerID, stream) 204 if err != nil { 205 t.Fatalf("Expected no error, got %v", err) 206 } 207 208 err = tester.TestExchanges(p2ptest.Exchange{ 209 Label: "Unsubscribe message", 210 Expects: []p2ptest.Expect{ 211 { 212 Code: 0, 213 Msg: &UnsubscribeMsg{ 214 Stream: stream, 215 }, 216 Peer: peerID, 217 }, 218 }, 219 }) 220 221 if err != nil { 222 t.Fatal(err) 223 } 224 } 225 226 func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { 227 tester, streamer, _, teardown, err := newStreamerTester(t) 228 defer teardown() 229 if err != nil { 230 t.Fatal(err) 231 } 232 233 stream := NewStream("foo", "", false) 234 235 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 236 return newTestServer(t), nil 237 }) 238 239 peerID := tester.IDs[0] 240 241 err = tester.TestExchanges(p2ptest.Exchange{ 242 Label: "Subscribe message", 243 Triggers: []p2ptest.Trigger{ 244 { 245 Code: 4, 246 Msg: &SubscribeMsg{ 247 Stream: stream, 248 History: NewRange(5, 8), 249 Priority: Top, 250 }, 251 Peer: peerID, 252 }, 253 }, 254 Expects: []p2ptest.Expect{ 255 { 256 Code: 1, 257 Msg: &OfferedHashesMsg{ 258 Stream: stream, 259 HandoverProof: &HandoverProof{ 260 Handover: &Handover{}, 261 }, 262 Hashes: make([]byte, HashSize), 263 From: 6, 264 To: 9, 265 }, 266 Peer: peerID, 267 }, 268 }, 269 }) 270 271 if err != nil { 272 t.Fatal(err) 273 } 274 275 err = tester.TestExchanges(p2ptest.Exchange{ 276 Label: "unsubscribe message", 277 Triggers: []p2ptest.Trigger{ 278 { 279 Code: 0, 280 Msg: &UnsubscribeMsg{ 281 Stream: stream, 282 }, 283 Peer: peerID, 284 }, 285 }, 286 }) 287 288 if err != nil { 289 t.Fatal(err) 290 } 291 } 292 293 func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) { 294 tester, streamer, _, teardown, err := newStreamerTester(t) 295 defer teardown() 296 if err != nil { 297 t.Fatal(err) 298 } 299 300 stream := NewStream("foo", "", true) 301 302 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 303 return newTestServer(t), nil 304 }) 305 306 peerID := tester.IDs[0] 307 308 err = tester.TestExchanges(p2ptest.Exchange{ 309 Label: "Subscribe message", 310 Triggers: []p2ptest.Trigger{ 311 { 312 Code: 4, 313 Msg: &SubscribeMsg{ 314 Stream: stream, 315 Priority: Top, 316 }, 317 Peer: peerID, 318 }, 319 }, 320 Expects: []p2ptest.Expect{ 321 { 322 Code: 1, 323 Msg: &OfferedHashesMsg{ 324 Stream: stream, 325 HandoverProof: &HandoverProof{ 326 Handover: &Handover{}, 327 }, 328 Hashes: make([]byte, HashSize), 329 From: 1, 330 To: 1, 331 }, 332 Peer: peerID, 333 }, 334 }, 335 }) 336 337 if err != nil { 338 t.Fatal(err) 339 } 340 341 err = tester.TestExchanges(p2ptest.Exchange{ 342 Label: "unsubscribe message", 343 Triggers: []p2ptest.Trigger{ 344 { 345 Code: 0, 346 Msg: &UnsubscribeMsg{ 347 Stream: stream, 348 }, 349 Peer: peerID, 350 }, 351 }, 352 }) 353 354 if err != nil { 355 t.Fatal(err) 356 } 357 } 358 359 func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) { 360 tester, streamer, _, teardown, err := newStreamerTester(t) 361 defer teardown() 362 if err != nil { 363 t.Fatal(err) 364 } 365 366 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 367 return newTestServer(t), nil 368 }) 369 370 stream := NewStream("bar", "", true) 371 372 peerID := tester.IDs[0] 373 374 err = tester.TestExchanges(p2ptest.Exchange{ 375 Label: "Subscribe message", 376 Triggers: []p2ptest.Trigger{ 377 { 378 Code: 4, 379 Msg: &SubscribeMsg{ 380 Stream: stream, 381 History: NewRange(5, 8), 382 Priority: Top, 383 }, 384 Peer: peerID, 385 }, 386 }, 387 Expects: []p2ptest.Expect{ 388 { 389 Code: 7, 390 Msg: &SubscribeErrorMsg{ 391 Error: "stream bar not registered", 392 }, 393 Peer: peerID, 394 }, 395 }, 396 }) 397 398 if err != nil { 399 t.Fatal(err) 400 } 401 } 402 403 func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) { 404 tester, streamer, _, teardown, err := newStreamerTester(t) 405 defer teardown() 406 if err != nil { 407 t.Fatal(err) 408 } 409 410 stream := NewStream("foo", "", true) 411 412 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 413 return &testServer{ 414 t: t, 415 }, nil 416 }) 417 418 peerID := tester.IDs[0] 419 420 err = tester.TestExchanges(p2ptest.Exchange{ 421 Label: "Subscribe message", 422 Triggers: []p2ptest.Trigger{ 423 { 424 Code: 4, 425 Msg: &SubscribeMsg{ 426 Stream: stream, 427 History: NewRange(5, 8), 428 Priority: Top, 429 }, 430 Peer: peerID, 431 }, 432 }, 433 Expects: []p2ptest.Expect{ 434 { 435 Code: 1, 436 Msg: &OfferedHashesMsg{ 437 Stream: NewStream("foo", "", false), 438 HandoverProof: &HandoverProof{ 439 Handover: &Handover{}, 440 }, 441 Hashes: make([]byte, HashSize), 442 From: 6, 443 To: 9, 444 }, 445 Peer: peerID, 446 }, 447 { 448 Code: 1, 449 Msg: &OfferedHashesMsg{ 450 Stream: stream, 451 HandoverProof: &HandoverProof{ 452 Handover: &Handover{}, 453 }, 454 From: 1, 455 To: 1, 456 Hashes: make([]byte, HashSize), 457 }, 458 Peer: peerID, 459 }, 460 }, 461 }) 462 463 if err != nil { 464 t.Fatal(err) 465 } 466 } 467 468 func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) { 469 tester, streamer, _, teardown, err := newStreamerTester(t) 470 defer teardown() 471 if err != nil { 472 t.Fatal(err) 473 } 474 475 stream := NewStream("foo", "", true) 476 477 var tc *testClient 478 479 streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { 480 tc = newTestClient(t) 481 return tc, nil 482 }) 483 484 peerID := tester.IDs[0] 485 486 err = streamer.Subscribe(peerID, stream, NewRange(5, 8), Top) 487 if err != nil { 488 t.Fatalf("Expected no error, got %v", err) 489 } 490 491 err = tester.TestExchanges(p2ptest.Exchange{ 492 Label: "Subscribe message", 493 Expects: []p2ptest.Expect{ 494 { 495 Code: 4, 496 Msg: &SubscribeMsg{ 497 Stream: stream, 498 History: NewRange(5, 8), 499 Priority: Top, 500 }, 501 Peer: peerID, 502 }, 503 }, 504 }, 505 p2ptest.Exchange{ 506 Label: "WantedHashes message", 507 Triggers: []p2ptest.Trigger{ 508 { 509 Code: 1, 510 Msg: &OfferedHashesMsg{ 511 HandoverProof: &HandoverProof{ 512 Handover: &Handover{}, 513 }, 514 Hashes: hashes, 515 From: 5, 516 To: 8, 517 Stream: stream, 518 }, 519 Peer: peerID, 520 }, 521 }, 522 Expects: []p2ptest.Expect{ 523 { 524 Code: 2, 525 Msg: &WantedHashesMsg{ 526 Stream: stream, 527 Want: []byte{5}, 528 From: 9, 529 To: 0, 530 }, 531 Peer: peerID, 532 }, 533 }, 534 }) 535 if err != nil { 536 t.Fatal(err) 537 } 538 539 if len(tc.receivedHashes) != 3 { 540 t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes)) 541 } 542 543 close(tc.wait0) 544 545 timeout := time.NewTimer(100 * time.Millisecond) 546 defer timeout.Stop() 547 548 select { 549 case <-tc.batchDone: 550 t.Fatal("batch done early") 551 case <-timeout.C: 552 } 553 554 close(tc.wait2) 555 556 timeout2 := time.NewTimer(10000 * time.Millisecond) 557 defer timeout2.Stop() 558 559 select { 560 case <-tc.batchDone: 561 case <-timeout2.C: 562 t.Fatal("timeout waiting batchdone call") 563 } 564 565 } 566 567 func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) { 568 tester, streamer, _, teardown, err := newStreamerTester(t) 569 defer teardown() 570 if err != nil { 571 t.Fatal(err) 572 } 573 574 streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { 575 return newTestServer(t), nil 576 }) 577 578 peerID := tester.IDs[0] 579 580 stream := NewStream("foo", "", true) 581 err = streamer.RequestSubscription(peerID, stream, NewRange(5, 8), Top) 582 if err != nil { 583 t.Fatalf("Expected no error, got %v", err) 584 } 585 586 err = tester.TestExchanges( 587 p2ptest.Exchange{ 588 Label: "RequestSubscription message", 589 Expects: []p2ptest.Expect{ 590 { 591 Code: 8, 592 Msg: &RequestSubscriptionMsg{ 593 Stream: stream, 594 History: NewRange(5, 8), 595 Priority: Top, 596 }, 597 Peer: peerID, 598 }, 599 }, 600 }, 601 p2ptest.Exchange{ 602 Label: "Subscribe message", 603 Triggers: []p2ptest.Trigger{ 604 { 605 Code: 4, 606 Msg: &SubscribeMsg{ 607 Stream: stream, 608 History: NewRange(5, 8), 609 Priority: Top, 610 }, 611 Peer: peerID, 612 }, 613 }, 614 Expects: []p2ptest.Expect{ 615 { 616 Code: 1, 617 Msg: &OfferedHashesMsg{ 618 Stream: NewStream("foo", "", false), 619 HandoverProof: &HandoverProof{ 620 Handover: &Handover{}, 621 }, 622 Hashes: make([]byte, HashSize), 623 From: 6, 624 To: 9, 625 }, 626 Peer: peerID, 627 }, 628 { 629 Code: 1, 630 Msg: &OfferedHashesMsg{ 631 Stream: stream, 632 HandoverProof: &HandoverProof{ 633 Handover: &Handover{}, 634 }, 635 From: 1, 636 To: 1, 637 Hashes: make([]byte, HashSize), 638 }, 639 Peer: peerID, 640 }, 641 }, 642 }, 643 ) 644 if err != nil { 645 t.Fatal(err) 646 } 647 648 err = streamer.Quit(peerID, stream) 649 if err != nil { 650 t.Fatalf("Expected no error, got %v", err) 651 } 652 653 err = tester.TestExchanges(p2ptest.Exchange{ 654 Label: "Quit message", 655 Expects: []p2ptest.Expect{ 656 { 657 Code: 9, 658 Msg: &QuitMsg{ 659 Stream: stream, 660 }, 661 Peer: peerID, 662 }, 663 }, 664 }) 665 666 if err != nil { 667 t.Fatal(err) 668 } 669 670 historyStream := getHistoryStream(stream) 671 672 err = streamer.Quit(peerID, historyStream) 673 if err != nil { 674 t.Fatalf("Expected no error, got %v", err) 675 } 676 677 err = tester.TestExchanges(p2ptest.Exchange{ 678 Label: "Quit message", 679 Expects: []p2ptest.Expect{ 680 { 681 Code: 9, 682 Msg: &QuitMsg{ 683 Stream: historyStream, 684 }, 685 Peer: peerID, 686 }, 687 }, 688 }) 689 690 if err != nil { 691 t.Fatal(err) 692 } 693 }