Add tests for sendBundle and fix flaky tests
This commit is contained in:
parent
299b3fc093
commit
0e27e464d3
|
@ -303,8 +303,8 @@ func (s *WakuNodeMockSuite) SetupTest() {
|
||||||
pkey, err := crypto.GenerateKey()
|
pkey, err := crypto.GenerateKey()
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
node := enode.NewV4(&pkey.PublicKey, net.ParseIP("127.0.0.1"), 1, 1)
|
node := enode.NewV4(&pkey.PublicKey, net.ParseIP("127.0.0.1"), 1, 1)
|
||||||
peer := p2p.NewPeer(node.ID(), "1", []p2p.Cap{{"shh", 6}})
|
|
||||||
rw1, rw2 := p2p.MsgPipe()
|
rw1, rw2 := p2p.MsgPipe()
|
||||||
|
peer := v0.NewPeer(w, p2p.NewPeer(node.ID(), "1", []p2p.Cap{{"shh", 6}}), rw2, nil)
|
||||||
go func() {
|
go func() {
|
||||||
err := w.HandlePeer(peer, rw2)
|
err := w.HandlePeer(peer, rw2)
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
gethcommon "github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/status-im/status-go/waku/common"
|
"github.com/status-im/status-go/waku/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -40,3 +41,29 @@ func TestEncodeDecodeVersionedResponse(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, response.Response.Hash, v1resp.Hash)
|
require.Equal(t, response.Response.Hash, v1resp.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSendBundle(t *testing.T) {
|
||||||
|
rw1, rw2 := p2p.MsgPipe()
|
||||||
|
defer func() { handleError(t, rw1.Close()) }()
|
||||||
|
defer func() { handleError(t, rw2.Close()) }()
|
||||||
|
envelopes := []*common.Envelope{{
|
||||||
|
Expiry: 0,
|
||||||
|
TTL: 30,
|
||||||
|
Topic: common.TopicType{1},
|
||||||
|
Data: []byte{1, 1, 1},
|
||||||
|
}}
|
||||||
|
|
||||||
|
errc := make(chan error)
|
||||||
|
go func() {
|
||||||
|
_, err := sendBundle(rw1, envelopes)
|
||||||
|
errc <- err
|
||||||
|
}()
|
||||||
|
require.NoError(t, p2p.ExpectMsg(rw2, messagesCode, envelopes))
|
||||||
|
require.NoError(t, <-errc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleError(t *testing.T, err error) {
|
||||||
|
if err != nil {
|
||||||
|
t.Logf("deferred function error: '%s'", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -19,11 +19,25 @@
|
||||||
package v0
|
package v0
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
mrand "math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
|
|
||||||
"github.com/status-im/status-go/waku/common"
|
"github.com/status-im/status-go/waku/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var seed int64
|
||||||
|
|
||||||
|
// initSingleTest should be called in the beginning of every
|
||||||
|
// test, which uses RNG, in order to make the tests
|
||||||
|
// reproduciblity independent of their sequence.
|
||||||
|
func initSingleTest() {
|
||||||
|
seed = time.Now().Unix()
|
||||||
|
mrand.Seed(seed)
|
||||||
|
}
|
||||||
|
|
||||||
var sharedTopic = common.TopicType{0xF, 0x1, 0x2, 0}
|
var sharedTopic = common.TopicType{0xF, 0x1, 0x2, 0}
|
||||||
var wrongTopic = common.TopicType{0, 0, 0, 0}
|
var wrongTopic = common.TopicType{0, 0, 0, 0}
|
||||||
|
|
||||||
|
@ -58,3 +72,54 @@ func TestTopicOrBloomMatchFullNode(t *testing.T) {
|
||||||
t.Fatal("envelope should not match")
|
t.Fatal("envelope should not match")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPeerBasic(t *testing.T) {
|
||||||
|
initSingleTest()
|
||||||
|
|
||||||
|
params, err := generateMessageParams()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed generateMessageParams with seed %d.", seed)
|
||||||
|
}
|
||||||
|
|
||||||
|
params.PoW = 0.001
|
||||||
|
msg, err := common.NewSentMessage(params)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to create new message with seed %d: %s.", seed, err)
|
||||||
|
}
|
||||||
|
env, err := msg.Wrap(params, time.Now())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed Wrap with seed %d.", seed)
|
||||||
|
}
|
||||||
|
|
||||||
|
p := NewPeer(nil, nil, nil, nil)
|
||||||
|
p.Mark(env)
|
||||||
|
if !p.Marked(env) {
|
||||||
|
t.Fatalf("failed mark with seed %d.", seed)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateMessageParams() (*common.MessageParams, error) {
|
||||||
|
// set all the parameters except p.Dst and p.Padding
|
||||||
|
|
||||||
|
buf := make([]byte, 4)
|
||||||
|
mrand.Read(buf) // nolint: gosec
|
||||||
|
sz := mrand.Intn(400)
|
||||||
|
|
||||||
|
var p common.MessageParams
|
||||||
|
p.PoW = 0.01
|
||||||
|
p.WorkTime = 1
|
||||||
|
p.TTL = uint32(mrand.Intn(1024))
|
||||||
|
p.Payload = make([]byte, sz)
|
||||||
|
p.KeySym = make([]byte, common.AESKeyLength)
|
||||||
|
mrand.Read(p.Payload) // nolint: gosec
|
||||||
|
mrand.Read(p.KeySym) // nolint: gosec
|
||||||
|
p.Topic = common.BytesToTopic(buf)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
p.Src, err = crypto.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &p, nil
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
gethcommon "github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
"github.com/ethereum/go-ethereum/rlp"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/p2p"
|
||||||
"github.com/status-im/status-go/waku/common"
|
"github.com/status-im/status-go/waku/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -40,3 +41,29 @@ func TestEncodeDecodeVersionedResponse(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, response.Response.Hash, v1resp.Hash)
|
require.Equal(t, response.Response.Hash, v1resp.Hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSendBundle(t *testing.T) {
|
||||||
|
rw1, rw2 := p2p.MsgPipe()
|
||||||
|
defer func() { handleError(t, rw1.Close()) }()
|
||||||
|
defer func() { handleError(t, rw2.Close()) }()
|
||||||
|
envelopes := []*common.Envelope{{
|
||||||
|
Expiry: 0,
|
||||||
|
TTL: 30,
|
||||||
|
Topic: common.TopicType{1},
|
||||||
|
Data: []byte{1, 1, 1},
|
||||||
|
}}
|
||||||
|
|
||||||
|
errc := make(chan error)
|
||||||
|
go func() {
|
||||||
|
_, err := sendBundle(rw1, envelopes)
|
||||||
|
errc <- err
|
||||||
|
}()
|
||||||
|
require.NoError(t, p2p.ExpectMsg(rw2, messagesCode, envelopes))
|
||||||
|
require.NoError(t, <-errc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleError(t *testing.T, err error) {
|
||||||
|
if err != nil {
|
||||||
|
t.Logf("deferred function error: '%s'", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -98,17 +98,14 @@ func (s *WakuTestSuite) TestHandleP2PMessageCode() {
|
||||||
rw1, rw2 := p2p.MsgPipe()
|
rw1, rw2 := p2p.MsgPipe()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
// This will eventually error as we disconnect one the peers
|
s.Require().Error(w1.HandlePeer(s.newPeer(w1, p2p.NewPeer(enode.ID{}, "test", []p2p.Cap{}), rw1, nil), rw1))
|
||||||
handleError(s.T(), w1.HandlePeer(s.newPeer(w1, p2p.NewPeer(enode.ID{}, "test", []p2p.Cap{}), rw1, nil), rw1))
|
|
||||||
}()
|
|
||||||
go func() {
|
|
||||||
select {
|
|
||||||
case <-time.After(time.Second * 5):
|
|
||||||
handleError(s.T(), rw1.Close())
|
|
||||||
handleError(s.T(), rw2.Close())
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
timer := time.AfterFunc(time.Second*5, func() {
|
||||||
|
handleError(s.T(), rw1.Close())
|
||||||
|
handleError(s.T(), rw2.Close())
|
||||||
|
})
|
||||||
|
|
||||||
peer1 := s.newPeer(w2, p2p.NewPeer(enode.ID{}, "test", []p2p.Cap{}), rw2, nil)
|
peer1 := s.newPeer(w2, p2p.NewPeer(enode.ID{}, "test", []p2p.Cap{}), rw2, nil)
|
||||||
peer1.SetPeerTrusted(true)
|
peer1.SetPeerTrusted(true)
|
||||||
|
|
||||||
|
@ -122,6 +119,9 @@ func (s *WakuTestSuite) TestHandleP2PMessageCode() {
|
||||||
e := <-envelopeEvents
|
e := <-envelopeEvents
|
||||||
s.Require().Equal(e.Hash, env.Hash(), "envelopes not equal")
|
s.Require().Equal(e.Hash, env.Hash(), "envelopes not equal")
|
||||||
peer1.Stop()
|
peer1.Stop()
|
||||||
|
s.Require().NoError(rw1.Close())
|
||||||
|
s.Require().NoError(rw2.Close())
|
||||||
|
timer.Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WakuTestSuite) testConfirmationsHandshake(expectConfirmations bool) {
|
func (s *WakuTestSuite) testConfirmationsHandshake(expectConfirmations bool) {
|
||||||
|
@ -134,7 +134,7 @@ func (s *WakuTestSuite) testConfirmationsHandshake(expectConfirmations bool) {
|
||||||
rw1, rw2 := p2p.MsgPipe()
|
rw1, rw2 := p2p.MsgPipe()
|
||||||
|
|
||||||
// so that actual read won't hang forever
|
// so that actual read won't hang forever
|
||||||
time.AfterFunc(5*time.Second, func() {
|
timer := time.AfterFunc(5*time.Second, func() {
|
||||||
handleError(s.T(), rw1.Close())
|
handleError(s.T(), rw1.Close())
|
||||||
handleError(s.T(), rw2.Close())
|
handleError(s.T(), rw2.Close())
|
||||||
})
|
})
|
||||||
|
@ -142,7 +142,8 @@ func (s *WakuTestSuite) testConfirmationsHandshake(expectConfirmations bool) {
|
||||||
p1 := s.newPeer(w1, p2p.NewPeer(enode.ID{1}, "1", []p2p.Cap{{"waku", 1}}), rw1, nil)
|
p1 := s.newPeer(w1, p2p.NewPeer(enode.ID{1}, "1", []p2p.Cap{{"waku", 1}}), rw1, nil)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
handleError(s.T(), w1.HandlePeer(p1, rw1))
|
// This will always fail eventually as we close the channels
|
||||||
|
s.Require().Error(w1.HandlePeer(p1, rw1))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
p2 := s.newPeer(w2, p2p.NewPeer(enode.ID{}, "test-2", []p2p.Cap{}), rw2, nil)
|
p2 := s.newPeer(w2, p2p.NewPeer(enode.ID{}, "test-2", []p2p.Cap{}), rw2, nil)
|
||||||
|
@ -151,9 +152,12 @@ func (s *WakuTestSuite) testConfirmationsHandshake(expectConfirmations bool) {
|
||||||
peers := w1.getPeers()
|
peers := w1.getPeers()
|
||||||
s.Require().Len(peers, 1)
|
s.Require().Len(peers, 1)
|
||||||
s.Require().Equal(expectConfirmations, peers[0].ConfirmationsEnabled())
|
s.Require().Equal(expectConfirmations, peers[0].ConfirmationsEnabled())
|
||||||
|
timer.Stop()
|
||||||
|
s.Require().NoError(rw1.Close())
|
||||||
|
s.Require().NoError(rw2.Close())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WakuTestSuite) TestConfirmationHadnshakeExtension() {
|
func (s *WakuTestSuite) TestConfirmationHandshakeExtension() {
|
||||||
s.testConfirmationsHandshake(true)
|
s.testConfirmationsHandshake(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +165,6 @@ func (s *WakuTestSuite) TestHandshakeWithConfirmationsDisabled() {
|
||||||
s.testConfirmationsHandshake(false)
|
s.testConfirmationsHandshake(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FLAKY
|
|
||||||
func (s *WakuTestSuite) TestMessagesResponseWithError() {
|
func (s *WakuTestSuite) TestMessagesResponseWithError() {
|
||||||
conf := &Config{
|
conf := &Config{
|
||||||
MinimumAcceptedPoW: 0,
|
MinimumAcceptedPoW: 0,
|
||||||
|
@ -198,7 +201,7 @@ func (s *WakuTestSuite) TestMessagesResponseWithError() {
|
||||||
Nonce: 1,
|
Nonce: 1,
|
||||||
}
|
}
|
||||||
normal := common.Envelope{
|
normal := common.Envelope{
|
||||||
Expiry: uint32(time.Now().Unix()),
|
Expiry: uint32(time.Now().Unix()) + 5,
|
||||||
TTL: 10,
|
TTL: 10,
|
||||||
Topic: common.TopicType{1},
|
Topic: common.TopicType{1},
|
||||||
Data: make([]byte, 1<<10),
|
Data: make([]byte, 1<<10),
|
||||||
|
@ -255,7 +258,7 @@ func (s *WakuTestSuite) testConfirmationEvents(envelope common.Envelope, envelop
|
||||||
errorc <- err
|
errorc <- err
|
||||||
}()
|
}()
|
||||||
|
|
||||||
time.AfterFunc(5*time.Second, func() {
|
timer := time.AfterFunc(5*time.Second, func() {
|
||||||
if err := rw1.Close(); err != nil {
|
if err := rw1.Close(); err != nil {
|
||||||
s.T().Errorf("error closing MsgPipe 1, '%s'", err)
|
s.T().Errorf("error closing MsgPipe 1, '%s'", err)
|
||||||
}
|
}
|
||||||
|
@ -275,30 +278,39 @@ func (s *WakuTestSuite) testConfirmationEvents(envelope common.Envelope, envelop
|
||||||
errorc <- err
|
errorc <- err
|
||||||
}()
|
}()
|
||||||
|
|
||||||
s.Require().NoError(w1.Send(&envelope))
|
w1.addEnvelope(&envelope)
|
||||||
|
|
||||||
var hash gethcommon.Hash
|
var e1, e2 *common.EnvelopeEvent
|
||||||
select {
|
var count int
|
||||||
case err := <-errorc:
|
for count < 2 {
|
||||||
s.Require().NoError(err)
|
select {
|
||||||
case ev := <-events:
|
case ev := <-events:
|
||||||
switch ev.Event {
|
switch ev.Event {
|
||||||
case common.EventEnvelopeSent:
|
case common.EventEnvelopeSent:
|
||||||
s.Require().Equal(p1.EnodeID(), ev.Peer)
|
if e1 == nil {
|
||||||
s.Require().NotEqual(gethcommon.Hash{}, ev.Batch)
|
e1 = &ev
|
||||||
hash = ev.Batch
|
count++
|
||||||
case common.EventBatchAcknowledged:
|
}
|
||||||
s.Require().Equal(p1.EnodeID(), ev.Peer)
|
case common.EventBatchAcknowledged:
|
||||||
s.Require().Equal(hash, ev.Batch)
|
if e2 == nil {
|
||||||
s.Require().Equal(envelopeErrors, ev.Data)
|
e2 = &ev
|
||||||
default:
|
count++
|
||||||
s.Require().FailNow("invalid event message", ev.Event)
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
case <-time.After(5 * time.Second):
|
||||||
|
s.Require().FailNow("timed out waiting for an envelope.sent event")
|
||||||
}
|
}
|
||||||
|
|
||||||
case <-time.After(5 * time.Second):
|
|
||||||
s.Require().FailNow("timed out waiting for an envelope.sent event")
|
|
||||||
}
|
}
|
||||||
|
s.Require().Equal(p1.EnodeID(), e1.Peer)
|
||||||
|
s.Require().NotEqual(gethcommon.Hash{}, e1.Batch)
|
||||||
|
s.Require().Equal(p1.EnodeID(), e2.Peer)
|
||||||
|
s.Require().Equal(e1.Batch, e2.Batch)
|
||||||
|
s.Require().Equal(envelopeErrors, e2.Data)
|
||||||
|
s.Require().NoError(rw1.Close())
|
||||||
|
s.Require().NoError(rw2.Close())
|
||||||
|
timer.Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WakuTestSuite) TestConfirmationEventsReceived() {
|
func (s *WakuTestSuite) TestConfirmationEventsReceived() {
|
||||||
|
@ -314,7 +326,7 @@ func (s *WakuTestSuite) TestConfirmationEventsReceived() {
|
||||||
|
|
||||||
func (s *WakuTestSuite) TestConfirmationEventsExtendedWithErrors() {
|
func (s *WakuTestSuite) TestConfirmationEventsExtendedWithErrors() {
|
||||||
e := common.Envelope{
|
e := common.Envelope{
|
||||||
Expiry: uint32(time.Now().Unix()),
|
Expiry: uint32(time.Now().Unix()) - 4*common.DefaultSyncAllowance,
|
||||||
TTL: 10,
|
TTL: 10,
|
||||||
Topic: common.TopicType{1},
|
Topic: common.TopicType{1},
|
||||||
Data: make([]byte, 1<<10),
|
Data: make([]byte, 1<<10),
|
||||||
|
@ -324,7 +336,7 @@ func (s *WakuTestSuite) TestConfirmationEventsExtendedWithErrors() {
|
||||||
{
|
{
|
||||||
Hash: e.Hash(),
|
Hash: e.Hash(),
|
||||||
Code: common.EnvelopeTimeNotSynced,
|
Code: common.EnvelopeTimeNotSynced,
|
||||||
Description: "test error",
|
Description: "very old envelope",
|
||||||
}},
|
}},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -347,8 +359,8 @@ func (s *WakuTestSuite) TestEventsWithoutConfirmation() {
|
||||||
handleError(s.T(), w1.HandlePeer(p1, rw2))
|
handleError(s.T(), w1.HandlePeer(p1, rw2))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
time.AfterFunc(5*time.Second, func() {
|
timer := time.AfterFunc(5*time.Second, func() {
|
||||||
rw1.Close()
|
handleError(s.T(), rw1.Close())
|
||||||
})
|
})
|
||||||
peer2 := s.newPeer(w2, p2p.NewPeer(enode.ID{1}, "1", nil), rw1, nil)
|
peer2 := s.newPeer(w2, p2p.NewPeer(enode.ID{1}, "1", nil), rw1, nil)
|
||||||
s.Require().NoError(peer2.Start())
|
s.Require().NoError(peer2.Start())
|
||||||
|
@ -374,6 +386,8 @@ func (s *WakuTestSuite) TestEventsWithoutConfirmation() {
|
||||||
case <-time.After(5 * time.Second):
|
case <-time.After(5 * time.Second):
|
||||||
s.Require().FailNow("timed out waiting for an envelope.sent event")
|
s.Require().FailNow("timed out waiting for an envelope.sent event")
|
||||||
}
|
}
|
||||||
|
s.Require().NoError(rw1.Close())
|
||||||
|
timer.Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
func discardPipe() *p2p.MsgPipeRW {
|
func discardPipe() *p2p.MsgPipeRW {
|
||||||
|
@ -628,10 +642,10 @@ func (s *WakuTestSuite) TestPeerHandshakeWithTwoFullNode() {
|
||||||
//two generic waku node handshake. one don't send light flag
|
//two generic waku node handshake. one don't send light flag
|
||||||
func (s *WakuTestSuite) TestHandshakeWithOldVersionWithoutLightModeFlag() {
|
func (s *WakuTestSuite) TestHandshakeWithOldVersionWithoutLightModeFlag() {
|
||||||
rw1, rw2 := p2p.MsgPipe()
|
rw1, rw2 := p2p.MsgPipe()
|
||||||
go func() {
|
defer func() {
|
||||||
handleError(s.T(), rw1.Close())
|
handleError(s.T(), rw1.Close())
|
||||||
}()
|
}()
|
||||||
go func() {
|
defer func() {
|
||||||
handleError(s.T(), rw2.Close())
|
handleError(s.T(), rw2.Close())
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue