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