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