mirror of
https://github.com/status-im/status-go.git
synced 2025-01-15 01:05:06 +00:00
141 lines
3.3 KiB
Go
141 lines
3.3 KiB
Go
|
package shhext
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/ethereum/go-ethereum/common"
|
||
|
"github.com/ethereum/go-ethereum/node"
|
||
|
"github.com/ethereum/go-ethereum/p2p"
|
||
|
whisper "github.com/ethereum/go-ethereum/whisper/whisperv6"
|
||
|
"github.com/stretchr/testify/suite"
|
||
|
)
|
||
|
|
||
|
func TestShhExtSuite(t *testing.T) {
|
||
|
suite.Run(t, new(ShhExtSuite))
|
||
|
}
|
||
|
|
||
|
type ShhExtSuite struct {
|
||
|
suite.Suite
|
||
|
|
||
|
nodes []*node.Node
|
||
|
services []*Service
|
||
|
whisper []*whisper.Whisper
|
||
|
}
|
||
|
|
||
|
func (s *ShhExtSuite) SetupTest() {
|
||
|
s.nodes = make([]*node.Node, 2)
|
||
|
s.services = make([]*Service, 2)
|
||
|
s.whisper = make([]*whisper.Whisper, 2)
|
||
|
port := 21313
|
||
|
for i := range s.nodes {
|
||
|
i := i // bind i to be usable in service constructors
|
||
|
cfg := &node.Config{
|
||
|
Name: fmt.Sprintf("node-%d", i),
|
||
|
P2P: p2p.Config{
|
||
|
NoDiscovery: true,
|
||
|
MaxPeers: 20,
|
||
|
ListenAddr: fmt.Sprintf(":%d", port+i),
|
||
|
},
|
||
|
}
|
||
|
stack, err := node.New(cfg)
|
||
|
s.NoError(err)
|
||
|
s.whisper[i] = whisper.New(nil)
|
||
|
s.NoError(stack.Register(func(n *node.ServiceContext) (node.Service, error) {
|
||
|
return s.whisper[i], nil
|
||
|
}))
|
||
|
s.services[i] = New(s.whisper[i], nil)
|
||
|
s.NoError(stack.Register(func(n *node.ServiceContext) (node.Service, error) {
|
||
|
return s.services[i], nil
|
||
|
}))
|
||
|
s.Require().NoError(stack.Start())
|
||
|
s.nodes[i] = stack
|
||
|
}
|
||
|
s.nodes[0].Server().AddPeer(s.nodes[1].Server().Self())
|
||
|
}
|
||
|
|
||
|
func (s *ShhExtSuite) TestPostMessageWithConfirmation() {
|
||
|
confirmations := make(chan common.Hash, 1)
|
||
|
confirmationsHandler := func(hash common.Hash) {
|
||
|
confirmations <- hash
|
||
|
}
|
||
|
s.services[0].tracker.handler = confirmationsHandler
|
||
|
symID, err := s.whisper[0].GenerateSymKey()
|
||
|
s.NoError(err)
|
||
|
client, err := s.nodes[0].Attach()
|
||
|
s.NoError(err)
|
||
|
var hash common.Hash
|
||
|
s.NoError(client.Call(&hash, "shhext_post", whisper.NewMessage{
|
||
|
SymKeyID: symID,
|
||
|
PowTarget: whisper.DefaultMinimumPoW,
|
||
|
PowTime: 200,
|
||
|
Topic: whisper.TopicType{0x01, 0x01, 0x01, 0x01},
|
||
|
Payload: []byte("hello"),
|
||
|
}))
|
||
|
s.NoError(err)
|
||
|
select {
|
||
|
case confirmed := <-confirmations:
|
||
|
s.Equal(hash, confirmed)
|
||
|
case <-time.After(time.Second):
|
||
|
s.Fail("timed out while waiting for confirmation")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *ShhExtSuite) TearDown() {
|
||
|
for _, n := range s.nodes {
|
||
|
s.NoError(n.Stop())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
testHash = common.Hash{0x01}
|
||
|
)
|
||
|
|
||
|
func TestTrackerSuite(t *testing.T) {
|
||
|
suite.Run(t, new(TrackerSuite))
|
||
|
}
|
||
|
|
||
|
type TrackerSuite struct {
|
||
|
suite.Suite
|
||
|
|
||
|
tracker *tracker
|
||
|
}
|
||
|
|
||
|
func (s *TrackerSuite) SetupTest() {
|
||
|
s.tracker = &tracker{
|
||
|
handler: func(common.Hash) {},
|
||
|
cache: map[common.Hash]EnvelopeState{},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (s *TrackerSuite) TestConfirmed() {
|
||
|
s.tracker.Add(testHash)
|
||
|
s.Contains(s.tracker.cache, testHash)
|
||
|
s.Equal(EnvelopePosted, s.tracker.cache[testHash])
|
||
|
s.tracker.handleEvent(whisper.EnvelopeEvent{
|
||
|
Event: whisper.EventEnvelopeSent,
|
||
|
Hash: testHash,
|
||
|
})
|
||
|
s.Contains(s.tracker.cache, testHash)
|
||
|
s.Equal(EnvelopeSent, s.tracker.cache[testHash])
|
||
|
}
|
||
|
|
||
|
func (s *TrackerSuite) TestIgnored() {
|
||
|
s.tracker.handleEvent(whisper.EnvelopeEvent{
|
||
|
Event: whisper.EventEnvelopeSent,
|
||
|
Hash: testHash,
|
||
|
})
|
||
|
s.NotContains(s.tracker.cache, testHash)
|
||
|
}
|
||
|
|
||
|
func (s *TrackerSuite) TestRemoved() {
|
||
|
s.tracker.Add(testHash)
|
||
|
s.Contains(s.tracker.cache, testHash)
|
||
|
s.tracker.handleEvent(whisper.EnvelopeEvent{
|
||
|
Event: whisper.EventEnvelopeExpired,
|
||
|
Hash: testHash,
|
||
|
})
|
||
|
s.NotContains(s.tracker.cache, testHash)
|
||
|
}
|