github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/whisper/whisperv6/filter_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 "math/big" 29 mrand "math/rand" 30 "testing" 31 "time" 32 33 "github.com/ethereum/go-ethereum/common" 34 "github.com/ethereum/go-ethereum/crypto" 35 ) 36 37 var seed int64 38 39 // 40 // 41 // 42 func InitSingleTest() { 43 seed = time.Now().Unix() 44 mrand.Seed(seed) 45 } 46 47 func InitDebugTest(i int64) { 48 seed = i 49 mrand.Seed(seed) 50 } 51 52 type FilterTestCase struct { 53 f *Filter 54 id string 55 alive bool 56 msgCnt int 57 } 58 59 func generateFilter(t *testing.T, symmetric bool) (*Filter, error) { 60 var f Filter 61 f.Messages = make(map[common.Hash]*ReceivedMessage) 62 63 const topicNum = 8 64 f.Topics = make([][]byte, topicNum) 65 for i := 0; i < topicNum; i++ { 66 f.Topics[i] = make([]byte, 4) 67 mrand.Read(f.Topics[i][:]) 68 f.Topics[i][0] = 0x01 69 } 70 71 key, err := crypto.GenerateKey() 72 if err != nil { 73 t.Fatalf("generateFilter 1 failed with seed %d.", seed) 74 return nil, err 75 } 76 f.Src = &key.PublicKey 77 78 if symmetric { 79 f.KeySym = make([]byte, aesKeyLength) 80 mrand.Read(f.KeySym) 81 f.SymKeyHash = crypto.Keccak256Hash(f.KeySym) 82 } else { 83 f.KeyAsym, err = crypto.GenerateKey() 84 if err != nil { 85 t.Fatalf("generateFilter 2 failed with seed %d.", seed) 86 return nil, err 87 } 88 } 89 90 // 91 return &f, nil 92 } 93 94 func generateTestCases(t *testing.T, SizeTestFilters int) []FilterTestCase { 95 cases := make([]FilterTestCase, SizeTestFilters) 96 for i := 0; i < SizeTestFilters; i++ { 97 f, _ := generateFilter(t, true) 98 cases[i].f = f 99 cases[i].alive = mrand.Int()&int(1) == 0 100 } 101 return cases 102 } 103 104 func TestInstallFilters(t *testing.T) { 105 InitSingleTest() 106 107 const SizeTestFilters = 256 108 w := New(&Config{}) 109 filters := NewFilters(w) 110 tst := generateTestCases(t, SizeTestFilters) 111 112 var err error 113 var j string 114 for i := 0; i < SizeTestFilters; i++ { 115 j, err = filters.Install(tst[i].f) 116 if err != nil { 117 t.Fatalf("seed %d: failed to install filter: %s", seed, err) 118 } 119 tst[i].id = j 120 if len(j) != keyIDSize*2 { 121 t.Fatalf("seed %d: wrong filter id size [%d]", seed, len(j)) 122 } 123 } 124 125 for _, testCase := range tst { 126 if !testCase.alive { 127 filters.Uninstall(testCase.id) 128 } 129 } 130 131 for i, testCase := range tst { 132 fil := filters.Get(testCase.id) 133 exist := fil != nil 134 if exist != testCase.alive { 135 t.Fatalf("seed %d: failed alive: %d, %v, %v", seed, i, exist, testCase.alive) 136 } 137 if exist && fil.PoW != testCase.f.PoW { 138 t.Fatalf("seed %d: failed Get: %d, %v, %v", seed, i, exist, testCase.alive) 139 } 140 } 141 } 142 143 func TestInstallSymKeyGeneratesHash(t *testing.T) { 144 InitSingleTest() 145 146 w := New(&Config{}) 147 filters := NewFilters(w) 148 filter, _ := generateFilter(t, true) 149 150 // 151 initialSymKeyHash := filter.SymKeyHash 152 153 // 154 var invalid common.Hash 155 filter.SymKeyHash = invalid 156 157 _, err := filters.Install(filter) 158 159 if err != nil { 160 t.Fatalf("Error installing the filter: %s", err) 161 } 162 163 for i, b := range filter.SymKeyHash { 164 if b != initialSymKeyHash[i] { 165 t.Fatalf("The filter's symmetric key hash was not properly generated by Install") 166 } 167 } 168 } 169 170 func TestInstallIdenticalFilters(t *testing.T) { 171 InitSingleTest() 172 173 w := New(&Config{}) 174 filters := NewFilters(w) 175 filter1, _ := generateFilter(t, true) 176 177 // 178 // 179 filter2 := &Filter{ 180 KeySym: filter1.KeySym, 181 Topics: filter1.Topics, 182 PoW: filter1.PoW, 183 AllowP2P: filter1.AllowP2P, 184 Messages: make(map[common.Hash]*ReceivedMessage), 185 } 186 187 _, err := filters.Install(filter1) 188 189 if err != nil { 190 t.Fatalf("Error installing the first filter with seed %d: %s", seed, err) 191 } 192 193 _, err = filters.Install(filter2) 194 195 if err != nil { 196 t.Fatalf("Error installing the second filter with seed %d: %s", seed, err) 197 } 198 199 params, err := generateMessageParams() 200 if err != nil { 201 t.Fatalf("Error generating message parameters with seed %d: %s", seed, err) 202 } 203 204 params.KeySym = filter1.KeySym 205 params.Topic = BytesToTopic(filter1.Topics[0]) 206 207 filter1.Src = ¶ms.Src.PublicKey 208 filter2.Src = ¶ms.Src.PublicKey 209 210 sentMessage, err := NewSentMessage(params) 211 if err != nil { 212 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 213 } 214 env, err := sentMessage.Wrap(params) 215 if err != nil { 216 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 217 } 218 msg := env.Open(filter1) 219 if msg == nil { 220 t.Fatalf("failed to Open with filter1") 221 } 222 223 if !filter1.MatchEnvelope(env) { 224 t.Fatalf("failed matching with the first filter") 225 } 226 227 if !filter2.MatchEnvelope(env) { 228 t.Fatalf("failed matching with the first filter") 229 } 230 231 if !filter1.MatchMessage(msg) { 232 t.Fatalf("failed matching with the second filter") 233 } 234 235 if !filter2.MatchMessage(msg) { 236 t.Fatalf("failed matching with the second filter") 237 } 238 } 239 240 func TestInstallFilterWithSymAndAsymKeys(t *testing.T) { 241 InitSingleTest() 242 243 w := New(&Config{}) 244 filters := NewFilters(w) 245 filter1, _ := generateFilter(t, true) 246 247 asymKey, err := crypto.GenerateKey() 248 if err != nil { 249 t.Fatalf("Unable to create asymetric keys: %v", err) 250 } 251 252 // 253 // 254 filter := &Filter{ 255 KeySym: filter1.KeySym, 256 KeyAsym: asymKey, 257 Topics: filter1.Topics, 258 PoW: filter1.PoW, 259 AllowP2P: filter1.AllowP2P, 260 Messages: make(map[common.Hash]*ReceivedMessage), 261 } 262 263 _, err = filters.Install(filter) 264 265 if err == nil { 266 t.Fatalf("Error detecting that a filter had both an asymmetric and symmetric key, with seed %d", seed) 267 } 268 } 269 270 func TestComparePubKey(t *testing.T) { 271 InitSingleTest() 272 273 key1, err := crypto.GenerateKey() 274 if err != nil { 275 t.Fatalf("failed to generate first key with seed %d: %s.", seed, err) 276 } 277 key2, err := crypto.GenerateKey() 278 if err != nil { 279 t.Fatalf("failed to generate second key with seed %d: %s.", seed, err) 280 } 281 if IsPubKeyEqual(&key1.PublicKey, &key2.PublicKey) { 282 t.Fatalf("public keys are equal, seed %d.", seed) 283 } 284 285 // 286 mrand.Seed(seed) 287 key3, err := crypto.GenerateKey() 288 if err != nil { 289 t.Fatalf("failed to generate third key with seed %d: %s.", seed, err) 290 } 291 if IsPubKeyEqual(&key1.PublicKey, &key3.PublicKey) { 292 t.Fatalf("key1 == key3, seed %d.", seed) 293 } 294 } 295 296 func TestMatchEnvelope(t *testing.T) { 297 InitSingleTest() 298 299 fsym, err := generateFilter(t, true) 300 if err != nil { 301 t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) 302 } 303 304 fasym, err := generateFilter(t, false) 305 if err != nil { 306 t.Fatalf("failed generateFilter() with seed %d: %s.", seed, err) 307 } 308 309 params, err := generateMessageParams() 310 if err != nil { 311 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 312 } 313 314 params.Topic[0] = 0xFF // 315 316 msg, err := NewSentMessage(params) 317 if err != nil { 318 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 319 } 320 env, err := msg.Wrap(params) 321 if err != nil { 322 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 323 } 324 325 // 326 i := mrand.Int() % 4 327 fsym.Topics[i] = params.Topic[:] 328 fasym.Topics[i] = params.Topic[:] 329 msg, err = NewSentMessage(params) 330 if err != nil { 331 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 332 } 333 env, err = msg.Wrap(params) 334 if err != nil { 335 t.Fatalf("failed Wrap() with seed %d: %s.", seed, err) 336 } 337 338 // 339 match := fsym.MatchEnvelope(env) 340 if !match { 341 t.Fatalf("failed MatchEnvelope() symmetric with seed %d.", seed) 342 } 343 344 // 345 fsym.PoW = env.PoW() + 1.0 346 match = fsym.MatchEnvelope(env) 347 if match { 348 t.Fatalf("failed MatchEnvelope(symmetric + matching topic + insufficient PoW) asymmetric with seed %d.", seed) 349 } 350 351 // 352 fsym.PoW = env.PoW() / 2 353 match = fsym.MatchEnvelope(env) 354 if !match { 355 t.Fatalf("failed MatchEnvelope(symmetric + matching topic + sufficient PoW) with seed %d.", seed) 356 } 357 358 // 359 prevTopics := fsym.Topics 360 fsym.Topics = nil 361 match = fsym.MatchEnvelope(env) 362 if !match { 363 t.Fatalf("failed MatchEnvelope(symmetric + topics are nil) with seed %d.", seed) 364 } 365 fsym.Topics = prevTopics 366 367 // 368 key, err := crypto.GenerateKey() 369 if err != nil { 370 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 371 } 372 params.KeySym = nil 373 params.Dst = &key.PublicKey 374 msg, err = NewSentMessage(params) 375 if err != nil { 376 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 377 } 378 env, err = msg.Wrap(params) 379 if err != nil { 380 t.Fatalf("failed Wrap() with seed %d: %s.", seed, err) 381 } 382 383 // 384 match = fsym.MatchEnvelope(env) 385 if match { 386 t.Fatalf("failed MatchEnvelope(encryption method mismatch) with seed %d.", seed) 387 } 388 389 // 390 match = fasym.MatchEnvelope(env) 391 if !match { 392 t.Fatalf("failed MatchEnvelope(asymmetric + mismatching topic) with seed %d.", seed) 393 } 394 395 // 396 fasym.Topics[i] = fasym.Topics[i+1] 397 match = fasym.MatchEnvelope(env) 398 if !match { 399 t.Fatalf("failed MatchEnvelope(asymmetric + matching topic) with seed %d.", seed) 400 } 401 402 // 403 fasym.Topics = nil 404 match = fasym.MatchEnvelope(env) 405 if !match { 406 t.Fatalf("failed MatchEnvelope(asymmetric + filter without topic) with seed %d.", seed) 407 } 408 409 // 410 fasym.PoW = env.PoW() + 1.0 411 match = fasym.MatchEnvelope(env) 412 if match { 413 t.Fatalf("failed MatchEnvelope(asymmetric + insufficient PoW) with seed %d.", seed) 414 } 415 416 // 417 fasym.PoW = env.PoW() / 2 418 match = fasym.MatchEnvelope(env) 419 if !match { 420 t.Fatalf("failed MatchEnvelope(asymmetric + sufficient PoW) with seed %d.", seed) 421 } 422 423 // 424 env.Topic = TopicType{} 425 match = fasym.MatchEnvelope(env) 426 if !match { 427 t.Fatalf("failed MatchEnvelope(filter without topic + envelope without topic) with seed %d.", seed) 428 } 429 430 // 431 fasym.Topics = fsym.Topics 432 match = fasym.MatchEnvelope(env) 433 if !match { 434 // 435 t.Fatalf("failed MatchEnvelope(filter without topic + envelope without topic) with seed %d.", seed) 436 } 437 } 438 439 func TestMatchMessageSym(t *testing.T) { 440 InitSingleTest() 441 442 params, err := generateMessageParams() 443 if err != nil { 444 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 445 } 446 447 f, err := generateFilter(t, true) 448 if err != nil { 449 t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) 450 } 451 452 const index = 1 453 params.KeySym = f.KeySym 454 params.Topic = BytesToTopic(f.Topics[index]) 455 456 sentMessage, err := NewSentMessage(params) 457 if err != nil { 458 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 459 } 460 env, err := sentMessage.Wrap(params) 461 if err != nil { 462 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 463 } 464 msg := env.Open(f) 465 if msg == nil { 466 t.Fatalf("failed Open with seed %d.", seed) 467 } 468 469 // 470 *f.Src.X = *params.Src.PublicKey.X 471 *f.Src.Y = *params.Src.PublicKey.Y 472 if !f.MatchMessage(msg) { 473 t.Fatalf("failed MatchEnvelope(src match) with seed %d.", seed) 474 } 475 476 // 477 f.PoW = msg.PoW + 1.0 478 if f.MatchMessage(msg) { 479 t.Fatalf("failed MatchEnvelope(insufficient PoW) with seed %d.", seed) 480 } 481 482 // 483 f.PoW = msg.PoW / 2 484 if !f.MatchMessage(msg) { 485 t.Fatalf("failed MatchEnvelope(sufficient PoW) with seed %d.", seed) 486 } 487 488 // 489 f.Topics[index][0]++ 490 if !f.MatchMessage(msg) { 491 // 492 t.Fatalf("failed MatchEnvelope(topic mismatch) with seed %d.", seed) 493 } 494 f.Topics[index][0]-- 495 496 // 497 f.SymKeyHash[0]++ 498 if f.MatchMessage(msg) { 499 t.Fatalf("failed MatchEnvelope(key mismatch) with seed %d.", seed) 500 } 501 f.SymKeyHash[0]-- 502 503 // 504 f.Src = nil 505 if !f.MatchMessage(msg) { 506 t.Fatalf("failed MatchEnvelope(src absent) with seed %d.", seed) 507 } 508 509 // 510 h := f.SymKeyHash 511 f.SymKeyHash = common.Hash{} 512 if f.MatchMessage(msg) { 513 t.Fatalf("failed MatchEnvelope(key hash mismatch) with seed %d.", seed) 514 } 515 f.SymKeyHash = h 516 if !f.MatchMessage(msg) { 517 t.Fatalf("failed MatchEnvelope(key hash match) with seed %d.", seed) 518 } 519 520 // 521 f.KeySym = nil 522 f.KeyAsym, err = crypto.GenerateKey() 523 if err != nil { 524 t.Fatalf("failed GenerateKey with seed %d: %s.", seed, err) 525 } 526 if f.MatchMessage(msg) { 527 t.Fatalf("failed MatchEnvelope(encryption method mismatch) with seed %d.", seed) 528 } 529 } 530 531 func TestMatchMessageAsym(t *testing.T) { 532 InitSingleTest() 533 534 f, err := generateFilter(t, false) 535 if err != nil { 536 t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) 537 } 538 539 params, err := generateMessageParams() 540 if err != nil { 541 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 542 } 543 544 const index = 1 545 params.Topic = BytesToTopic(f.Topics[index]) 546 params.Dst = &f.KeyAsym.PublicKey 547 keySymOrig := params.KeySym 548 params.KeySym = nil 549 550 sentMessage, err := NewSentMessage(params) 551 if err != nil { 552 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 553 } 554 env, err := sentMessage.Wrap(params) 555 if err != nil { 556 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 557 } 558 msg := env.Open(f) 559 if msg == nil { 560 t.Fatalf("failed to open with seed %d.", seed) 561 } 562 563 // 564 *f.Src.X = *params.Src.PublicKey.X 565 *f.Src.Y = *params.Src.PublicKey.Y 566 if !f.MatchMessage(msg) { 567 t.Fatalf("failed MatchMessage(src match) with seed %d.", seed) 568 } 569 570 // 571 f.PoW = msg.PoW + 1.0 572 if f.MatchMessage(msg) { 573 t.Fatalf("failed MatchEnvelope(insufficient PoW) with seed %d.", seed) 574 } 575 576 // 577 f.PoW = msg.PoW / 2 578 if !f.MatchMessage(msg) { 579 t.Fatalf("failed MatchEnvelope(sufficient PoW) with seed %d.", seed) 580 } 581 582 // 583 f.Topics[index][0]++ 584 if !f.MatchMessage(msg) { 585 // 586 t.Fatalf("failed MatchEnvelope(topic mismatch) with seed %d.", seed) 587 } 588 f.Topics[index][0]-- 589 590 // 591 prev := *f.KeyAsym.PublicKey.X 592 zero := *big.NewInt(0) 593 *f.KeyAsym.PublicKey.X = zero 594 if f.MatchMessage(msg) { 595 t.Fatalf("failed MatchEnvelope(key mismatch) with seed %d.", seed) 596 } 597 *f.KeyAsym.PublicKey.X = prev 598 599 // 600 f.Src = nil 601 if !f.MatchMessage(msg) { 602 t.Fatalf("failed MatchEnvelope(src absent) with seed %d.", seed) 603 } 604 605 // 606 f.KeySym = keySymOrig 607 f.KeyAsym = nil 608 if f.MatchMessage(msg) { 609 t.Fatalf("failed MatchEnvelope(encryption method mismatch) with seed %d.", seed) 610 } 611 } 612 613 func cloneFilter(orig *Filter) *Filter { 614 var clone Filter 615 clone.Messages = make(map[common.Hash]*ReceivedMessage) 616 clone.Src = orig.Src 617 clone.KeyAsym = orig.KeyAsym 618 clone.KeySym = orig.KeySym 619 clone.Topics = orig.Topics 620 clone.PoW = orig.PoW 621 clone.AllowP2P = orig.AllowP2P 622 clone.SymKeyHash = orig.SymKeyHash 623 return &clone 624 } 625 626 func generateCompatibeEnvelope(t *testing.T, f *Filter) *Envelope { 627 params, err := generateMessageParams() 628 if err != nil { 629 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 630 return nil 631 } 632 633 params.KeySym = f.KeySym 634 params.Topic = BytesToTopic(f.Topics[2]) 635 sentMessage, err := NewSentMessage(params) 636 if err != nil { 637 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 638 } 639 env, err := sentMessage.Wrap(params) 640 if err != nil { 641 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 642 return nil 643 } 644 return env 645 } 646 647 func TestWatchers(t *testing.T) { 648 InitSingleTest() 649 650 const NumFilters = 16 651 const NumMessages = 256 652 var i int 653 var j uint32 654 var e *Envelope 655 var x, firstID string 656 var err error 657 658 w := New(&Config{}) 659 filters := NewFilters(w) 660 tst := generateTestCases(t, NumFilters) 661 for i = 0; i < NumFilters; i++ { 662 tst[i].f.Src = nil 663 x, err = filters.Install(tst[i].f) 664 if err != nil { 665 t.Fatalf("failed to install filter with seed %d: %s.", seed, err) 666 } 667 tst[i].id = x 668 if len(firstID) == 0 { 669 firstID = x 670 } 671 } 672 673 lastID := x 674 675 var envelopes [NumMessages]*Envelope 676 for i = 0; i < NumMessages; i++ { 677 j = mrand.Uint32() % NumFilters 678 e = generateCompatibeEnvelope(t, tst[j].f) 679 envelopes[i] = e 680 tst[j].msgCnt++ 681 } 682 683 for i = 0; i < NumMessages; i++ { 684 filters.NotifyWatchers(envelopes[i], false) 685 } 686 687 var total int 688 var mail []*ReceivedMessage 689 var count [NumFilters]int 690 691 for i = 0; i < NumFilters; i++ { 692 mail = tst[i].f.Retrieve() 693 count[i] = len(mail) 694 total += len(mail) 695 } 696 697 if total != NumMessages { 698 t.Fatalf("failed with seed %d: total = %d, want: %d.", seed, total, NumMessages) 699 } 700 701 for i = 0; i < NumFilters; i++ { 702 mail = tst[i].f.Retrieve() 703 if len(mail) != 0 { 704 t.Fatalf("failed with seed %d: i = %d.", seed, i) 705 } 706 707 if tst[i].msgCnt != count[i] { 708 t.Fatalf("failed with seed %d: count[%d]: get %d, want %d.", seed, i, tst[i].msgCnt, count[i]) 709 } 710 } 711 712 // 713 714 clone := cloneFilter(tst[0].f) 715 filters.Uninstall(lastID) 716 total = 0 717 last := NumFilters - 1 718 tst[last].f = clone 719 filters.Install(clone) 720 for i = 0; i < NumFilters; i++ { 721 tst[i].msgCnt = 0 722 count[i] = 0 723 } 724 725 // 726 e = generateCompatibeEnvelope(t, tst[0].f) 727 envelopes[0] = e 728 tst[0].msgCnt++ 729 for i = 1; i < NumMessages; i++ { 730 j = mrand.Uint32() % NumFilters 731 e = generateCompatibeEnvelope(t, tst[j].f) 732 envelopes[i] = e 733 tst[j].msgCnt++ 734 } 735 736 for i = 0; i < NumMessages; i++ { 737 filters.NotifyWatchers(envelopes[i], false) 738 } 739 740 for i = 0; i < NumFilters; i++ { 741 mail = tst[i].f.Retrieve() 742 count[i] = len(mail) 743 total += len(mail) 744 } 745 746 combined := tst[0].msgCnt + tst[last].msgCnt 747 if total != NumMessages+count[0] { 748 t.Fatalf("failed with seed %d: total = %d, count[0] = %d.", seed, total, count[0]) 749 } 750 751 if combined != count[0] { 752 t.Fatalf("failed with seed %d: combined = %d, count[0] = %d.", seed, combined, count[0]) 753 } 754 755 if combined != count[last] { 756 t.Fatalf("failed with seed %d: combined = %d, count[last] = %d.", seed, combined, count[last]) 757 } 758 759 for i = 1; i < NumFilters-1; i++ { 760 mail = tst[i].f.Retrieve() 761 if len(mail) != 0 { 762 t.Fatalf("failed with seed %d: i = %d.", seed, i) 763 } 764 765 if tst[i].msgCnt != count[i] { 766 t.Fatalf("failed with seed %d: i = %d, get %d, want %d.", seed, i, tst[i].msgCnt, count[i]) 767 } 768 } 769 770 // 771 772 total = 0 773 filters.NotifyWatchers(envelopes[0], true) 774 775 for i = 0; i < NumFilters; i++ { 776 mail = tst[i].f.Retrieve() 777 total += len(mail) 778 } 779 780 if total != 0 { 781 t.Fatalf("failed with seed %d: total: got %d, want 0.", seed, total) 782 } 783 784 f := filters.Get(firstID) 785 if f == nil { 786 t.Fatalf("failed to get the filter with seed %d.", seed) 787 } 788 f.AllowP2P = true 789 total = 0 790 filters.NotifyWatchers(envelopes[0], true) 791 792 for i = 0; i < NumFilters; i++ { 793 mail = tst[i].f.Retrieve() 794 total += len(mail) 795 } 796 797 if total != 1 { 798 t.Fatalf("failed with seed %d: total: got %d, want 1.", seed, total) 799 } 800 } 801 802 func TestVariableTopics(t *testing.T) { 803 InitSingleTest() 804 805 const lastTopicByte = 3 806 var match bool 807 params, err := generateMessageParams() 808 if err != nil { 809 t.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err) 810 } 811 msg, err := NewSentMessage(params) 812 if err != nil { 813 t.Fatalf("failed to create new message with seed %d: %s.", seed, err) 814 } 815 env, err := msg.Wrap(params) 816 if err != nil { 817 t.Fatalf("failed Wrap with seed %d: %s.", seed, err) 818 } 819 820 f, err := generateFilter(t, true) 821 if err != nil { 822 t.Fatalf("failed generateFilter with seed %d: %s.", seed, err) 823 } 824 825 for i := 0; i < 4; i++ { 826 env.Topic = BytesToTopic(f.Topics[i]) 827 match = f.MatchEnvelope(env) 828 if !match { 829 t.Fatalf("failed MatchEnvelope symmetric with seed %d, step %d.", seed, i) 830 } 831 832 f.Topics[i][lastTopicByte]++ 833 match = f.MatchEnvelope(env) 834 if !match { 835 // 836 t.Fatalf("MatchEnvelope symmetric with seed %d, step %d.", seed, i) 837 } 838 } 839 }