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