Fix TestJailWhisper e2e test (#442)

We have a test called TestJailWhisper that checks various Whisper communication scenarios (like sending a message signed with a symmetric key, asymmetric keys etc.). However, it was written in a bit cryptic way, so I also refactored it.

Important changes:
* Cleaner way of importing keys using AddKeyPair() method in the test suite,
* Removed TestEncryptedAnonymousMessage because it is not needed anymore as "test 4" in TestJailWhisper was fixed,
* Bumped PoW to 2.0. 0.01 used by status-react makes this test flaky.
This commit is contained in:
Adam Babik 2017-11-06 17:04:45 +01:00 committed by Ivan Tomilov
parent c6e98b948b
commit fb75054a35
2 changed files with 96 additions and 174 deletions

View File

@ -1,14 +1,9 @@
package whisper
import (
"context"
"crypto/rand"
"errors"
"testing"
"time"
"github.com/ethereum/go-ethereum/accounts/keystore"
gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
whisper "github.com/ethereum/go-ethereum/whisper/whisperv5"
"github.com/status-im/status-go/e2e"
@ -32,9 +27,7 @@ var (
)
func TestWhisperJailTestSuite(t *testing.T) {
s := new(WhisperJailTestSuite)
s.Timeout = time.Minute * 5
suite.Run(t, s)
suite.Run(t, new(WhisperJailTestSuite))
}
type WhisperJailTestSuite struct {
@ -48,46 +41,33 @@ type WhisperJailTestSuite struct {
func (s *WhisperJailTestSuite) StartTestBackend(opts ...e2e.TestNodeOption) {
s.BackendTestSuite.StartTestBackend(opts...)
s.Timeout = time.Minute * 5
s.WhisperAPI = whisper.NewPublicWhisperAPI(s.WhisperService())
s.Jail = s.Backend.JailManager()
s.NotNil(s.Jail)
s.Jail.BaseJS(baseStatusJSCode)
}
func (s *WhisperJailTestSuite) GetAccountKey(account struct {
Address string
Password string
}) (*keystore.Key, string, error) {
func (s *WhisperJailTestSuite) AddKeyPair(address, password string) (string, error) {
accountManager := s.Backend.AccountManager()
_, accountKey1, err := accountManager.AddressToDecryptedAccount(account.Address, account.Password)
_, accountKey, err := accountManager.AddressToDecryptedAccount(address, password)
if err != nil {
return nil, "", err
}
accountKey1Hex := gethcommon.ToHex(crypto.FromECDSAPub(&accountKey1.PrivateKey.PublicKey))
_, err = s.WhisperService().AddKeyPair(accountKey1.PrivateKey)
if err != nil {
return nil, "", err
return "", err
}
if ok := s.WhisperAPI.HasKeyPair(context.Background(), accountKey1Hex); !ok {
return nil, "", errors.New("KeyPair should be injected in Whisper")
}
return accountKey1, accountKey1Hex, nil
return s.WhisperService().AddKeyPair(accountKey.PrivateKey)
}
// TODO(adamb) Uncomment when issue #336 is fixed.
/*
func (s *WhisperJailTestSuite) DontTestJailWhisper() {
func (s *WhisperJailTestSuite) TestJailWhisper() {
s.StartTestBackend()
defer s.StopTestBackend()
_, accountKey1Hex, err := s.GetAccountKey(TestConfig.Account1)
keyPairID1, err := s.AddKeyPair(TestConfig.Account1.Address, TestConfig.Account1.Password)
s.NoError(err)
_, accountKey2Hex, err := s.GetAccountKey(TestConfig.Account2)
keyPairID2, err := s.AddKeyPair(TestConfig.Account2.Address, TestConfig.Account2.Password)
s.NoError(err)
testCases := []struct {
@ -108,14 +88,14 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
{
"test 1: encrypted signed message from us (From != nil && To != nil)",
`
var identity1 = '` + accountKey1Hex + `';
var identity1 = '` + keyPairID1 + `';
if (!shh.hasKeyPair(identity1)) {
throw 'idenitity "` + accountKey1Hex + `" not found in whisper';
throw 'identity "` + keyPairID1 + `" not found in whisper';
}
var identity2 = '` + accountKey2Hex + `';
var identity2 = '` + keyPairID2 + `';
if (!shh.hasKeyPair(identity2)) {
throw 'identitity "` + accountKey2Hex + `" not found in whisper';
throw 'identitity "` + keyPairID2 + `" not found in whisper';
}
var topic = makeTopic();
@ -123,19 +103,19 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
// start watching for messages
var filter = shh.newMessageFilter({
sig: identity1,
sig: shh.getPublicKey(identity1),
privateKeyID: identity2,
topics: [topic]
});
// post message
var message = {
ttl: 20,
powTarget: 0.01,
ttl: 10,
powTarget: 1.0,
powTime: 20,
topic: topic,
sig: identity1,
pubKey: identity2,
sig: shh.getPublicKey(identity1),
pubKey: shh.getPublicKey(identity2),
payload: web3.toHex(payload),
};
@ -149,9 +129,9 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
{
"test 2: signed (known sender) broadcast (From != nil && To == nil)",
`
var identity = '` + accountKey1Hex + `';
var identity = '` + keyPairID1 + `';
if (!shh.hasKeyPair(identity)) {
throw 'idenitity "` + accountKey1Hex + `" not found in whisper';
throw 'identity "` + keyPairID1 + `" not found in whisper';
}
var topic = makeTopic();
@ -165,18 +145,18 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
// start watching for messages
var filter = shh.newMessageFilter({
sig: identity,
sig: shh.getPublicKey(identity),
topics: [topic],
symKeyID: keyid
});
// post message
var message = {
ttl: 20,
powTarget: 0.01,
ttl: 10,
powTarget: 1.0,
powTime: 20,
topic: topic,
sig: identity,
sig: shh.getPublicKey(identity),
symKeyID: keyid,
payload: web3.toHex(payload),
};
@ -208,8 +188,8 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
// post message
var message = {
ttl: 20,
powTarget: 0.01,
ttl: 10,
powTarget: 1.0,
powTime: 20,
topic: topic,
symKeyID: keyid,
@ -223,71 +203,69 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
`,
true,
},
// @TODO(adam): quarantined as always failing. Check out TestEncryptedAnonymousMessage
// as an equivalent test in pure Go which passes. Bug in web3?
// {
// "test 4: encrypted anonymous message (From == nil && To != nil)",
// `
// var identity = '` + accountKey2Hex + `';
// if (!shh.hasKeyPair(identity)) {
// throw 'idenitity "` + accountKey2Hex + `" not found in whisper';
// }
{
"test 4: encrypted anonymous message (From == nil && To != nil)",
`
var identity = '` + keyPairID1 + `';
if (!shh.hasKeyPair(identity)) {
throw 'identity "` + keyPairID1 + `" not found in whisper';
}
// var topic = makeTopic();
// var payload = '` + whisperMessage4 + `';
var topic = makeTopic();
var payload = '` + whisperMessage4 + `';
// // start watching for messages
// var filter = shh.newMessageFilter({
// privateKeyID: identity,
// topics: [topic],
// });
// start watching for messages
var filter = shh.newMessageFilter({
privateKeyID: identity,
topics: [topic],
});
// // post message
// var message = {
// ttl: 20,
// powTarget: 0.01,
// powTime: 20,
// topic: topic,
// pubKey: identity,
// payload: web3.toHex(payload),
// };
// post message
var message = {
ttl: 20,
powTarget: 0.01,
powTime: 20,
topic: topic,
pubKey: shh.getPublicKey(identity),
payload: web3.toHex(payload),
};
// var sent = shh.post(message)
// if (!sent) {
// throw 'message not sent: ' + JSON.stringify(message);
// }
// `,
// true,
// },
var sent = shh.post(message)
if (!sent) {
throw 'message not sent: ' + JSON.stringify(message);
}
`,
true,
},
{
"test 5: encrypted signed response to us (From != nil && To != nil)",
`
var identity1 = '` + accountKey1Hex + `';
var identity1 = '` + keyPairID1 + `';
if (!shh.hasKeyPair(identity1)) {
throw 'idenitity "` + accountKey1Hex + `" not found in whisper';
throw 'identity "` + keyPairID1 + `" not found in whisper';
}
var identity2 = '` + accountKey2Hex + `';
var identity2 = '` + keyPairID2 + `';
if (!shh.hasKeyPair(identity2)) {
throw 'idenitity "` + accountKey2Hex + `" not found in whisper';
throw 'identity "` + keyPairID2 + `" not found in whisper';
}
var topic = makeTopic();
var payload = '` + whisperMessage5 + `';
// start watching for messages
var filter = shh.newMessageFilter({
privateKeyID: identity1,
sig: identity2,
sig: shh.getPublicKey(identity2),
topics: [topic],
});
// post message
var message = {
sig: identity2,
pubKey: identity1,
topic: topic,
payload: web3.toHex(payload),
ttl: 20,
ttl: 10,
powTarget: 1.0,
powTime: 20,
powTarget: 0.01,
sig: shh.getPublicKey(identity2),
pubKey: shh.getPublicKey(identity1),
topic: topic,
payload: web3.toHex(payload)
};
var sent = shh.post(message)
@ -299,27 +277,26 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
},
}
makeTopicCode := `
var shh = web3.shh;
// topic must be 4-byte long
var makeTopic = function () {
var topic = '0x';
for (var i = 0; i < 8; i++) {
topic += Math.floor(Math.random() * 16).toString(16);
}
return topic;
};
`
for _, tc := range testCases {
s.T().Log(tc.name)
chatID := crypto.Keccak256Hash([]byte(tc.name)).Hex()
s.Jail.Parse(chatID, `
var shh = web3.shh;
// topic must be 4-byte long
var makeTopic = function () {
var topic = '0x';
for (var i = 0; i < 8; i++) {
topic += Math.floor(Math.random() * 16).toString(16);
}
return topic;
};
`)
s.Jail.Parse(chatID, makeTopicCode)
cell, err := s.Jail.Cell(chatID)
s.NoError(err, "cannot get VM")
// Setup filters and post messages.
// Run JS code that setups filters and sends messages.
_, err = cell.Run(tc.code)
s.NoError(err)
@ -337,24 +314,27 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
}
}()
// Use polling because:
// (1) filterId is not assigned immediately,
// (2) messages propagate with some delay.
poll_loop:
for {
// Use polling because:
// (1) filterId is not assigned immediately,
// (2) messages propagate with some delay.
filter, err := cell.Get("filter")
s.NoError(err, "cannot get filter")
filterID, err := filter.Object().Get("filterId")
s.NoError(err, "cannot get filterId")
select {
case <-done:
ok, err := s.WhisperAPI.DeleteMessageFilter(filterID.String())
s.NoError(err)
s.True(ok)
break poll_loop
case <-timedOut:
s.FailNow("polling for messages timed out")
case <-time.After(time.Second):
}
filter, err := cell.Get("filter")
s.NoError(err, "cannot get filter")
filterID, err := filter.Object().Get("filterId")
s.NoError(err, "cannot get filterId")
// FilterID is not assigned yet.
if filterID.IsNull() {
continue
@ -365,6 +345,7 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
messages, err := s.WhisperAPI.GetFilterMessages(filterID.String())
s.NoError(err)
for _, m := range messages {
s.Equal(payload.String(), string(m.Payload))
close(done)
@ -372,62 +353,3 @@ func (s *WhisperJailTestSuite) DontTestJailWhisper() {
}
}
}
*/
func (s *WhisperJailTestSuite) TestEncryptedAnonymousMessage() {
s.StartTestBackend()
defer s.StopTestBackend()
accountKey2, accountKey2Hex, err := s.GetAccountKey(TestConfig.Account2)
s.NoError(err)
topicSlice := make([]byte, whisper.TopicLength)
_, err = rand.Read(topicSlice)
s.NoError(err)
topic := whisper.BytesToTopic(topicSlice)
filter, err := s.WhisperAPI.NewMessageFilter(whisper.Criteria{
PrivateKeyID: accountKey2Hex,
Topics: []whisper.TopicType{topic},
})
s.NoError(err)
ok, err := s.WhisperAPI.Post(context.Background(), whisper.NewMessage{
TTL: 20,
PowTarget: 0.01,
PowTime: 20,
Topic: topic,
PublicKey: crypto.FromECDSAPub(&accountKey2.PrivateKey.PublicKey),
Payload: []byte(whisperMessage4),
})
s.NoError(err)
s.True(ok)
done := make(chan struct{})
timedOut := make(chan struct{})
go func() {
select {
case <-done:
case <-time.After(s.Timeout):
close(timedOut)
}
}()
for {
select {
case <-done:
return
case <-timedOut:
s.FailNow("polling for messages timed out")
case <-time.After(time.Second):
}
messages, err := s.WhisperAPI.GetFilterMessages(filter)
s.NoError(err)
for _, m := range messages {
s.Equal(whisperMessage4, string(m.Payload))
close(done)
}
}
}