github.com/oskarth/go-ethereum@v1.6.8-0.20191013093314-dac24a9d3494/whisper/whisperv5/whisper_test.go (about)

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