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 = &params.Src.PublicKey
   196  	filter2.Src = &params.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