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