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