Move signal logic into signal package

This commit is contained in:
Ivan Danyliuk 2018-05-03 09:35:58 +02:00
parent c8a553f9c1
commit 953c26e8cf
No known key found for this signature in database
GPG Key ID: 97ED33CE024E1DBF
29 changed files with 312 additions and 258 deletions

View File

@ -17,10 +17,10 @@ import (
"github.com/status-im/status-go/geth/notifications/push/fcm" "github.com/status-im/status-go/geth/notifications/push/fcm"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/rpc" "github.com/status-im/status-go/geth/rpc"
"github.com/status-im/status-go/geth/signal"
"github.com/status-im/status-go/geth/transactions" "github.com/status-im/status-go/geth/transactions"
"github.com/status-im/status-go/services/personal" "github.com/status-im/status-go/services/personal"
"github.com/status-im/status-go/sign" "github.com/status-im/status-go/sign"
"github.com/status-im/status-go/signal"
) )
const ( const (
@ -114,12 +114,7 @@ func (b *StatusBackend) StartNode(config *params.NodeConfig) error {
defer b.mu.Unlock() defer b.mu.Unlock()
if err := b.startNode(config); err != nil { if err := b.startNode(config); err != nil {
signal.Send(signal.Envelope{ signal.SendNodeCrashed(err)
Type: signal.EventNodeCrashed,
Event: signal.NodeCrashEvent{
Error: err,
},
})
return err return err
} }
@ -137,7 +132,7 @@ func (b *StatusBackend) startNode(config *params.NodeConfig) (err error) {
if err = b.statusNode.Start(config); err != nil { if err = b.statusNode.Start(config); err != nil {
return return
} }
signal.Send(signal.Envelope{Type: signal.EventNodeStarted}) signal.SendNodeStarted()
b.transactor.SetNetworkID(config.NetworkID) b.transactor.SetNetworkID(config.NetworkID)
b.transactor.SetRPC(b.statusNode.RPCClient(), rpc.DefaultCallTimeout) b.transactor.SetRPC(b.statusNode.RPCClient(), rpc.DefaultCallTimeout)
@ -155,7 +150,7 @@ func (b *StatusBackend) startNode(config *params.NodeConfig) (err error) {
} }
b.log.Info("Account reselected") b.log.Info("Account reselected")
signal.Send(signal.Envelope{Type: signal.EventNodeReady}) signal.SendNodeReady()
return nil return nil
} }
@ -172,7 +167,7 @@ func (b *StatusBackend) stopNode() error {
return node.ErrNoRunningNode return node.ErrNoRunningNode
} }
b.jailManager.Stop() b.jailManager.Stop()
defer signal.Send(signal.Envelope{Type: signal.EventNodeStopped}) defer signal.SendNodeStopped()
return b.statusNode.Stop() return b.statusNode.Stop()
} }
@ -205,7 +200,7 @@ func (b *StatusBackend) ResetChainData() error {
if err := b.statusNode.ResetChainData(&newcfg); err != nil { if err := b.statusNode.ResetChainData(&newcfg); err != nil {
return err return err
} }
signal.Send(signal.Envelope{Type: signal.EventChainDataRemoved}) signal.SendChainDataRemoved()
return b.startNode(&newcfg) return b.startNode(&newcfg)
} }

View File

@ -6,19 +6,17 @@ import (
"strings" "strings"
"github.com/robertkrimen/otto" "github.com/robertkrimen/otto"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
) )
// Write provides the base function to write data to the underline writer // Write provides the base function to write data to the underline writer
// for the underline otto vm. // for the underline otto vm.
func Write(fn otto.FunctionCall, w io.Writer, consoleEventName string) otto.Value { func Write(fn otto.FunctionCall, w io.Writer) otto.Value {
signal.Send(signal.Envelope{ args := convertArgs(fn.ArgumentList)
Type: consoleEventName, signal.SendConsole(args)
Event: convertArgs(fn.ArgumentList),
})
// Next print out the giving values. // Next print out the giving values.
fmt.Fprintf(w, "%s: %s", consoleEventName, formatForConsole(fn.ArgumentList)) fmt.Fprintf(w, "%s: %s", signal.EventVMConsole, formatForConsole(fn.ArgumentList))
return otto.UndefinedValue() return otto.UndefinedValue()
} }

View File

@ -9,7 +9,7 @@ import (
"github.com/robertkrimen/otto" "github.com/robertkrimen/otto"
"github.com/status-im/status-go/geth/jail/console" "github.com/status-im/status-go/geth/jail/console"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )
@ -41,7 +41,7 @@ func (s *ConsoleTestSuite) TestConsoleLog() {
err := s.vm.Set("console", map[string]interface{}{ err := s.vm.Set("console", map[string]interface{}{
"log": func(fn otto.FunctionCall) otto.Value { "log": func(fn otto.FunctionCall) otto.Value {
return console.Write(fn, &customWriter, "vm.console") return console.Write(fn, &customWriter)
}, },
}) })
require.NoError(err) require.NoError(err)
@ -70,7 +70,7 @@ func (s *ConsoleTestSuite) TestObjectLogging() {
err := json.Unmarshal([]byte(event), &eventReceived) err := json.Unmarshal([]byte(event), &eventReceived)
require.NoError(err) require.NoError(err)
require.Equal(eventReceived.Type, "vm.console") require.Equal(eventReceived.Type, signal.EventVMConsole)
require.NotEmpty(eventReceived.Event) require.NotEmpty(eventReceived.Event)
objectReceived := eventReceived.Event[0] objectReceived := eventReceived.Event[0]
@ -80,7 +80,7 @@ func (s *ConsoleTestSuite) TestObjectLogging() {
err := s.vm.Set("console", map[string]interface{}{ err := s.vm.Set("console", map[string]interface{}{
"log": func(fn otto.FunctionCall) otto.Value { "log": func(fn otto.FunctionCall) otto.Value {
return console.Write(fn, &customWriter, "vm.console") return console.Write(fn, &customWriter)
}, },
}) })
require.NoError(err) require.NoError(err)

View File

@ -5,14 +5,7 @@ import (
"github.com/robertkrimen/otto" "github.com/robertkrimen/otto"
"github.com/status-im/status-go/geth/jail/console" "github.com/status-im/status-go/geth/jail/console"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
)
const (
// EventSignal is a signal from jail.
EventSignal = "jail.signal"
// eventConsoleLog defines the event type for the console.log call.
eventConsoleLog = "vm.console.log"
) )
// registerWeb3Provider creates an object called "jeth", // registerWeb3Provider creates an object called "jeth",
@ -21,7 +14,7 @@ func registerWeb3Provider(jail *Jail, cell *Cell) error {
jeth := map[string]interface{}{ jeth := map[string]interface{}{
"console": map[string]interface{}{ "console": map[string]interface{}{
"log": func(fn otto.FunctionCall) otto.Value { "log": func(fn otto.FunctionCall) otto.Value {
return console.Write(fn, os.Stdout, eventConsoleLog) return console.Write(fn, os.Stdout)
}, },
}, },
"send": createSendHandler(jail, cell), "send": createSendHandler(jail, cell),
@ -132,16 +125,7 @@ func createSendSignalHandler(cell *Cell) func(otto.FunctionCall) otto.Value {
return func(call otto.FunctionCall) otto.Value { return func(call otto.FunctionCall) otto.Value {
message := call.Argument(0).String() message := call.Argument(0).String()
signal.Send(signal.Envelope{ signal.SendJailSignal(cell.id, message)
Type: EventSignal,
Event: struct {
ChatID string `json:"chat_id"`
Data string `json:"data"`
}{
ChatID: cell.id,
Data: message,
},
})
// As it's a sync call, it's called already from a thread-safe context, // As it's a sync call, it's called already from a thread-safe context,
// thus using otto.Otto directly. Otherwise, it would try to acquire a lock again // thus using otto.Otto directly. Otherwise, it would try to acquire a lock again

View File

@ -14,7 +14,7 @@ import (
gethrpc "github.com/ethereum/go-ethereum/rpc" gethrpc "github.com/ethereum/go-ethereum/rpc"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/rpc" "github.com/status-im/status-go/geth/rpc"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )

View File

@ -13,6 +13,7 @@ import (
"github.com/ethereum/go-ethereum/p2p/discv5" "github.com/ethereum/go-ethereum/p2p/discv5"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/signal"
) )
var ( var (
@ -95,8 +96,7 @@ func (p *PeerPool) Start(server *p2p.Server) error {
p.topics = append(p.topics, topicPool) p.topics = append(p.topics, topicPool)
} }
// discovery must be already started when pool is started signal.SendDiscoveryStarted() // discovery must be already started when pool is started
SendDiscoveryStarted()
p.events = make(chan *p2p.PeerEvent, 20) p.events = make(chan *p2p.PeerEvent, 20)
p.serverSubscription = server.SubscribeEvents(p.events) p.serverSubscription = server.SubscribeEvents(p.events)
@ -120,7 +120,7 @@ func (p *PeerPool) startDiscovery(server *p2p.Server) error {
p.timeout = time.After(p.discServerTimeout) p.timeout = time.After(p.discServerTimeout)
p.mu.Unlock() p.mu.Unlock()
SendDiscoveryStarted() signal.SendDiscoveryStarted()
return nil return nil
} }
@ -140,7 +140,7 @@ func (p *PeerPool) stopDiscovery(server *p2p.Server) {
t.StopSearch() t.StopSearch()
} }
SendDiscoveryStopped() signal.SendDiscoveryStopped()
} }
// restartDiscovery and search for topics that have peer count below min // restartDiscovery and search for topics that have peer count below min

View File

@ -18,7 +18,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
) )
type PeerPoolSimulationSuite struct { type PeerPoolSimulationSuite struct {
@ -114,11 +114,11 @@ func (s *PeerPoolSimulationSuite) TestSingleTopicDiscoveryWithFailover() {
} }
s.NoError(json.Unmarshal([]byte(jsonEvent), &envelope)) s.NoError(json.Unmarshal([]byte(jsonEvent), &envelope))
switch envelope.Type { switch envelope.Type {
case DiscoveryStarted: case signal.EventDiscoveryStarted:
poolEvents <- envelope.Type poolEvents <- envelope.Type
case DiscoveryStopped: case signal.EventDiscoveryStopped:
poolEvents <- envelope.Type poolEvents <- envelope.Type
case DiscoverySummary: case signal.EventDiscoverySummary:
poolEvents <- envelope.Type poolEvents <- envelope.Type
var summary map[string]int var summary map[string]int
s.NoError(json.Unmarshal(envelope.Event, &summary)) s.NoError(json.Unmarshal(envelope.Event, &summary))
@ -142,13 +142,13 @@ func (s *PeerPoolSimulationSuite) TestSingleTopicDiscoveryWithFailover() {
defer subscription.Unsubscribe() defer subscription.Unsubscribe()
s.NoError(peerPool.Start(s.peers[1])) s.NoError(peerPool.Start(s.peers[1]))
defer peerPool.Stop() defer peerPool.Stop()
s.Equal(DiscoveryStarted, s.getPoolEvent(poolEvents)) s.Equal(signal.EventDiscoveryStarted, s.getPoolEvent(poolEvents))
connected := s.getPeerFromEvent(events, p2p.PeerEventTypeAdd) connected := s.getPeerFromEvent(events, p2p.PeerEventTypeAdd)
s.Equal(s.peers[0].Self().ID, connected) s.Equal(s.peers[0].Self().ID, connected)
s.Equal(DiscoveryStopped, s.getPoolEvent(poolEvents)) s.Equal(signal.EventDiscoveryStopped, s.getPoolEvent(poolEvents))
s.Require().Nil(s.peers[1].DiscV5) s.Require().Nil(s.peers[1].DiscV5)
s.Require().Equal(DiscoverySummary, s.getPoolEvent(poolEvents)) s.Require().Equal(signal.EventDiscoverySummary, s.getPoolEvent(poolEvents))
summary := <-summaries summary := <-summaries
s.Len(summary, 1) s.Len(summary, 1)
s.Contains(summary, "shh/6") s.Contains(summary, "shh/6")
@ -159,19 +159,19 @@ func (s *PeerPoolSimulationSuite) TestSingleTopicDiscoveryWithFailover() {
disconnected := s.getPeerFromEvent(events, p2p.PeerEventTypeDrop) disconnected := s.getPeerFromEvent(events, p2p.PeerEventTypeDrop)
s.Equal(connected, disconnected) s.Equal(connected, disconnected)
s.Require().Equal(DiscoverySummary, s.getPoolEvent(poolEvents)) s.Require().Equal(signal.EventDiscoverySummary, s.getPoolEvent(poolEvents))
summary = <-summaries summary = <-summaries
s.Len(summary, 0) s.Len(summary, 0)
s.Equal(DiscoveryStarted, s.getPoolEvent(poolEvents)) s.Equal(signal.EventDiscoveryStarted, s.getPoolEvent(poolEvents))
s.Require().NotNil(s.peers[1].DiscV5) s.Require().NotNil(s.peers[1].DiscV5)
register = NewRegister(topic) register = NewRegister(topic)
s.Require().NoError(register.Start(s.peers[2])) s.Require().NoError(register.Start(s.peers[2]))
defer register.Stop() defer register.Stop()
s.Equal(s.peers[2].Self().ID, s.getPeerFromEvent(events, p2p.PeerEventTypeAdd)) s.Equal(s.peers[2].Self().ID, s.getPeerFromEvent(events, p2p.PeerEventTypeAdd))
s.Equal(DiscoveryStopped, s.getPoolEvent(poolEvents)) s.Equal(signal.EventDiscoveryStopped, s.getPoolEvent(poolEvents))
s.Require().Equal(DiscoverySummary, s.getPoolEvent(poolEvents)) s.Require().Equal(signal.EventDiscoverySummary, s.getPoolEvent(poolEvents))
summary = <-summaries summary = <-summaries
s.Len(summary, 1) s.Len(summary, 1)
s.Contains(summary, "shh/6") s.Contains(summary, "shh/6")
@ -210,10 +210,10 @@ func TestPeerPoolMaxPeersOverflow(t *testing.T) {
pool := NewPeerPool(nil, DefaultFastSync, DefaultSlowSync, nil, true) pool := NewPeerPool(nil, DefaultFastSync, DefaultSlowSync, nil, true)
require.NoError(t, pool.Start(peer)) require.NoError(t, pool.Start(peer))
require.Equal(t, DiscoveryStarted, <-signals) require.Equal(t, signal.EventDiscoveryStarted, <-signals)
// without config, it will stop the discovery because all topic pools are satisfied // without config, it will stop the discovery because all topic pools are satisfied
pool.events <- &p2p.PeerEvent{Type: p2p.PeerEventTypeAdd} pool.events <- &p2p.PeerEvent{Type: p2p.PeerEventTypeAdd}
require.Equal(t, DiscoveryStopped, <-signals) require.Equal(t, signal.EventDiscoveryStopped, <-signals)
require.Nil(t, peer.DiscV5) require.Nil(t, peer.DiscV5)
// another peer added after discovery is stopped should not panic // another peer added after discovery is stopped should not panic
pool.events <- &p2p.PeerEvent{Type: p2p.PeerEventTypeAdd} pool.events <- &p2p.PeerEvent{Type: p2p.PeerEventTypeAdd}
@ -234,7 +234,7 @@ func TestPeerPoolDiscV5Timeout(t *testing.T) {
// In this case, a strange PeerEventTypeDrop event was emitted. // In this case, a strange PeerEventTypeDrop event was emitted.
go func() { go func() {
switch typ := envelope.Type; typ { switch typ := envelope.Type; typ {
case DiscoveryStarted, DiscoveryStopped: case signal.EventDiscoveryStarted, signal.EventDiscoveryStopped:
signals <- envelope.Type signals <- envelope.Type
} }
}() }()
@ -259,12 +259,12 @@ func TestPeerPoolDiscV5Timeout(t *testing.T) {
pool := NewPeerPool(nil, DefaultFastSync, DefaultSlowSync, nil, true) pool := NewPeerPool(nil, DefaultFastSync, DefaultSlowSync, nil, true)
pool.discServerTimeout = time.Millisecond * 100 pool.discServerTimeout = time.Millisecond * 100
require.NoError(t, pool.Start(server)) require.NoError(t, pool.Start(server))
require.Equal(t, DiscoveryStarted, <-signals) require.Equal(t, signal.EventDiscoveryStarted, <-signals)
// timeout after finding no peers // timeout after finding no peers
select { select {
case sig := <-signals: case sig := <-signals:
require.Equal(t, DiscoveryStopped, sig) require.Equal(t, signal.EventDiscoveryStopped, sig)
case <-time.After(pool.discServerTimeout * 2): case <-time.After(pool.discServerTimeout * 2):
t.Fatal("timed out") t.Fatal("timed out")
} }
@ -272,12 +272,12 @@ func TestPeerPoolDiscV5Timeout(t *testing.T) {
// timeout after discovery restart // timeout after discovery restart
require.NoError(t, pool.restartDiscovery(server)) require.NoError(t, pool.restartDiscovery(server))
require.Equal(t, DiscoveryStarted, <-signals) require.Equal(t, signal.EventDiscoveryStarted, <-signals)
require.NotNil(t, server.DiscV5) require.NotNil(t, server.DiscV5)
pool.events <- &p2p.PeerEvent{Type: p2p.PeerEventTypeDrop} // required to turn the loop and pick up new timeout pool.events <- &p2p.PeerEvent{Type: p2p.PeerEventTypeDrop} // required to turn the loop and pick up new timeout
select { select {
case sig := <-signals: case sig := <-signals:
require.Equal(t, DiscoveryStopped, sig) require.Equal(t, signal.EventDiscoveryStopped, sig)
case <-time.After(pool.discServerTimeout * 2): case <-time.After(pool.discServerTimeout * 2):
t.Fatal("timed out") t.Fatal("timed out")
} }

View File

@ -2,34 +2,9 @@ package peers
import ( import (
"github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
) )
const (
// DiscoveryStarted is sent when node discv5 was started.
DiscoveryStarted = "discovery.started"
// DiscoveryStopped is sent when discv5 server was stopped.
DiscoveryStopped = "discovery.stopped"
// DiscoverySummary is sent when peer is added or removed.
// it will be a map with capability=peer count k/v's.
DiscoverySummary = "discovery.summary"
)
// SendDiscoveryStarted sends discovery.started signal.
func SendDiscoveryStarted() {
signal.Send(signal.Envelope{
Type: DiscoveryStarted,
})
}
// SendDiscoveryStopped sends discovery.stopped signal.
func SendDiscoveryStopped() {
signal.Send(signal.Envelope{
Type: DiscoveryStopped,
})
}
// SendDiscoverySummary sends discovery.summary signal. // SendDiscoverySummary sends discovery.summary signal.
func SendDiscoverySummary(peers []*p2p.PeerInfo) { func SendDiscoverySummary(peers []*p2p.PeerInfo) {
summary := map[string]int{} summary := map[string]int{}
@ -38,8 +13,5 @@ func SendDiscoverySummary(peers []*p2p.PeerInfo) {
summary[cap]++ summary[cap]++
} }
} }
signal.Send(signal.Envelope{ signal.SendDiscoverySummary(summary)
Type: DiscoverySummary,
Event: summary,
})
} }

View File

@ -33,9 +33,9 @@ import (
"github.com/status-im/status-go/geth/account" "github.com/status-im/status-go/geth/account"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal"
"github.com/status-im/status-go/geth/transactions" "github.com/status-im/status-go/geth/transactions"
"github.com/status-im/status-go/sign" "github.com/status-im/status-go/sign"
"github.com/status-im/status-go/signal"
"github.com/status-im/status-go/static" "github.com/status-im/status-go/static"
. "github.com/status-im/status-go/t/utils" //nolint: golint . "github.com/status-im/status-go/t/utils" //nolint: golint
) )
@ -825,7 +825,7 @@ func testCompleteTransaction(t *testing.T) bool {
t.Errorf("cannot unmarshal event's JSON: %s. Error %q", jsonEvent, err) t.Errorf("cannot unmarshal event's JSON: %s. Error %q", jsonEvent, err)
return return
} }
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
t.Logf("transaction queued (will be completed shortly): {id: %s}\n", event["id"].(string)) t.Logf("transaction queued (will be completed shortly): {id: %s}\n", event["id"].(string))
@ -902,7 +902,7 @@ func testCompleteMultipleQueuedTransactions(t *testing.T) bool { //nolint: gocyc
t.Errorf("cannot unmarshal event's JSON: %s", jsonEvent) t.Errorf("cannot unmarshal event's JSON: %s", jsonEvent)
return return
} }
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID = event["id"].(string) txID = event["id"].(string)
t.Logf("transaction queued (will be completed in a single call, once aggregated): {id: %s}\n", txID) t.Logf("transaction queued (will be completed in a single call, once aggregated): {id: %s}\n", txID)
@ -1034,7 +1034,7 @@ func testDiscardTransaction(t *testing.T) bool { //nolint: gocyclo
t.Errorf("cannot unmarshal event's JSON: %s", jsonEvent) t.Errorf("cannot unmarshal event's JSON: %s", jsonEvent)
return return
} }
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID = event["id"].(string) txID = event["id"].(string)
t.Logf("transaction queued (will be discarded soon): {id: %s}\n", txID) t.Logf("transaction queued (will be discarded soon): {id: %s}\n", txID)
@ -1072,7 +1072,7 @@ func testDiscardTransaction(t *testing.T) bool { //nolint: gocyclo
completeQueuedTransaction <- struct{}{} // so that timeout is aborted completeQueuedTransaction <- struct{}{} // so that timeout is aborted
} }
if envelope.Type == sign.EventSignRequestFailed { if envelope.Type == signal.EventSignRequestFailed {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
t.Logf("transaction return event received: {id: %s}\n", event["id"].(string)) t.Logf("transaction return event received: {id: %s}\n", event["id"].(string))
@ -1148,7 +1148,7 @@ func testDiscardMultipleQueuedTransactions(t *testing.T) bool { //nolint: gocycl
t.Errorf("cannot unmarshal event's JSON: %s", jsonEvent) t.Errorf("cannot unmarshal event's JSON: %s", jsonEvent)
return return
} }
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID = event["id"].(string) txID = event["id"].(string)
t.Logf("transaction queued (will be discarded soon): {id: %s}\n", txID) t.Logf("transaction queued (will be discarded soon): {id: %s}\n", txID)
@ -1161,7 +1161,7 @@ func testDiscardMultipleQueuedTransactions(t *testing.T) bool { //nolint: gocycl
txIDs <- txID txIDs <- txID
} }
if envelope.Type == sign.EventSignRequestFailed { if envelope.Type == signal.EventSignRequestFailed {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
t.Logf("transaction return event received: {id: %s}\n", event["id"].(string)) t.Logf("transaction return event received: {id: %s}\n", event["id"].(string))
@ -1462,7 +1462,7 @@ func startTestNode(t *testing.T) <-chan struct{} {
return return
} }
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
} }
if envelope.Type == signal.EventNodeStarted { if envelope.Type == signal.EventNodeStarted {
t.Log("Node started, but we wait till it be ready") t.Log("Node started, but we wait till it be ready")

View File

@ -2,29 +2,18 @@ package shhext
import ( import (
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
) )
// EnvelopeSignal includes hash of the envelope.
type EnvelopeSignal struct {
Hash common.Hash `json:"hash"`
}
// EnvelopeSignalHandler sends signals when envelope is sent or expired. // EnvelopeSignalHandler sends signals when envelope is sent or expired.
type EnvelopeSignalHandler struct{} type EnvelopeSignalHandler struct{}
// EnvelopeSent triggered when envelope delivered atleast to 1 peer. // EnvelopeSent triggered when envelope delivered atleast to 1 peer.
func (h EnvelopeSignalHandler) EnvelopeSent(hash common.Hash) { func (h EnvelopeSignalHandler) EnvelopeSent(hash common.Hash) {
signal.Send(signal.Envelope{ signal.SendEnvelopeSent(hash)
Type: signal.EventEnvelopeSent,
Event: EnvelopeSignal{Hash: hash},
})
} }
// EnvelopeExpired triggered when envelope is expired but wasn't delivered to any peer. // EnvelopeExpired triggered when envelope is expired but wasn't delivered to any peer.
func (h EnvelopeSignalHandler) EnvelopeExpired(hash common.Hash) { func (h EnvelopeSignalHandler) EnvelopeExpired(hash common.Hash) {
signal.Send(signal.Envelope{ signal.SendEnvelopeExpired(hash)
Type: signal.EventEnvelopeExpired,
Event: EnvelopeSignal{Hash: hash},
})
} }

View File

@ -4,27 +4,7 @@ import (
"context" "context"
"github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
)
const (
// EventSignRequestAdded is triggered when send transaction request is queued
EventSignRequestAdded = "sign-request.queued"
// EventSignRequestFailed is triggered when send transaction request fails
EventSignRequestFailed = "sign-request.failed"
)
const (
// SignRequestNoErrorCode is sent when no error occurred.
SignRequestNoErrorCode = iota
// SignRequestDefaultErrorCode is every case when there is no special tx return code.
SignRequestDefaultErrorCode
// SignRequestPasswordErrorCode is sent when account failed verification.
SignRequestPasswordErrorCode
// SignRequestTimeoutErrorCode is sent when tx is timed out.
SignRequestTimeoutErrorCode
// SignRequestDiscardedErrorCode is sent when tx was discarded.
SignRequestDiscardedErrorCode
) )
const ( const (
@ -47,6 +27,42 @@ func messageIDFromContext(ctx context.Context) string {
return "" return ""
} }
// SendSignRequestAdded sends a signal when a sign request is added.
func SendSignRequestAdded(request *Request) {
signal.SendSignRequestAdded(
signal.PendingRequestEvent{
ID: request.ID,
Args: request.Meta,
Method: request.Method,
MessageID: messageIDFromContext(request.context),
})
}
// SendSignRequestFailed sends a signal only if error had happened
func SendSignRequestFailed(request *Request, err error) {
signal.SendSignRequestFailed(
signal.PendingRequestEvent{
ID: request.ID,
Args: request.Meta,
Method: request.Method,
MessageID: messageIDFromContext(request.context),
},
err, sendTransactionErrorCode(err))
}
const (
// SignRequestNoErrorCode is sent when no error occurred.
SignRequestNoErrorCode = iota
// SignRequestDefaultErrorCode is every case when there is no special tx return code.
SignRequestDefaultErrorCode
// SignRequestPasswordErrorCode is sent when account failed verification.
SignRequestPasswordErrorCode
// SignRequestTimeoutErrorCode is sent when tx is timed out.
SignRequestTimeoutErrorCode
// SignRequestDiscardedErrorCode is sent when tx was discarded.
SignRequestDiscardedErrorCode
)
var txReturnCodes = map[error]int{ var txReturnCodes = map[error]int{
nil: SignRequestNoErrorCode, nil: SignRequestNoErrorCode,
keystore.ErrDecrypt: SignRequestPasswordErrorCode, keystore.ErrDecrypt: SignRequestPasswordErrorCode,
@ -54,55 +70,6 @@ var txReturnCodes = map[error]int{
ErrSignReqDiscarded: SignRequestDiscardedErrorCode, ErrSignReqDiscarded: SignRequestDiscardedErrorCode,
} }
// PendingRequestEvent is a signal sent when a sign request is added
type PendingRequestEvent struct {
ID string `json:"id"`
Method string `json:"method"`
Args interface{} `json:"args"`
MessageID string `json:"message_id"`
}
// NotifyOnEnqueue sends a signal when a sign request is added
func NotifyOnEnqueue(request *Request) {
signal.Send(signal.Envelope{
Type: EventSignRequestAdded,
Event: PendingRequestEvent{
ID: request.ID,
Args: request.Meta,
Method: request.Method,
MessageID: messageIDFromContext(request.context),
},
})
}
// PendingRequestErrorEvent is a signal sent when sign request has failed
type PendingRequestErrorEvent struct {
PendingRequestEvent
ErrorMessage string `json:"error_message"`
ErrorCode int `json:"error_code,string"`
}
// NotifyIfError sends a signal only if error had happened
func NotifyIfError(request *Request, err error) {
// we don't want to notify a user if tx was sent successfully
if err == nil {
return
}
signal.Send(signal.Envelope{
Type: EventSignRequestFailed,
Event: PendingRequestErrorEvent{
PendingRequestEvent: PendingRequestEvent{
ID: request.ID,
Args: request.Meta,
Method: request.Method,
MessageID: messageIDFromContext(request.context),
},
ErrorMessage: err.Error(),
ErrorCode: sendTransactionErrorCode(err),
},
})
}
func sendTransactionErrorCode(err error) int { func sendTransactionErrorCode(err error) int {
if code, ok := txReturnCodes[err]; ok { if code, ok := txReturnCodes[err]; ok {
return code return code

View File

@ -38,7 +38,7 @@ func (rs *PendingRequests) Add(ctx context.Context, method string, meta Meta, co
rs.requests[request.ID] = request rs.requests[request.ID] = request
rs.log.Info("signing request is created", "ID", request.ID) rs.log.Info("signing request is created", "ID", request.ID)
go NotifyOnEnqueue(request) go SendSignRequestAdded(request)
return request, nil return request, nil
} }
@ -160,7 +160,10 @@ func (rs *PendingRequests) complete(request *Request, response Response, err err
request.locked = false request.locked = false
go NotifyIfError(request, err) if err != nil {
// TODO(divan): do we need the goroutine here?
go SendSignRequestFailed(request, err)
}
if err != nil && isTransient(err) { if err != nil && isTransient(err) {
return return

5
signal/doc.go Normal file
View File

@ -0,0 +1,5 @@
// Package signal implements event-based signalling interface between status-go
// and externally linked codebases like status-react or status-desktop.
// Events are send asynchronously using OS-specific linking mechanisms. See sources
// for implementation details.
package signal

View File

@ -0,0 +1,27 @@
package signal
const (
// EventDiscoveryStarted is sent when node discv5 was started.
EventDiscoveryStarted = "discovery.started"
// EventDiscoveryStopped is sent when discv5 server was stopped.
EventDiscoveryStopped = "discovery.stopped"
// EventDiscoverySummary is sent when peer is added or removed.
// it will be a map with capability=peer count k/v's.
EventDiscoverySummary = "discovery.summary"
)
// SendDiscoveryStarted sends discovery.started signal.
func SendDiscoveryStarted() {
send(EventDiscoveryStarted, nil)
}
// SendDiscoveryStopped sends discovery.stopped signal.
func SendDiscoveryStopped() {
send(EventDiscoveryStopped, nil)
}
// SendDiscoverySummary sends discovery.summary signal.
func SendDiscoverySummary(summary map[string]int) {
send(EventDiscoverySummary, summary)
}

25
signal/events_jail.go Normal file
View File

@ -0,0 +1,25 @@
package signal
// Jail related event names
const (
EventVMConsole = "vm.console"
EventJailSignal = "jail.signal"
)
// SendConsole is a signal sent when jail writes anything to console.
func SendConsole(args interface{}) {
send(EventVMConsole, args)
}
// SendJailSignal is nobody knows what.
// TODO(divan, adamb): investigate if this even needed.
func SendJailSignal(cellID, message string) {
send(EventJailSignal,
struct {
ChatID string `json:"chat_id"`
Data string `json:"data"`
}{
ChatID: cellID,
Data: message,
})
}

55
signal/events_node.go Normal file
View File

@ -0,0 +1,55 @@
package signal
const (
// EventNodeStarted is triggered when underlying node is started
EventNodeStarted = "node.started"
// EventNodeReady is triggered when underlying node is fully ready
// (consider backend to be fully registered)
EventNodeReady = "node.ready"
// EventNodeStopped is triggered when underlying node is fully stopped
EventNodeStopped = "node.stopped"
// EventNodeCrashed is triggered when node crashes
EventNodeCrashed = "node.crashed"
// EventChainDataRemoved is triggered when node's chain data is removed
EventChainDataRemoved = "chaindata.removed"
)
// NodeCrashEvent is special kind of error, used to report node crashes
type NodeCrashEvent struct {
Error string `json:"error"`
}
// SendNodeCrashed emits a signal when status node has crashed, and
// provides error description.
func SendNodeCrashed(err error) {
send(EventNodeCrashed,
NodeCrashEvent{
Error: err.Error(),
})
}
// SendNodeStarted emits a signal when status node has just started (but not
// finished startup yet).
func SendNodeStarted() {
send(EventNodeStarted, nil)
}
// SendNodeReady emits a signal when status node has started and successfully
// completed startup.
func SendNodeReady() {
send(EventNodeReady, nil)
}
// SendNodeStopped emits a signal when underlying node has stopped.
func SendNodeStopped() {
send(EventNodeStopped, nil)
}
// SendChainDataRemoved emits a signal when node's chain data has been removed.
func SendChainDataRemoved() {
send(EventChainDataRemoved, nil)
}

27
signal/events_shhext.go Normal file
View File

@ -0,0 +1,27 @@
package signal
import "github.com/ethereum/go-ethereum/common"
const (
// EventEnvelopeSent is triggered when envelope was sent at least to a one peer.
EventEnvelopeSent = "envelope.sent"
// EventEnvelopeExpired is triggered when envelop was dropped by a whisper without being sent
// to any peer
EventEnvelopeExpired = "envelope.expired"
)
// EnvelopeSignal includes hash of the envelope.
type EnvelopeSignal struct {
Hash common.Hash `json:"hash"`
}
// SendEnvelopeSent triggered when envelope delivered at least to 1 peer.
func SendEnvelopeSent(hash common.Hash) {
send(EventEnvelopeSent, EnvelopeSignal{hash})
}
// SendEnvelopeExpired triggered when envelope delivered at least to 1 peer.
func SendEnvelopeExpired(hash common.Hash) {
send(EventEnvelopeExpired, EnvelopeSignal{hash})
}

38
signal/events_sign.go Normal file
View File

@ -0,0 +1,38 @@
package signal
const (
// EventSignRequestAdded is triggered when send transaction request is queued
EventSignRequestAdded = "sign-request.queued"
// EventSignRequestFailed is triggered when send transaction request fails
EventSignRequestFailed = "sign-request.failed"
)
// PendingRequestEvent is a signal sent when a sign request is added
type PendingRequestEvent struct {
ID string `json:"id"`
Method string `json:"method"`
Args interface{} `json:"args"`
MessageID string `json:"message_id"`
}
// SendSignRequestAdded sends a signal when a sign request is added.
func SendSignRequestAdded(event PendingRequestEvent) {
send(EventSignRequestAdded, event)
}
// PendingRequestErrorEvent is a signal sent when sign request has failed
type PendingRequestErrorEvent struct {
PendingRequestEvent
ErrorMessage string `json:"error_message"`
ErrorCode int `json:"error_code,string"`
}
// SendSignRequestFailed sends a signal of failed sign request.
func SendSignRequestFailed(event PendingRequestEvent, err error, errCode int) {
send(EventSignRequestFailed,
PendingRequestErrorEvent{
PendingRequestEvent: event,
ErrorMessage: err.Error(),
ErrorCode: errCode,
})
}

View File

@ -14,30 +14,8 @@ import (
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
) )
const ( // All general log messages in this package should be routed through this logger.
// EventNodeStarted is triggered when underlying node is started var logger = log.New("package", "status-go/signal")
EventNodeStarted = "node.started"
// EventNodeReady is triggered when underlying node is fully ready
// (consider backend to be fully registered)
EventNodeReady = "node.ready"
// EventNodeStopped is triggered when underlying node is fully stopped
EventNodeStopped = "node.stopped"
// EventNodeCrashed is triggered when node crashes
EventNodeCrashed = "node.crashed"
// EventChainDataRemoved is triggered when node's chain data is removed
EventChainDataRemoved = "chaindata.removed"
// EventEnvelopeSent is triggered when envelope was sent atleast to a one peer.
EventEnvelopeSent = "envelope.sent"
// EventEnvelopeExpired is triggered when envelop was dropped by a whisper without being sent
// to any peer
EventEnvelopeExpired = "envelope.expired"
)
// Envelope is a general signal sent upward from node to RN app // Envelope is a general signal sent upward from node to RN app
type Envelope struct { type Envelope struct {
@ -45,21 +23,22 @@ type Envelope struct {
Event interface{} `json:"event"` Event interface{} `json:"event"`
} }
// NodeCrashEvent is special kind of error, used to report node crashes // NewEnvelope creates new envlope of given type and event payload.
type NodeCrashEvent struct { func NewEnvelope(typ string, event interface{}) *Envelope {
Error error `json:"error"` return &Envelope{
Type: typ,
Event: event,
}
} }
// All general log messages in this package should be routed through this logger. // send sends application signal (in JSON) upwards to application (via default notification handler)
var logger = log.New("package", "status-go/geth/signal") func send(typ string, event interface{}) {
signal := NewEnvelope(typ, event)
// MarshalJSON implements the json.Marshaller interface. data, err := json.Marshal(&signal)
func (e NodeCrashEvent) MarshalJSON() ([]byte, error) { if err != nil {
return json.Marshal(struct { logger.Error("Marshalling signal envelope", "error", err)
Error string `json:"error"` }
}{ C.StatusServiceSignalEvent(C.CString(string(data)))
Error: e.Error.Error(),
})
} }
// NodeNotificationHandler defines a handler able to process incoming node events. // NodeNotificationHandler defines a handler able to process incoming node events.
@ -90,12 +69,6 @@ func TriggerDefaultNodeNotificationHandler(jsonEvent string) {
logger.Info("Notification received", "event", jsonEvent) logger.Info("Notification received", "event", jsonEvent)
} }
// Send sends application signal (JSON, normally) upwards to application (via default notification handler)
func Send(signal Envelope) {
data, _ := json.Marshal(&signal)
C.StatusServiceSignalEvent(C.CString(string(data)))
}
//export NotifyNode //export NotifyNode
//nolint: golint //nolint: golint
func NotifyNode(jsonEvent *C.char) { func NotifyNode(jsonEvent *C.char) {

View File

@ -2,7 +2,6 @@ package signal
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"testing" "testing"
@ -13,7 +12,7 @@ func TestNodeCrashEventJSONMarshalling(t *testing.T) {
errorMsg := "TestNodeCrashEventJSONMarshallingError" errorMsg := "TestNodeCrashEventJSONMarshallingError"
expectedJSON := fmt.Sprintf(`{"error":"%s"}`, errorMsg) expectedJSON := fmt.Sprintf(`{"error":"%s"}`, errorMsg)
nodeCrashEvent := &NodeCrashEvent{ nodeCrashEvent := &NodeCrashEvent{
Error: errors.New(errorMsg), Error: errorMsg,
} }
marshalled, err := json.Marshal(nodeCrashEvent) marshalled, err := json.Marshal(nodeCrashEvent)
require.NoError(t, err) require.NoError(t, err)

View File

@ -13,7 +13,7 @@ import (
"github.com/status-im/status-go/geth/api" "github.com/status-im/status-go/geth/api"
"github.com/status-im/status-go/geth/node" "github.com/status-im/status-go/geth/node"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
. "github.com/status-im/status-go/t/utils" . "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )

View File

@ -13,8 +13,7 @@ import (
"github.com/status-im/status-go/geth/jail" "github.com/status-im/status-go/geth/jail"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
"github.com/status-im/status-go/sign"
e2e "github.com/status-im/status-go/t/e2e" e2e "github.com/status-im/status-go/t/e2e"
. "github.com/status-im/status-go/t/utils" . "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
@ -133,7 +132,7 @@ func (s *JailRPCTestSuite) TestContractDeployment() {
unmarshalErr := json.Unmarshal([]byte(jsonEvent), &envelope) unmarshalErr := json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(unmarshalErr, "cannot unmarshal JSON: %s", jsonEvent) s.NoError(unmarshalErr, "cannot unmarshal JSON: %s", jsonEvent)
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
s.T().Logf("transaction queued and will be completed shortly, id: %v", event["id"]) s.T().Logf("transaction queued and will be completed shortly, id: %v", event["id"])
@ -291,7 +290,7 @@ func (s *JailRPCTestSuite) TestJailVMPersistence() {
s.T().Errorf("cannot unmarshal event's JSON: %s", jsonEvent) s.T().Errorf("cannot unmarshal event's JSON: %s", jsonEvent)
return return
} }
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
s.T().Logf("Transaction queued (will be completed shortly): {id: %s}\n", event["id"].(string)) s.T().Logf("Transaction queued (will be completed shortly): {id: %s}\n", event["id"].(string))

View File

@ -12,7 +12,7 @@ import (
"github.com/status-im/status-go/geth/jail" "github.com/status-im/status-go/geth/jail"
"github.com/status-im/status-go/geth/node" "github.com/status-im/status-go/geth/node"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
"github.com/status-im/status-go/static" "github.com/status-im/status-go/static"
"github.com/status-im/status-go/t/e2e" "github.com/status-im/status-go/t/e2e"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
@ -160,7 +160,7 @@ func (s *JailTestSuite) TestEventSignal() {
unmarshalErr := json.Unmarshal([]byte(jsonEvent), &envelope) unmarshalErr := json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(unmarshalErr) s.NoError(unmarshalErr)
if envelope.Type == jail.EventSignal { if envelope.Type == signal.EventJailSignal {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
chatID, ok := event["chat_id"].(string) chatID, ok := event["chat_id"].(string)
s.True(ok, "chat id is required, but not found") s.True(ok, "chat id is required, but not found")

View File

@ -9,9 +9,8 @@ import (
"github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/accounts/keystore"
acc "github.com/status-im/status-go/geth/account" acc "github.com/status-im/status-go/geth/account"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal"
"github.com/status-im/status-go/services/personal" "github.com/status-im/status-go/services/personal"
"github.com/status-im/status-go/sign" "github.com/status-im/status-go/signal"
e2e "github.com/status-im/status-go/t/e2e" e2e "github.com/status-im/status-go/t/e2e"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
@ -171,7 +170,7 @@ func (s *PersonalSignSuite) notificationHandlerNoAccountSelected(account string,
return func(jsonEvent string) { return func(jsonEvent string) {
s.notificationHandler(account, pass, acc.ErrNoAccountSelected)(jsonEvent) s.notificationHandler(account, pass, acc.ErrNoAccountSelected)(jsonEvent)
envelope := unmarshalEnvelope(jsonEvent) envelope := unmarshalEnvelope(jsonEvent)
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
err := s.Backend.SelectAccount(TestConfig.Account1.Address, TestConfig.Account1.Password) err := s.Backend.SelectAccount(TestConfig.Account1.Address, TestConfig.Account1.Password)
s.NoError(err) s.NoError(err)
} }
@ -182,7 +181,7 @@ func (s *PersonalSignSuite) notificationHandlerNoAccountSelected(account string,
func (s *PersonalSignSuite) notificationHandler(account string, pass string, expectedError error) func(string) { func (s *PersonalSignSuite) notificationHandler(account string, pass string, expectedError error) func(string) {
return func(jsonEvent string) { return func(jsonEvent string) {
envelope := unmarshalEnvelope(jsonEvent) envelope := unmarshalEnvelope(jsonEvent)
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
id := event["id"].(string) id := event["id"].(string)
s.T().Logf("Sign request added (will be completed shortly): {id: %s}\n", id) s.T().Logf("Sign request added (will be completed shortly): {id: %s}\n", id)

View File

@ -7,9 +7,9 @@ import (
"github.com/status-im/status-go/geth/api" "github.com/status-im/status-go/geth/api"
"github.com/status-im/status-go/geth/node" "github.com/status-im/status-go/geth/node"
"github.com/status-im/status-go/geth/signal"
"github.com/status-im/status-go/geth/transactions" "github.com/status-im/status-go/geth/transactions"
"github.com/status-im/status-go/sign" "github.com/status-im/status-go/sign"
"github.com/status-im/status-go/signal"
. "github.com/status-im/status-go/t/utils" //nolint: golint . "github.com/status-im/status-go/t/utils" //nolint: golint
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )

View File

@ -16,9 +16,9 @@ import (
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/status-im/status-go/geth/account" "github.com/status-im/status-go/geth/account"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal"
"github.com/status-im/status-go/geth/transactions" "github.com/status-im/status-go/geth/transactions"
"github.com/status-im/status-go/sign" "github.com/status-im/status-go/sign"
"github.com/status-im/status-go/signal"
e2e "github.com/status-im/status-go/t/e2e" e2e "github.com/status-im/status-go/t/e2e"
. "github.com/status-im/status-go/t/utils" . "github.com/status-im/status-go/t/utils"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
@ -57,7 +57,7 @@ func (s *TransactionsTestSuite) TestCallRPCSendTransaction() {
err := json.Unmarshal([]byte(rawSignal), &sg) err := json.Unmarshal([]byte(rawSignal), &sg)
s.NoError(err) s.NoError(err)
if sg.Type == sign.EventSignRequestAdded { if sg.Type == signal.EventSignRequestAdded {
event := sg.Event.(map[string]interface{}) event := sg.Event.(map[string]interface{})
//check for the correct method name //check for the correct method name
method := event["method"].(string) method := event["method"].(string)
@ -110,7 +110,7 @@ func (s *TransactionsTestSuite) TestCallRPCSendTransactionUpstream() {
err := json.Unmarshal([]byte(rawSignal), &signalEnvelope) err := json.Unmarshal([]byte(rawSignal), &signalEnvelope)
s.NoError(err) s.NoError(err)
if signalEnvelope.Type == sign.EventSignRequestAdded { if signalEnvelope.Type == signal.EventSignRequestAdded {
event := signalEnvelope.Event.(map[string]interface{}) event := signalEnvelope.Event.(map[string]interface{})
txID := event["id"].(string) txID := event["id"].(string)
@ -165,8 +165,8 @@ func (s *TransactionsTestSuite) TestEmptyToFieldPreserved() {
} }
err := json.Unmarshal([]byte(rawSignal), &sg) err := json.Unmarshal([]byte(rawSignal), &sg)
s.NoError(err) s.NoError(err)
if sg.Type == sign.EventSignRequestAdded { if sg.Type == signal.EventSignRequestAdded {
var event sign.PendingRequestEvent var event signal.PendingRequestEvent
s.NoError(json.Unmarshal(sg.Event, &event)) s.NoError(json.Unmarshal(sg.Event, &event))
args := event.Args.(map[string]interface{}) args := event.Args.(map[string]interface{})
s.NotNil(args["from"]) s.NotNil(args["from"])
@ -250,7 +250,7 @@ func (s *TransactionsTestSuite) setDefaultNodeNotificationHandler(signRequestRes
err := json.Unmarshal([]byte(jsonEvent), &envelope) err := json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent)) s.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent))
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
log.Info("transaction queued (will be completed shortly)", "id", event["id"].(string)) log.Info("transaction queued (will be completed shortly)", "id", event["id"].(string))
@ -408,7 +408,7 @@ func (s *TransactionsTestSuite) TestSendEtherTxUpstream() {
err = json.Unmarshal([]byte(jsonEvent), &envelope) err = json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(err, "cannot unmarshal JSON: %s", jsonEvent) s.NoError(err, "cannot unmarshal JSON: %s", jsonEvent)
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
log.Info("transaction queued (will be completed shortly)", "id", event["id"].(string)) log.Info("transaction queued (will be completed shortly)", "id", event["id"].(string))
@ -465,7 +465,7 @@ func (s *TransactionsTestSuite) TestDoubleCompleteQueuedTransactions() {
err := json.Unmarshal([]byte(jsonEvent), &envelope) err := json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent)) s.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent))
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID := string(event["id"].(string)) txID := string(event["id"].(string))
log.Info("transaction queued (will be failed and completed on the second call)", "id", txID) log.Info("transaction queued (will be failed and completed on the second call)", "id", txID)
@ -488,7 +488,7 @@ func (s *TransactionsTestSuite) TestDoubleCompleteQueuedTransactions() {
close(completeQueuedTransaction) close(completeQueuedTransaction)
} }
if envelope.Type == sign.EventSignRequestFailed { if envelope.Type == signal.EventSignRequestFailed {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
log.Info("transaction return event received", "id", event["id"].(string)) log.Info("transaction return event received", "id", event["id"].(string))
@ -543,7 +543,7 @@ func (s *TransactionsTestSuite) TestDiscardQueuedTransaction() {
err := json.Unmarshal([]byte(jsonEvent), &envelope) err := json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent)) s.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent))
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID := string(event["id"].(string)) txID := string(event["id"].(string))
log.Info("transaction queued (will be discarded soon)", "id", txID) log.Info("transaction queued (will be discarded soon)", "id", txID)
@ -565,7 +565,7 @@ func (s *TransactionsTestSuite) TestDiscardQueuedTransaction() {
close(completeQueuedTransaction) close(completeQueuedTransaction)
} }
if envelope.Type == sign.EventSignRequestFailed { if envelope.Type == signal.EventSignRequestFailed {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
log.Info("transaction return event received", "id", event["id"].(string)) log.Info("transaction return event received", "id", event["id"].(string))
@ -633,7 +633,7 @@ func (s *TransactionsTestSuite) TestDiscardMultipleQueuedTransactions() {
var envelope signal.Envelope var envelope signal.Envelope
err := json.Unmarshal([]byte(jsonEvent), &envelope) err := json.Unmarshal([]byte(jsonEvent), &envelope)
s.NoError(err) s.NoError(err)
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID := string(event["id"].(string)) txID := string(event["id"].(string))
log.Info("transaction queued (will be discarded soon)", "id", txID) log.Info("transaction queued (will be discarded soon)", "id", txID)
@ -643,7 +643,7 @@ func (s *TransactionsTestSuite) TestDiscardMultipleQueuedTransactions() {
txIDs <- txID txIDs <- txID
} }
if envelope.Type == sign.EventSignRequestFailed { if envelope.Type == signal.EventSignRequestFailed {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
log.Info("transaction return event received", "id", event["id"].(string)) log.Info("transaction return event received", "id", event["id"].(string))
@ -785,7 +785,7 @@ func (s *TransactionsTestSuite) sendConcurrentTransactions(testTxCount int) {
err := json.Unmarshal([]byte(jsonEvent), &envelope) err := json.Unmarshal([]byte(jsonEvent), &envelope)
require.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent)) require.NoError(err, fmt.Sprintf("cannot unmarshal JSON: %s", jsonEvent))
if envelope.Type == sign.EventSignRequestAdded { if envelope.Type == signal.EventSignRequestAdded {
event := envelope.Event.(map[string]interface{}) event := envelope.Event.(map[string]interface{})
txID := string(event["id"].(string)) txID := string(event["id"].(string))
log.Info("transaction queued (will be completed in a single call, once aggregated)", "id", txID) log.Info("transaction queued (will be completed in a single call, once aggregated)", "id", txID)

View File

@ -12,8 +12,7 @@ import (
whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" whisper "github.com/ethereum/go-ethereum/whisper/whisperv6"
"github.com/status-im/status-go/geth/node" "github.com/status-im/status-go/geth/node"
"github.com/status-im/status-go/geth/params" "github.com/status-im/status-go/geth/params"
"github.com/status-im/status-go/geth/signal" "github.com/status-im/status-go/signal"
"github.com/status-im/status-go/services/shhext"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
) )
@ -57,7 +56,7 @@ func (s *WhisperExtensionSuite) TestSentSignal() {
s.NoError(json.Unmarshal([]byte(rawSignal), &sg)) s.NoError(json.Unmarshal([]byte(rawSignal), &sg))
if sg.Type == signal.EventEnvelopeSent { if sg.Type == signal.EventEnvelopeSent {
var event shhext.EnvelopeSignal var event signal.EnvelopeSignal
s.NoError(json.Unmarshal(sg.Event, &event)) s.NoError(json.Unmarshal(sg.Event, &event))
confirmed <- event.Hash confirmed <- event.Hash
} }
@ -95,7 +94,7 @@ func (s *WhisperExtensionSuite) TestExpiredSignal() {
s.NoError(json.Unmarshal([]byte(rawSignal), &sg)) s.NoError(json.Unmarshal([]byte(rawSignal), &sg))
if sg.Type == signal.EventEnvelopeExpired { if sg.Type == signal.EventEnvelopeExpired {
var event shhext.EnvelopeSignal var event signal.EnvelopeSignal
s.NoError(json.Unmarshal(sg.Event, &event)) s.NoError(json.Unmarshal(sg.Event, &event))
expired <- event.Hash expired <- event.Hash
} }