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