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