github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/whisper/whisperv6/whisper_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 whisperv6 26 27 import ( 28 "bytes" 29 "crypto/ecdsa" 30 "crypto/sha256" 31 mrand "math/rand" 32 "testing" 33 "time" 34 35 "github.com/ethereum/go-ethereum/common" 36 "golang.org/x/crypto/pbkdf2" 37 ) 38 39 func TestWhisperBasic(t *testing.T) { 40 w := New(&DefaultConfig) 41 p := w.Protocols() 42 shh := p[0] 43 if shh.Name != ProtocolName { 44 t.Fatalf("failed Protocol Name: %v.", shh.Name) 45 } 46 if uint64(shh.Version) != ProtocolVersion { 47 t.Fatalf("failed Protocol Version: %v.", shh.Version) 48 } 49 if shh.Length != NumberOfMessageCodes { 50 t.Fatalf("failed Protocol Length: %v.", shh.Length) 51 } 52 if shh.Run == nil { 53 t.Fatalf("failed shh.Run.") 54 } 55 if uint64(w.Version()) != ProtocolVersion { 56 t.Fatalf("failed whisper Version: %v.", shh.Version) 57 } 58 if w.GetFilter("non-existent") != nil { 59 t.Fatalf("failed GetFilter.") 60 } 61 62 peerID := make([]byte, 64) 63 mrand.Read(peerID) 64 peer, _ := w.getPeer(peerID) 65 if peer != nil { 66 t.Fatal("found peer for random key.") 67 } 68 if err := w.AllowP2PMessagesFromPeer(peerID); err == nil { 69 t.Fatalf("failed MarkPeerTrusted.") 70 } 71 exist := w.HasSymKey("non-existing") 72 if exist { 73 t.Fatalf("failed HasSymKey.") 74 } 75 key, err := w.GetSymKey("non-existing") 76 if err == nil { 77 t.Fatalf("failed GetSymKey(non-existing): false positive.") 78 } 79 if key != nil { 80 t.Fatalf("failed GetSymKey: false positive.") 81 } 82 mail := w.Envelopes() 83 if len(mail) != 0 { 84 t.Fatalf("failed w.Envelopes().") 85 } 86 87 derived := pbkdf2.Key([]byte(peerID), nil, 65356, aesKeyLength, sha256.New) 88 if !validateDataIntegrity(derived, aesKeyLength) { 89 t.Fatalf("failed validateSymmetricKey with param = %v.", derived) 90 } 91 if containsOnlyZeros(derived) { 92 t.Fatalf("failed containsOnlyZeros with param = %v.", derived) 93 } 94 95 buf := []byte{0xFF, 0xE5, 0x80, 0x2, 0} 96 le := bytesToUintLittleEndian(buf) 97 be := BytesToUintBigEndian(buf) 98 if le != uint64(0x280e5ff) { 99 t.Fatalf("failed bytesToIntLittleEndian: %d.", le) 100 } 101 if be != uint64(0xffe5800200) { 102 t.Fatalf("failed BytesToIntBigEndian: %d.", be) 103 } 104 105 id, err := w.NewKeyPair() 106 if err != nil { 107 t.Fatalf("failed to generate new key pair: %s.", err) 108 } 109 pk, err := w.GetPrivateKey(id) 110 if err != nil { 111 t.Fatalf("failed to retrieve new key pair: %s.", err) 112 } 113 if !validatePrivateKey(pk) { 114 t.Fatalf("failed validatePrivateKey: %v.", pk) 115 } 116 if !ValidatePublicKey(&pk.PublicKey) { 117 t.Fatalf("failed ValidatePublicKey: %v.", pk) 118 } 119 } 120 121 func TestWhisperAsymmetricKeyImport(t *testing.T) { 122 var ( 123 w = New(&DefaultConfig) 124 privateKeys []*ecdsa.PrivateKey 125 ) 126 127 for i := 0; i < 50; i++ { 128 id, err := w.NewKeyPair() 129 if err != nil { 130 t.Fatalf("could not generate key: %v", err) 131 } 132 133 pk, err := w.GetPrivateKey(id) 134 if err != nil { 135 t.Fatalf("could not export private key: %v", err) 136 } 137 138 privateKeys = append(privateKeys, pk) 139 140 if !w.DeleteKeyPair(id) { 141 t.Fatalf("could not delete private key") 142 } 143 } 144 145 for _, pk := range privateKeys { 146 if _, err := w.AddKeyPair(pk); err != nil { 147 t.Fatalf("could not import private key: %v", err) 148 } 149 } 150 } 151 152 func TestWhisperIdentityManagement(t *testing.T) { 153 w := New(&DefaultConfig) 154 id1, err := w.NewKeyPair() 155 if err != nil { 156 t.Fatalf("failed to generate new key pair: %s.", err) 157 } 158 id2, err := w.NewKeyPair() 159 if err != nil { 160 t.Fatalf("failed to generate new key pair: %s.", err) 161 } 162 pk1, err := w.GetPrivateKey(id1) 163 if err != nil { 164 t.Fatalf("failed to retrieve the key pair: %s.", err) 165 } 166 pk2, err := w.GetPrivateKey(id2) 167 if err != nil { 168 t.Fatalf("failed to retrieve the key pair: %s.", err) 169 } 170 171 if !w.HasKeyPair(id1) { 172 t.Fatalf("failed HasIdentity(pk1).") 173 } 174 if !w.HasKeyPair(id2) { 175 t.Fatalf("failed HasIdentity(pk2).") 176 } 177 if pk1 == nil { 178 t.Fatalf("failed GetIdentity(pk1).") 179 } 180 if pk2 == nil { 181 t.Fatalf("failed GetIdentity(pk2).") 182 } 183 184 if !validatePrivateKey(pk1) { 185 t.Fatalf("pk1 is invalid.") 186 } 187 if !validatePrivateKey(pk2) { 188 t.Fatalf("pk2 is invalid.") 189 } 190 191 // 192 done := w.DeleteKeyPair(id1) 193 if !done { 194 t.Fatalf("failed to delete id1.") 195 } 196 pk1, err = w.GetPrivateKey(id1) 197 if err == nil { 198 t.Fatalf("retrieve the key pair: false positive.") 199 } 200 pk2, err = w.GetPrivateKey(id2) 201 if err != nil { 202 t.Fatalf("failed to retrieve the key pair: %s.", err) 203 } 204 if w.HasKeyPair(id1) { 205 t.Fatalf("failed DeleteIdentity(pub1): still exist.") 206 } 207 if !w.HasKeyPair(id2) { 208 t.Fatalf("failed DeleteIdentity(pub1): pub2 does not exist.") 209 } 210 if pk1 != nil { 211 t.Fatalf("failed DeleteIdentity(pub1): first key still exist.") 212 } 213 if pk2 == nil { 214 t.Fatalf("failed DeleteIdentity(pub1): second key does not exist.") 215 } 216 217 // 218 done = w.DeleteKeyPair(id1) 219 if done { 220 t.Fatalf("delete id1: false positive.") 221 } 222 pk1, err = w.GetPrivateKey(id1) 223 if err == nil { 224 t.Fatalf("retrieve the key pair: false positive.") 225 } 226 pk2, err = w.GetPrivateKey(id2) 227 if err != nil { 228 t.Fatalf("failed to retrieve the key pair: %s.", err) 229 } 230 if w.HasKeyPair(id1) { 231 t.Fatalf("failed delete non-existing identity: exist.") 232 } 233 if !w.HasKeyPair(id2) { 234 t.Fatalf("failed delete non-existing identity: pub2 does not exist.") 235 } 236 if pk1 != nil { 237 t.Fatalf("failed delete non-existing identity: first key exist.") 238 } 239 if pk2 == nil { 240 t.Fatalf("failed delete non-existing identity: second key does not exist.") 241 } 242 243 // 244 done = w.DeleteKeyPair(id2) 245 if !done { 246 t.Fatalf("failed to delete id2.") 247 } 248 pk1, err = w.GetPrivateKey(id1) 249 if err == nil { 250 t.Fatalf("retrieve the key pair: false positive.") 251 } 252 pk2, err = w.GetPrivateKey(id2) 253 if err == nil { 254 t.Fatalf("retrieve the key pair: false positive.") 255 } 256 if w.HasKeyPair(id1) { 257 t.Fatalf("failed delete second identity: first identity exist.") 258 } 259 if w.HasKeyPair(id2) { 260 t.Fatalf("failed delete second identity: still exist.") 261 } 262 if pk1 != nil { 263 t.Fatalf("failed delete second identity: first key exist.") 264 } 265 if pk2 != nil { 266 t.Fatalf("failed delete second identity: second key exist.") 267 } 268 } 269 270 func TestWhisperSymKeyManagement(t *testing.T) { 271 InitSingleTest() 272 273 var err error 274 var k1, k2 []byte 275 w := New(&DefaultConfig) 276 id1 := string("arbitrary-string-1") 277 id2 := string("arbitrary-string-2") 278 279 id1, err = w.GenerateSymKey() 280 if err != nil { 281 t.Fatalf("failed GenerateSymKey with seed %d: %s.", seed, err) 282 } 283 284 k1, err = w.GetSymKey(id1) 285 if err != nil { 286 t.Fatalf("failed GetSymKey(id1).") 287 } 288 k2, err = w.GetSymKey(id2) 289 if err == nil { 290 t.Fatalf("failed GetSymKey(id2): false positive.") 291 } 292 if !w.HasSymKey(id1) { 293 t.Fatalf("failed HasSymKey(id1).") 294 } 295 if w.HasSymKey(id2) { 296 t.Fatalf("failed HasSymKey(id2): false positive.") 297 } 298 if k1 == nil { 299 t.Fatalf("first key does not exist.") 300 } 301 if k2 != nil { 302 t.Fatalf("second key still exist.") 303 } 304 305 // 306 randomKey := make([]byte, aesKeyLength) 307 mrand.Read(randomKey) 308 id1, err = w.AddSymKeyDirect(randomKey) 309 if err != nil { 310 t.Fatalf("failed AddSymKey with seed %d: %s.", seed, err) 311 } 312 313 k1, err = w.GetSymKey(id1) 314 if err != nil { 315 t.Fatalf("failed w.GetSymKey(id1).") 316 } 317 k2, err = w.GetSymKey(id2) 318 if err == nil { 319 t.Fatalf("failed w.GetSymKey(id2): false positive.") 320 } 321 if !w.HasSymKey(id1) { 322 t.Fatalf("failed w.HasSymKey(id1).") 323 } 324 if w.HasSymKey(id2) { 325 t.Fatalf("failed w.HasSymKey(id2): false positive.") 326 } 327 if k1 == nil { 328 t.Fatalf("first key does not exist.") 329 } 330 if !bytes.Equal(k1, randomKey) { 331 t.Fatalf("k1 != randomKey.") 332 } 333 if k2 != nil { 334 t.Fatalf("second key already exist.") 335 } 336 337 id2, err = w.AddSymKeyDirect(randomKey) 338 if err != nil { 339 t.Fatalf("failed AddSymKey(id2) with seed %d: %s.", seed, err) 340 } 341 k1, err = w.GetSymKey(id1) 342 if err != nil { 343 t.Fatalf("failed w.GetSymKey(id1).") 344 } 345 k2, err = w.GetSymKey(id2) 346 if err != nil { 347 t.Fatalf("failed w.GetSymKey(id2).") 348 } 349 if !w.HasSymKey(id1) { 350 t.Fatalf("HasSymKey(id1) failed.") 351 } 352 if !w.HasSymKey(id2) { 353 t.Fatalf("HasSymKey(id2) failed.") 354 } 355 if k1 == nil { 356 t.Fatalf("k1 does not exist.") 357 } 358 if k2 == nil { 359 t.Fatalf("k2 does not exist.") 360 } 361 if !bytes.Equal(k1, k2) { 362 t.Fatalf("k1 != k2.") 363 } 364 if !bytes.Equal(k1, randomKey) { 365 t.Fatalf("k1 != randomKey.") 366 } 367 if len(k1) != aesKeyLength { 368 t.Fatalf("wrong length of k1.") 369 } 370 if len(k2) != aesKeyLength { 371 t.Fatalf("wrong length of k2.") 372 } 373 374 w.DeleteSymKey(id1) 375 k1, err = w.GetSymKey(id1) 376 if err == nil { 377 t.Fatalf("failed w.GetSymKey(id1): false positive.") 378 } 379 if k1 != nil { 380 t.Fatalf("failed GetSymKey(id1): false positive.") 381 } 382 k2, err = w.GetSymKey(id2) 383 if err != nil { 384 t.Fatalf("failed w.GetSymKey(id2).") 385 } 386 if w.HasSymKey(id1) { 387 t.Fatalf("failed to delete first key: still exist.") 388 } 389 if !w.HasSymKey(id2) { 390 t.Fatalf("failed to delete first key: second key does not exist.") 391 } 392 if k1 != nil { 393 t.Fatalf("failed to delete first key.") 394 } 395 if k2 == nil { 396 t.Fatalf("failed to delete first key: second key is nil.") 397 } 398 399 w.DeleteSymKey(id1) 400 w.DeleteSymKey(id2) 401 k1, err = w.GetSymKey(id1) 402 if err == nil { 403 t.Fatalf("failed w.GetSymKey(id1): false positive.") 404 } 405 k2, err = w.GetSymKey(id2) 406 if err == nil { 407 t.Fatalf("failed w.GetSymKey(id2): false positive.") 408 } 409 if k1 != nil || k2 != nil { 410 t.Fatalf("k1 or k2 is not nil") 411 } 412 if w.HasSymKey(id1) { 413 t.Fatalf("failed to delete second key: first key exist.") 414 } 415 if w.HasSymKey(id2) { 416 t.Fatalf("failed to delete second key: still exist.") 417 } 418 if k1 != nil { 419 t.Fatalf("failed to delete second key: first key is not nil.") 420 } 421 if k2 != nil { 422 t.Fatalf("failed to delete second key: second key is not nil.") 423 } 424 425 randomKey = make([]byte, aesKeyLength+1) 426 mrand.Read(randomKey) 427 _, err = w.AddSymKeyDirect(randomKey) 428 if err == nil { 429 t.Fatalf("added the key with wrong size, seed %d.", seed) 430 } 431 432 const password = "arbitrary data here" 433 id1, err = w.AddSymKeyFromPassword(password) 434 if err != nil { 435 t.Fatalf("failed AddSymKeyFromPassword(id1) with seed %d: %s.", seed, err) 436 } 437 id2, err = w.AddSymKeyFromPassword(password) 438 if err != nil { 439 t.Fatalf("failed AddSymKeyFromPassword(id2) with seed %d: %s.", seed, err) 440 } 441 k1, err = w.GetSymKey(id1) 442 if err != nil { 443 t.Fatalf("failed w.GetSymKey(id1).") 444 } 445 k2, err = w.GetSymKey(id2) 446 if err != nil { 447 t.Fatalf("failed w.GetSymKey(id2).") 448 } 449 if !w.HasSymKey(id1) { 450 t.Fatalf("HasSymKey(id1) failed.") 451 } 452 if !w.HasSymKey(id2) { 453 t.Fatalf("HasSymKey(id2) failed.") 454 } 455 if !validateDataIntegrity(k2, aesKeyLength) { 456 t.Fatalf("key validation failed.") 457 } 458 if !bytes.Equal(k1, k2) { 459 t.Fatalf("k1 != k2.") 460 } 461 } 462 463 func TestExpiry(t *testing.T) { 464 InitSingleTest() 465 466 w := New(&DefaultConfig) 467 w.SetMinimumPowTest(0.0000001) 468 defer w.SetMinimumPowTest(DefaultMinimumPoW) 469 w.Start(nil) 470 defer w.Stop() 471 472 params, err := generateMessageParams() 473 if err != nil { 474 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 475 } 476 477 params.TTL = 1 478 msg, err := NewSentMessage(params) 479 if err != nil { 480 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 481 } 482 env, err := msg.Wrap(params) 483 if err != nil { 484 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 485 } 486 487 err = w.Send(env) 488 if err != nil { 489 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 490 } 491 492 // 493 var received, expired bool 494 for j := 0; j < 20; j++ { 495 time.Sleep(100 * time.Millisecond) 496 if len(w.Envelopes()) > 0 { 497 received = true 498 break 499 } 500 } 501 502 if !received { 503 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 504 } 505 506 // 507 for j := 0; j < 20; j++ { 508 time.Sleep(100 * time.Millisecond) 509 if len(w.Envelopes()) == 0 { 510 expired = true 511 break 512 } 513 } 514 515 if !expired { 516 t.Fatalf("expire failed, seed: %d.", seed) 517 } 518 } 519 520 func TestCustomization(t *testing.T) { 521 InitSingleTest() 522 523 w := New(&DefaultConfig) 524 defer w.SetMinimumPowTest(DefaultMinimumPoW) 525 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 526 w.Start(nil) 527 defer w.Stop() 528 529 const smallPoW = 0.00001 530 531 f, err := generateFilter(t, true) 532 if err != nil { 533 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 534 } 535 params, err := generateMessageParams() 536 if err != nil { 537 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 538 } 539 540 params.KeySym = f.KeySym 541 params.Topic = BytesToTopic(f.Topics[2]) 542 params.PoW = smallPoW 543 params.TTL = 3600 * 24 // 544 msg, err := NewSentMessage(params) 545 if err != nil { 546 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 547 } 548 env, err := msg.Wrap(params) 549 if err != nil { 550 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 551 } 552 553 err = w.Send(env) 554 if err == nil { 555 t.Fatalf("successfully sent envelope with PoW %.06f, false positive (seed %d).", env.PoW(), seed) 556 } 557 558 w.SetMinimumPowTest(smallPoW / 2) 559 err = w.Send(env) 560 if err != nil { 561 t.Fatalf("failed to send envelope with seed %d: %s.", seed, err) 562 } 563 564 params.TTL++ 565 msg, err = NewSentMessage(params) 566 if err != nil { 567 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 568 } 569 env, err = msg.Wrap(params) 570 if err != nil { 571 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 572 } 573 w.SetMaxMessageSize(uint32(env.size() - 1)) 574 err = w.Send(env) 575 if err == nil { 576 t.Fatalf("successfully sent oversized envelope (seed %d): false positive.", seed) 577 } 578 579 w.SetMaxMessageSize(DefaultMaxMessageSize) 580 err = w.Send(env) 581 if err != nil { 582 t.Fatalf("failed to send second envelope with seed %d: %s.", seed, err) 583 } 584 585 // 586 var received bool 587 for j := 0; j < 20; j++ { 588 time.Sleep(100 * time.Millisecond) 589 if len(w.Envelopes()) > 1 { 590 received = true 591 break 592 } 593 } 594 595 if !received { 596 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 597 } 598 599 // 600 _, err = w.Subscribe(f) 601 if err != nil { 602 t.Fatalf("failed subscribe with seed %d: %s.", seed, err) 603 } 604 time.Sleep(5 * time.Millisecond) 605 mail := f.Retrieve() 606 if len(mail) > 0 { 607 t.Fatalf("received premature mail") 608 } 609 } 610 611 func TestSymmetricSendCycle(t *testing.T) { 612 InitSingleTest() 613 614 w := New(&DefaultConfig) 615 defer w.SetMinimumPowTest(DefaultMinimumPoW) 616 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 617 w.Start(nil) 618 defer w.Stop() 619 620 filter1, err := generateFilter(t, true) 621 if err != nil { 622 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 623 } 624 filter1.PoW = DefaultMinimumPoW 625 626 // 627 // 628 filter2 := &Filter{ 629 KeySym: filter1.KeySym, 630 Topics: filter1.Topics, 631 PoW: filter1.PoW, 632 AllowP2P: filter1.AllowP2P, 633 Messages: make(map[common.Hash]*ReceivedMessage), 634 } 635 636 params, err := generateMessageParams() 637 if err != nil { 638 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 639 } 640 641 filter1.Src = ¶ms.Src.PublicKey 642 filter2.Src = ¶ms.Src.PublicKey 643 644 params.KeySym = filter1.KeySym 645 params.Topic = BytesToTopic(filter1.Topics[2]) 646 params.PoW = filter1.PoW 647 params.WorkTime = 10 648 params.TTL = 50 649 msg, err := NewSentMessage(params) 650 if err != nil { 651 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 652 } 653 env, err := msg.Wrap(params) 654 if err != nil { 655 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 656 } 657 658 _, err = w.Subscribe(filter1) 659 if err != nil { 660 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 661 } 662 663 _, err = w.Subscribe(filter2) 664 if err != nil { 665 t.Fatalf("failed subscribe 2 with seed %d: %s.", seed, err) 666 } 667 668 err = w.Send(env) 669 if err != nil { 670 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 671 } 672 673 // 674 var received bool 675 for j := 0; j < 200; j++ { 676 time.Sleep(10 * time.Millisecond) 677 if len(w.Envelopes()) > 0 { 678 received = true 679 break 680 } 681 } 682 683 if !received { 684 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 685 } 686 687 // 688 time.Sleep(5 * time.Millisecond) 689 mail1 := filter1.Retrieve() 690 mail2 := filter2.Retrieve() 691 if len(mail2) == 0 { 692 t.Fatalf("did not receive any email for filter 2") 693 } 694 if len(mail1) == 0 { 695 t.Fatalf("did not receive any email for filter 1") 696 } 697 698 } 699 700 func TestSymmetricSendWithoutAKey(t *testing.T) { 701 InitSingleTest() 702 703 w := New(&DefaultConfig) 704 defer w.SetMinimumPowTest(DefaultMinimumPoW) 705 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 706 w.Start(nil) 707 defer w.Stop() 708 709 filter, err := generateFilter(t, true) 710 if err != nil { 711 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 712 } 713 filter.PoW = DefaultMinimumPoW 714 715 params, err := generateMessageParams() 716 if err != nil { 717 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 718 } 719 720 filter.Src = nil 721 722 params.KeySym = filter.KeySym 723 params.Topic = BytesToTopic(filter.Topics[2]) 724 params.PoW = filter.PoW 725 params.WorkTime = 10 726 params.TTL = 50 727 msg, err := NewSentMessage(params) 728 if err != nil { 729 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 730 } 731 env, err := msg.Wrap(params) 732 if err != nil { 733 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 734 } 735 736 _, err = w.Subscribe(filter) 737 if err != nil { 738 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 739 } 740 741 err = w.Send(env) 742 if err != nil { 743 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 744 } 745 746 // 747 var received bool 748 for j := 0; j < 200; j++ { 749 time.Sleep(10 * time.Millisecond) 750 if len(w.Envelopes()) > 0 { 751 received = true 752 break 753 } 754 } 755 756 if !received { 757 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 758 } 759 760 // 761 time.Sleep(5 * time.Millisecond) 762 mail := filter.Retrieve() 763 if len(mail) == 0 { 764 t.Fatalf("did not receive message in spite of not setting a public key") 765 } 766 } 767 768 func TestSymmetricSendKeyMismatch(t *testing.T) { 769 InitSingleTest() 770 771 w := New(&DefaultConfig) 772 defer w.SetMinimumPowTest(DefaultMinimumPoW) 773 defer w.SetMaxMessageSize(DefaultMaxMessageSize) 774 w.Start(nil) 775 defer w.Stop() 776 777 filter, err := generateFilter(t, true) 778 if err != nil { 779 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 780 } 781 filter.PoW = DefaultMinimumPoW 782 783 params, err := generateMessageParams() 784 if err != nil { 785 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 786 } 787 788 params.KeySym = filter.KeySym 789 params.Topic = BytesToTopic(filter.Topics[2]) 790 params.PoW = filter.PoW 791 params.WorkTime = 10 792 params.TTL = 50 793 msg, err := NewSentMessage(params) 794 if err != nil { 795 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 796 } 797 env, err := msg.Wrap(params) 798 if err != nil { 799 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 800 } 801 802 _, err = w.Subscribe(filter) 803 if err != nil { 804 t.Fatalf("failed subscribe 1 with seed %d: %s.", seed, err) 805 } 806 807 err = w.Send(env) 808 if err != nil { 809 t.Fatalf("Failed sending envelope with PoW %.06f (seed %d): %s", env.PoW(), seed, err) 810 } 811 812 // 813 var received bool 814 for j := 0; j < 200; j++ { 815 time.Sleep(10 * time.Millisecond) 816 if len(w.Envelopes()) > 0 { 817 received = true 818 break 819 } 820 } 821 822 if !received { 823 t.Fatalf("did not receive the sent envelope, seed: %d.", seed) 824 } 825 826 // 827 time.Sleep(5 * time.Millisecond) 828 mail := filter.Retrieve() 829 if len(mail) > 0 { 830 t.Fatalf("received a message when keys weren't matching") 831 } 832 } 833 834 func TestBloom(t *testing.T) { 835 topic := TopicType{0, 0, 255, 6} 836 b := TopicToBloom(topic) 837 x := make([]byte, BloomFilterSize) 838 x[0] = byte(1) 839 x[32] = byte(1) 840 x[BloomFilterSize-1] = byte(128) 841 if !BloomFilterMatch(x, b) || !BloomFilterMatch(b, x) { 842 t.Fatalf("bloom filter does not match the mask") 843 } 844 845 _, err := mrand.Read(b) 846 if err != nil { 847 t.Fatalf("math rand error") 848 } 849 _, err = mrand.Read(x) 850 if err != nil { 851 t.Fatalf("math rand error") 852 } 853 if !BloomFilterMatch(b, b) { 854 t.Fatalf("bloom filter does not match self") 855 } 856 x = addBloom(x, b) 857 if !BloomFilterMatch(x, b) { 858 t.Fatalf("bloom filter does not match combined bloom") 859 } 860 if !isFullNode(nil) { 861 t.Fatalf("isFullNode did not recognize nil as full node") 862 } 863 x[17] = 254 864 if isFullNode(x) { 865 t.Fatalf("isFullNode false positive") 866 } 867 for i := 0; i < BloomFilterSize; i++ { 868 b[i] = byte(255) 869 } 870 if !isFullNode(b) { 871 t.Fatalf("isFullNode false negative") 872 } 873 if BloomFilterMatch(x, b) { 874 t.Fatalf("bloomFilterMatch false positive") 875 } 876 if !BloomFilterMatch(b, x) { 877 t.Fatalf("bloomFilterMatch false negative") 878 } 879 880 w := New(&DefaultConfig) 881 f := w.BloomFilter() 882 if f != nil { 883 t.Fatalf("wrong bloom on creation") 884 } 885 err = w.SetBloomFilter(x) 886 if err != nil { 887 t.Fatalf("failed to set bloom filter: %s", err) 888 } 889 f = w.BloomFilter() 890 if !BloomFilterMatch(f, x) || !BloomFilterMatch(x, f) { 891 t.Fatalf("retireved wrong bloom filter") 892 } 893 }