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