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