Merge pull request #780 from status-im/improvement/issue-779/common-NodeManager-removal
[#779] common.NodeManager removal
This commit is contained in:
commit
518148cab9
|
@ -14,7 +14,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/status-im/status-go/cmd/statusd/debug"
|
"github.com/status-im/status-go/cmd/statusd/debug"
|
||||||
"github.com/status-im/status-go/geth/api"
|
"github.com/status-im/status-go/geth/api"
|
||||||
"github.com/status-im/status-go/geth/common"
|
"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/metrics"
|
"github.com/status-im/status-go/metrics"
|
||||||
nodemetrics "github.com/status-im/status-go/metrics/node"
|
nodemetrics "github.com/status-im/status-go/metrics/node"
|
||||||
|
@ -182,7 +182,7 @@ func startDebug(backend *api.StatusBackend) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// startCollectingStats collects various stats about the node and other protocols like Whisper.
|
// startCollectingStats collects various stats about the node and other protocols like Whisper.
|
||||||
func startCollectingStats(interruptCh <-chan struct{}, nodeManager common.NodeManager) {
|
func startCollectingStats(interruptCh <-chan struct{}, nodeManager *node.Manager) {
|
||||||
|
|
||||||
logger.Info("Starting stats", "stats", *statsAddr)
|
logger.Info("Starting stats", "stats", *statsAddr)
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ Options:
|
||||||
// haltOnInterruptSignal catches interrupt signal (SIGINT) and
|
// haltOnInterruptSignal catches interrupt signal (SIGINT) and
|
||||||
// stops the node. It times out after 5 seconds
|
// stops the node. It times out after 5 seconds
|
||||||
// if the node can not be stopped.
|
// if the node can not be stopped.
|
||||||
func haltOnInterruptSignal(nodeManager common.NodeManager) <-chan struct{} {
|
func haltOnInterruptSignal(nodeManager *node.Manager) <-chan struct{} {
|
||||||
interruptCh := make(chan struct{})
|
interruptCh := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
signalCh := make(chan os.Signal, 1)
|
signalCh := make(chan os.Signal, 1)
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/status-im/status-go/geth/common"
|
"github.com/status-im/status-go/geth/node"
|
||||||
)
|
)
|
||||||
|
|
||||||
func createContextFromTimeout(timeout int) (context.Context, context.CancelFunc) {
|
func createContextFromTimeout(timeout int) (context.Context, context.CancelFunc) {
|
||||||
|
@ -19,7 +19,7 @@ func createContextFromTimeout(timeout int) (context.Context, context.CancelFunc)
|
||||||
// It returns an exit code (`0` if successful or `1` in case of error)
|
// It returns an exit code (`0` if successful or `1` in case of error)
|
||||||
// that can be used in `os.Exit` to exit immediately when the function returns.
|
// that can be used in `os.Exit` to exit immediately when the function returns.
|
||||||
// The special exit code `-1` is used if execution was interrupted.
|
// The special exit code `-1` is used if execution was interrupted.
|
||||||
func syncAndStopNode(interruptCh <-chan struct{}, nodeManager common.NodeManager, timeout int) (exitCode int) {
|
func syncAndStopNode(interruptCh <-chan struct{}, nodeManager *node.Manager, timeout int) (exitCode int) {
|
||||||
|
|
||||||
logger.Info("syncAndStopNode: node will synchronize the chain and exit", "timeoutInMins", timeout)
|
logger.Info("syncAndStopNode: node will synchronize the chain and exit", "timeoutInMins", timeout)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
|
// Source: geth/account/accounts.go
|
||||||
|
|
||||||
|
// Package transactions is a generated GoMock package.
|
||||||
|
package account
|
||||||
|
|
||||||
|
import (
|
||||||
|
reflect "reflect"
|
||||||
|
|
||||||
|
accounts "github.com/ethereum/go-ethereum/accounts"
|
||||||
|
keystore "github.com/ethereum/go-ethereum/accounts/keystore"
|
||||||
|
gomock "github.com/golang/mock/gomock"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MockGethServiceProvider is a mock of GethServiceProvider interface
|
||||||
|
type MockGethServiceProvider struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MockGethServiceProviderMockRecorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockGethServiceProviderMockRecorder is the mock recorder for MockGethServiceProvider
|
||||||
|
type MockGethServiceProviderMockRecorder struct {
|
||||||
|
mock *MockGethServiceProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockGethServiceProvider creates a new mock instance
|
||||||
|
func NewMockGethServiceProvider(ctrl *gomock.Controller) *MockGethServiceProvider {
|
||||||
|
mock := &MockGethServiceProvider{ctrl: ctrl}
|
||||||
|
mock.recorder = &MockGethServiceProviderMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use
|
||||||
|
func (m *MockGethServiceProvider) EXPECT() *MockGethServiceProviderMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccountManager mocks base method
|
||||||
|
func (m *MockGethServiceProvider) AccountManager() (*accounts.Manager, error) {
|
||||||
|
ret := m.ctrl.Call(m, "AccountManager")
|
||||||
|
ret0, _ := ret[0].(*accounts.Manager)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccountManager indicates an expected call of AccountManager
|
||||||
|
func (mr *MockGethServiceProviderMockRecorder) AccountManager() *gomock.Call {
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AccountManager", reflect.TypeOf((*MockGethServiceProvider)(nil).AccountManager))
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccountKeyStore mocks base method
|
||||||
|
func (m *MockGethServiceProvider) AccountKeyStore() (*keystore.KeyStore, error) {
|
||||||
|
ret := m.ctrl.Call(m, "AccountKeyStore")
|
||||||
|
ret0, _ := ret[0].(*keystore.KeyStore)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccountKeyStore indicates an expected call of AccountKeyStore
|
||||||
|
func (mr *MockGethServiceProviderMockRecorder) AccountKeyStore() *gomock.Call {
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AccountKeyStore", reflect.TypeOf((*MockGethServiceProvider)(nil).AccountKeyStore))
|
||||||
|
}
|
|
@ -119,8 +119,8 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestManagerTestSuite(t *testing.T) {
|
func TestManagerTestSuite(t *testing.T) {
|
||||||
nodeManager := newMockNodeManager(t)
|
gethServiceProvider := newMockGethServiceProvider(t)
|
||||||
accManager := NewManager(nodeManager)
|
accManager := NewManager(gethServiceProvider)
|
||||||
|
|
||||||
keyStoreDir, err := ioutil.TempDir(os.TempDir(), "accounts")
|
keyStoreDir, err := ioutil.TempDir(os.TempDir(), "accounts")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -130,7 +130,7 @@ func TestManagerTestSuite(t *testing.T) {
|
||||||
testPassword := "test-password"
|
testPassword := "test-password"
|
||||||
|
|
||||||
// Initial test - create test account
|
// Initial test - create test account
|
||||||
nodeManager.EXPECT().AccountKeyStore().Return(keyStore, nil)
|
gethServiceProvider.EXPECT().AccountKeyStore().Return(keyStore, nil)
|
||||||
addr, pubKey, mnemonic, err := accManager.CreateAccount(testPassword)
|
addr, pubKey, mnemonic, err := accManager.CreateAccount(testPassword)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NotEmpty(t, addr)
|
require.NotEmpty(t, addr)
|
||||||
|
@ -144,7 +144,7 @@ func TestManagerTestSuite(t *testing.T) {
|
||||||
pubKey,
|
pubKey,
|
||||||
mnemonic,
|
mnemonic,
|
||||||
},
|
},
|
||||||
nodeManager: nodeManager,
|
gethServiceProvider: gethServiceProvider,
|
||||||
accManager: accManager,
|
accManager: accManager,
|
||||||
keyStore: keyStore,
|
keyStore: keyStore,
|
||||||
gethAccManager: accounts.NewManager(),
|
gethAccManager: accounts.NewManager(),
|
||||||
|
@ -153,15 +153,15 @@ func TestManagerTestSuite(t *testing.T) {
|
||||||
suite.Run(t, s)
|
suite.Run(t, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMockNodeManager(t *testing.T) *common.MockNodeManager {
|
func newMockGethServiceProvider(t *testing.T) *MockGethServiceProvider {
|
||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
return common.NewMockNodeManager(ctrl)
|
return NewMockGethServiceProvider(ctrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ManagerTestSuite struct {
|
type ManagerTestSuite struct {
|
||||||
suite.Suite
|
suite.Suite
|
||||||
testAccount
|
testAccount
|
||||||
nodeManager *common.MockNodeManager
|
gethServiceProvider *MockGethServiceProvider
|
||||||
accManager *Manager
|
accManager *Manager
|
||||||
keyStore *keystore.KeyStore
|
keyStore *keystore.KeyStore
|
||||||
gethAccManager *accounts.Manager
|
gethAccManager *accounts.Manager
|
||||||
|
@ -178,8 +178,8 @@ type testAccount struct {
|
||||||
// Stating the amount of times for mock calls kills the flexibility for
|
// Stating the amount of times for mock calls kills the flexibility for
|
||||||
// development so this is a good workaround to use with EXPECT().Func().AnyTimes()
|
// development so this is a good workaround to use with EXPECT().Func().AnyTimes()
|
||||||
func (s *ManagerTestSuite) reinitMock() {
|
func (s *ManagerTestSuite) reinitMock() {
|
||||||
s.nodeManager = newMockNodeManager(s.T())
|
s.gethServiceProvider = newMockGethServiceProvider(s.T())
|
||||||
s.accManager.geth = s.nodeManager
|
s.accManager.geth = s.gethServiceProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetupTest is used here for reinitializing the mock before every
|
// SetupTest is used here for reinitializing the mock before every
|
||||||
|
@ -190,23 +190,23 @@ func (s *ManagerTestSuite) SetupTest() {
|
||||||
|
|
||||||
func (s *ManagerTestSuite) TestCreateAccount() {
|
func (s *ManagerTestSuite) TestCreateAccount() {
|
||||||
// Don't fail on empty password
|
// Don't fail on empty password
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(s.keyStore, nil)
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(s.keyStore, nil)
|
||||||
_, _, _, err := s.accManager.CreateAccount(s.password)
|
_, _, _, err := s.accManager.CreateAccount(s.password)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(nil, errKeyStore)
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(nil, errKeyStore)
|
||||||
_, _, _, err = s.accManager.CreateAccount(s.password)
|
_, _, _, err = s.accManager.CreateAccount(s.password)
|
||||||
s.Equal(errKeyStore, err)
|
s.Equal(errKeyStore, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ManagerTestSuite) TestRecoverAccount() {
|
func (s *ManagerTestSuite) TestRecoverAccount() {
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(s.keyStore, nil)
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(s.keyStore, nil)
|
||||||
addr, pubKey, err := s.accManager.RecoverAccount(s.password, s.mnemonic)
|
addr, pubKey, err := s.accManager.RecoverAccount(s.password, s.mnemonic)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.Equal(s.address, addr)
|
s.Equal(s.address, addr)
|
||||||
s.Equal(s.pubKey, pubKey)
|
s.Equal(s.pubKey, pubKey)
|
||||||
|
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(nil, errKeyStore)
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(nil, errKeyStore)
|
||||||
_, _, err = s.accManager.RecoverAccount(s.password, s.mnemonic)
|
_, _, err = s.accManager.RecoverAccount(s.password, s.mnemonic)
|
||||||
s.Equal(errKeyStore, err)
|
s.Equal(errKeyStore, err)
|
||||||
}
|
}
|
||||||
|
@ -252,7 +252,7 @@ func (s *ManagerTestSuite) TestSelectAccount() {
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
s.T().Run(testCase.name, func(t *testing.T) {
|
s.T().Run(testCase.name, func(t *testing.T) {
|
||||||
s.reinitMock()
|
s.reinitMock()
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(testCase.accountKeyStoreReturn...).AnyTimes()
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(testCase.accountKeyStoreReturn...).AnyTimes()
|
||||||
err := s.accManager.SelectAccount(testCase.address, testCase.password)
|
err := s.accManager.SelectAccount(testCase.address, testCase.password)
|
||||||
s.Equal(testCase.expectedError, err)
|
s.Equal(testCase.expectedError, err)
|
||||||
})
|
})
|
||||||
|
@ -264,14 +264,14 @@ func (s *ManagerTestSuite) TestCreateChildAccount() {
|
||||||
// and an address is not provided.
|
// and an address is not provided.
|
||||||
s.accManager.selectedAccount = nil
|
s.accManager.selectedAccount = nil
|
||||||
s.T().Run("fail_noAccount", func(t *testing.T) {
|
s.T().Run("fail_noAccount", func(t *testing.T) {
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(s.keyStore, nil).AnyTimes()
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(s.keyStore, nil).AnyTimes()
|
||||||
_, _, err := s.accManager.CreateChildAccount("", s.password)
|
_, _, err := s.accManager.CreateChildAccount("", s.password)
|
||||||
s.Equal(ErrNoAccountSelected, err)
|
s.Equal(ErrNoAccountSelected, err)
|
||||||
})
|
})
|
||||||
|
|
||||||
// Now, select the test account for rest of the test cases.
|
// Now, select the test account for rest of the test cases.
|
||||||
s.reinitMock()
|
s.reinitMock()
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(s.keyStore, nil).AnyTimes()
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(s.keyStore, nil).AnyTimes()
|
||||||
err := s.accManager.SelectAccount(s.address, s.password)
|
err := s.accManager.SelectAccount(s.address, s.password)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ func (s *ManagerTestSuite) TestCreateChildAccount() {
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
s.T().Run(testCase.name, func(t *testing.T) {
|
s.T().Run(testCase.name, func(t *testing.T) {
|
||||||
s.reinitMock()
|
s.reinitMock()
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(testCase.accountKeyStoreReturn...).AnyTimes()
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(testCase.accountKeyStoreReturn...).AnyTimes()
|
||||||
childAddr, childPubKey, err := s.accManager.CreateChildAccount(testCase.address, testCase.password)
|
childAddr, childPubKey, err := s.accManager.CreateChildAccount(testCase.address, testCase.password)
|
||||||
if testCase.expectedError != nil {
|
if testCase.expectedError != nil {
|
||||||
s.Equal(testCase.expectedError, err)
|
s.Equal(testCase.expectedError, err)
|
||||||
|
@ -337,24 +337,24 @@ func (s *ManagerTestSuite) TestLogout() {
|
||||||
// TestAccounts tests cases for (*Manager).Accounts.
|
// TestAccounts tests cases for (*Manager).Accounts.
|
||||||
func (s *ManagerTestSuite) TestAccounts() {
|
func (s *ManagerTestSuite) TestAccounts() {
|
||||||
// Select the test account
|
// Select the test account
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(s.keyStore, nil).AnyTimes()
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(s.keyStore, nil).AnyTimes()
|
||||||
err := s.accManager.SelectAccount(s.address, s.password)
|
err := s.accManager.SelectAccount(s.address, s.password)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
// Success
|
// Success
|
||||||
s.nodeManager.EXPECT().AccountManager().Return(s.gethAccManager, nil)
|
s.gethServiceProvider.EXPECT().AccountManager().Return(s.gethAccManager, nil)
|
||||||
accs, err := s.accManager.Accounts()
|
accs, err := s.accManager.Accounts()
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.NotNil(accs)
|
s.NotNil(accs)
|
||||||
|
|
||||||
// Can't get an account manager
|
// Can't get an account manager
|
||||||
s.nodeManager.EXPECT().AccountManager().Return(nil, errAccManager)
|
s.gethServiceProvider.EXPECT().AccountManager().Return(nil, errAccManager)
|
||||||
_, err = s.accManager.Accounts()
|
_, err = s.accManager.Accounts()
|
||||||
s.Equal(errAccManager, err)
|
s.Equal(errAccManager, err)
|
||||||
|
|
||||||
// Selected account is nil but doesn't fail
|
// Selected account is nil but doesn't fail
|
||||||
s.accManager.selectedAccount = nil
|
s.accManager.selectedAccount = nil
|
||||||
s.nodeManager.EXPECT().AccountManager().Return(s.gethAccManager, nil)
|
s.gethServiceProvider.EXPECT().AccountManager().Return(s.gethAccManager, nil)
|
||||||
accs, err = s.accManager.Accounts()
|
accs, err = s.accManager.Accounts()
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.NotNil(accs)
|
s.NotNil(accs)
|
||||||
|
@ -401,7 +401,7 @@ func (s *ManagerTestSuite) TestAddressToDecryptedAccount() {
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
s.T().Run(testCase.name, func(t *testing.T) {
|
s.T().Run(testCase.name, func(t *testing.T) {
|
||||||
s.reinitMock()
|
s.reinitMock()
|
||||||
s.nodeManager.EXPECT().AccountKeyStore().Return(testCase.accountKeyStoreReturn...).AnyTimes()
|
s.gethServiceProvider.EXPECT().AccountKeyStore().Return(testCase.accountKeyStoreReturn...).AnyTimes()
|
||||||
acc, key, err := s.accManager.AddressToDecryptedAccount(testCase.address, testCase.password)
|
acc, key, err := s.accManager.AddressToDecryptedAccount(testCase.address, testCase.password)
|
||||||
if testCase.expectedError != nil {
|
if testCase.expectedError != nil {
|
||||||
s.Equal(testCase.expectedError, err)
|
s.Equal(testCase.expectedError, err)
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"github.com/status-im/status-go/geth/account"
|
"github.com/status-im/status-go/geth/account"
|
||||||
"github.com/status-im/status-go/geth/common"
|
"github.com/status-im/status-go/geth/common"
|
||||||
"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/params"
|
"github.com/status-im/status-go/geth/params"
|
||||||
"github.com/status-im/status-go/geth/transactions"
|
"github.com/status-im/status-go/geth/transactions"
|
||||||
)
|
)
|
||||||
|
@ -35,7 +36,7 @@ func NewStatusAPIWithBackend(b *StatusBackend) *StatusAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeManager returns reference to node manager
|
// NodeManager returns reference to node manager
|
||||||
func (api *StatusAPI) NodeManager() common.NodeManager {
|
func (api *StatusAPI) NodeManager() *node.Manager {
|
||||||
return api.b.NodeManager()
|
return api.b.NodeManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ var (
|
||||||
// StatusBackend implements Status.im service
|
// StatusBackend implements Status.im service
|
||||||
type StatusBackend struct {
|
type StatusBackend struct {
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
nodeManager *node.NodeManager
|
nodeManager *node.Manager
|
||||||
accountManager *account.Manager
|
accountManager *account.Manager
|
||||||
txQueueManager *transactions.Manager
|
txQueueManager *transactions.Manager
|
||||||
jailManager jail.Manager
|
jailManager jail.Manager
|
||||||
|
@ -47,7 +47,7 @@ type StatusBackend struct {
|
||||||
func NewStatusBackend() *StatusBackend {
|
func NewStatusBackend() *StatusBackend {
|
||||||
defer log.Info("Status backend initialized")
|
defer log.Info("Status backend initialized")
|
||||||
|
|
||||||
nodeManager := node.NewNodeManager()
|
nodeManager := node.NewManager()
|
||||||
accountManager := account.NewManager(nodeManager)
|
accountManager := account.NewManager(nodeManager)
|
||||||
txQueueManager := transactions.NewManager(nodeManager)
|
txQueueManager := transactions.NewManager(nodeManager)
|
||||||
jailManager := jail.New(nodeManager)
|
jailManager := jail.New(nodeManager)
|
||||||
|
@ -64,7 +64,7 @@ func NewStatusBackend() *StatusBackend {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeManager returns reference to node manager
|
// NodeManager returns reference to node manager
|
||||||
func (b *StatusBackend) NodeManager() *node.NodeManager {
|
func (b *StatusBackend) NodeManager() *node.Manager {
|
||||||
return b.nodeManager
|
return b.nodeManager
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,15 +10,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts"
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/keystore"
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
"github.com/ethereum/go-ethereum/les"
|
|
||||||
"github.com/ethereum/go-ethereum/node"
|
|
||||||
whisper "github.com/ethereum/go-ethereum/whisper/whisperv6"
|
|
||||||
"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/static"
|
"github.com/status-im/status-go/static"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -28,52 +22,6 @@ var (
|
||||||
ErrInvalidSendTxArgs = errors.New("Transaction arguments are invalid (are both 'input' and 'data' fields used?)")
|
ErrInvalidSendTxArgs = errors.New("Transaction arguments are invalid (are both 'input' and 'data' fields used?)")
|
||||||
)
|
)
|
||||||
|
|
||||||
// NodeManager defines expected methods for managing Status node
|
|
||||||
type NodeManager interface {
|
|
||||||
// StartNode start Status node, fails if node is already started
|
|
||||||
StartNode(config *params.NodeConfig) error
|
|
||||||
|
|
||||||
// EnsureSync waits until blockchain is synchronized.
|
|
||||||
EnsureSync(ctx context.Context) error
|
|
||||||
|
|
||||||
// StopNode stop the running Status node.
|
|
||||||
// Stopped node cannot be resumed, one starts a new node instead.
|
|
||||||
StopNode() error
|
|
||||||
|
|
||||||
// IsNodeRunning confirm that node is running
|
|
||||||
IsNodeRunning() bool
|
|
||||||
|
|
||||||
// NodeConfig returns reference to running node's configuration
|
|
||||||
NodeConfig() (*params.NodeConfig, error)
|
|
||||||
|
|
||||||
// Node returns underlying Status node
|
|
||||||
Node() (*node.Node, error)
|
|
||||||
|
|
||||||
// PopulateStaticPeers populates node's list of static bootstrap peers
|
|
||||||
PopulateStaticPeers() error
|
|
||||||
|
|
||||||
// AddPeer adds URL of static peer
|
|
||||||
AddPeer(url string) error
|
|
||||||
|
|
||||||
// PeerCount returns number of connected peers
|
|
||||||
PeerCount() int
|
|
||||||
|
|
||||||
// LightEthereumService exposes reference to LES service running on top of the node
|
|
||||||
LightEthereumService() (*les.LightEthereum, error)
|
|
||||||
|
|
||||||
// WhisperService returns reference to running Whisper service
|
|
||||||
WhisperService() (*whisper.Whisper, error)
|
|
||||||
|
|
||||||
// AccountManager returns reference to node's account manager
|
|
||||||
AccountManager() (*accounts.Manager, error)
|
|
||||||
|
|
||||||
// AccountKeyStore returns reference to account manager's keystore
|
|
||||||
AccountKeyStore() (*keystore.KeyStore, error)
|
|
||||||
|
|
||||||
// RPCClient exposes reference to RPC client connected to the running node
|
|
||||||
RPCClient() *rpc.Client
|
|
||||||
}
|
|
||||||
|
|
||||||
// TransactionResult is a JSON returned from transaction complete function (used internally)
|
// TransactionResult is a JSON returned from transaction complete function (used internally)
|
||||||
type TransactionResult struct {
|
type TransactionResult struct {
|
||||||
Hash common.Hash
|
Hash common.Hash
|
||||||
|
|
|
@ -1,216 +0,0 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
|
||||||
// Source: geth/common/types.go
|
|
||||||
|
|
||||||
// Package common is a generated GoMock package.
|
|
||||||
package common
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
reflect "reflect"
|
|
||||||
|
|
||||||
accounts "github.com/ethereum/go-ethereum/accounts"
|
|
||||||
keystore "github.com/ethereum/go-ethereum/accounts/keystore"
|
|
||||||
les "github.com/ethereum/go-ethereum/les"
|
|
||||||
node "github.com/ethereum/go-ethereum/node"
|
|
||||||
whisperv6 "github.com/ethereum/go-ethereum/whisper/whisperv6"
|
|
||||||
gomock "github.com/golang/mock/gomock"
|
|
||||||
params "github.com/status-im/status-go/geth/params"
|
|
||||||
rpc "github.com/status-im/status-go/geth/rpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// MockNodeManager is a mock of NodeManager interface
|
|
||||||
type MockNodeManager struct {
|
|
||||||
ctrl *gomock.Controller
|
|
||||||
recorder *MockNodeManagerMockRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MockNodeManagerMockRecorder is the mock recorder for MockNodeManager
|
|
||||||
type MockNodeManagerMockRecorder struct {
|
|
||||||
mock *MockNodeManager
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMockNodeManager creates a new mock instance
|
|
||||||
func NewMockNodeManager(ctrl *gomock.Controller) *MockNodeManager {
|
|
||||||
mock := &MockNodeManager{ctrl: ctrl}
|
|
||||||
mock.recorder = &MockNodeManagerMockRecorder{mock}
|
|
||||||
return mock
|
|
||||||
}
|
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use
|
|
||||||
func (m *MockNodeManager) EXPECT() *MockNodeManagerMockRecorder {
|
|
||||||
return m.recorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartNode mocks base method
|
|
||||||
func (m *MockNodeManager) StartNode(config *params.NodeConfig) error {
|
|
||||||
ret := m.ctrl.Call(m, "StartNode", config)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// StartNode indicates an expected call of StartNode
|
|
||||||
func (mr *MockNodeManagerMockRecorder) StartNode(config interface{}) *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartNode", reflect.TypeOf((*MockNodeManager)(nil).StartNode), config)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnsureSync mocks base method
|
|
||||||
func (m *MockNodeManager) EnsureSync(ctx context.Context) error {
|
|
||||||
ret := m.ctrl.Call(m, "EnsureSync", ctx)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnsureSync indicates an expected call of EnsureSync
|
|
||||||
func (mr *MockNodeManagerMockRecorder) EnsureSync(ctx interface{}) *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureSync", reflect.TypeOf((*MockNodeManager)(nil).EnsureSync), ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopNode mocks base method
|
|
||||||
func (m *MockNodeManager) StopNode() error {
|
|
||||||
ret := m.ctrl.Call(m, "StopNode")
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopNode indicates an expected call of StopNode
|
|
||||||
func (mr *MockNodeManagerMockRecorder) StopNode() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StopNode", reflect.TypeOf((*MockNodeManager)(nil).StopNode))
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNodeRunning mocks base method
|
|
||||||
func (m *MockNodeManager) IsNodeRunning() bool {
|
|
||||||
ret := m.ctrl.Call(m, "IsNodeRunning")
|
|
||||||
ret0, _ := ret[0].(bool)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsNodeRunning indicates an expected call of IsNodeRunning
|
|
||||||
func (mr *MockNodeManagerMockRecorder) IsNodeRunning() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsNodeRunning", reflect.TypeOf((*MockNodeManager)(nil).IsNodeRunning))
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeConfig mocks base method
|
|
||||||
func (m *MockNodeManager) NodeConfig() (*params.NodeConfig, error) {
|
|
||||||
ret := m.ctrl.Call(m, "NodeConfig")
|
|
||||||
ret0, _ := ret[0].(*params.NodeConfig)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// NodeConfig indicates an expected call of NodeConfig
|
|
||||||
func (mr *MockNodeManagerMockRecorder) NodeConfig() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NodeConfig", reflect.TypeOf((*MockNodeManager)(nil).NodeConfig))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Node mocks base method
|
|
||||||
func (m *MockNodeManager) Node() (*node.Node, error) {
|
|
||||||
ret := m.ctrl.Call(m, "Node")
|
|
||||||
ret0, _ := ret[0].(*node.Node)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// Node indicates an expected call of Node
|
|
||||||
func (mr *MockNodeManagerMockRecorder) Node() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Node", reflect.TypeOf((*MockNodeManager)(nil).Node))
|
|
||||||
}
|
|
||||||
|
|
||||||
// PopulateStaticPeers mocks base method
|
|
||||||
func (m *MockNodeManager) PopulateStaticPeers() error {
|
|
||||||
ret := m.ctrl.Call(m, "PopulateStaticPeers")
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// PopulateStaticPeers indicates an expected call of PopulateStaticPeers
|
|
||||||
func (mr *MockNodeManagerMockRecorder) PopulateStaticPeers() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PopulateStaticPeers", reflect.TypeOf((*MockNodeManager)(nil).PopulateStaticPeers))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddPeer mocks base method
|
|
||||||
func (m *MockNodeManager) AddPeer(url string) error {
|
|
||||||
ret := m.ctrl.Call(m, "AddPeer", url)
|
|
||||||
ret0, _ := ret[0].(error)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddPeer indicates an expected call of AddPeer
|
|
||||||
func (mr *MockNodeManagerMockRecorder) AddPeer(url interface{}) *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddPeer", reflect.TypeOf((*MockNodeManager)(nil).AddPeer), url)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PeerCount mocks base method
|
|
||||||
func (m *MockNodeManager) PeerCount() int {
|
|
||||||
ret := m.ctrl.Call(m, "PeerCount")
|
|
||||||
ret0, _ := ret[0].(int)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// PeerCount indicates an expected call of PeerCount
|
|
||||||
func (mr *MockNodeManagerMockRecorder) PeerCount() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PeerCount", reflect.TypeOf((*MockNodeManager)(nil).PeerCount))
|
|
||||||
}
|
|
||||||
|
|
||||||
// LightEthereumService mocks base method
|
|
||||||
func (m *MockNodeManager) LightEthereumService() (*les.LightEthereum, error) {
|
|
||||||
ret := m.ctrl.Call(m, "LightEthereumService")
|
|
||||||
ret0, _ := ret[0].(*les.LightEthereum)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// LightEthereumService indicates an expected call of LightEthereumService
|
|
||||||
func (mr *MockNodeManagerMockRecorder) LightEthereumService() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LightEthereumService", reflect.TypeOf((*MockNodeManager)(nil).LightEthereumService))
|
|
||||||
}
|
|
||||||
|
|
||||||
// WhisperService mocks base method
|
|
||||||
func (m *MockNodeManager) WhisperService() (*whisperv6.Whisper, error) {
|
|
||||||
ret := m.ctrl.Call(m, "WhisperService")
|
|
||||||
ret0, _ := ret[0].(*whisperv6.Whisper)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// WhisperService indicates an expected call of WhisperService
|
|
||||||
func (mr *MockNodeManagerMockRecorder) WhisperService() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WhisperService", reflect.TypeOf((*MockNodeManager)(nil).WhisperService))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AccountManager mocks base method
|
|
||||||
func (m *MockNodeManager) AccountManager() (*accounts.Manager, error) {
|
|
||||||
ret := m.ctrl.Call(m, "AccountManager")
|
|
||||||
ret0, _ := ret[0].(*accounts.Manager)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// AccountManager indicates an expected call of AccountManager
|
|
||||||
func (mr *MockNodeManagerMockRecorder) AccountManager() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AccountManager", reflect.TypeOf((*MockNodeManager)(nil).AccountManager))
|
|
||||||
}
|
|
||||||
|
|
||||||
// AccountKeyStore mocks base method
|
|
||||||
func (m *MockNodeManager) AccountKeyStore() (*keystore.KeyStore, error) {
|
|
||||||
ret := m.ctrl.Call(m, "AccountKeyStore")
|
|
||||||
ret0, _ := ret[0].(*keystore.KeyStore)
|
|
||||||
ret1, _ := ret[1].(error)
|
|
||||||
return ret0, ret1
|
|
||||||
}
|
|
||||||
|
|
||||||
// AccountKeyStore indicates an expected call of AccountKeyStore
|
|
||||||
func (mr *MockNodeManagerMockRecorder) AccountKeyStore() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AccountKeyStore", reflect.TypeOf((*MockNodeManager)(nil).AccountKeyStore))
|
|
||||||
}
|
|
||||||
|
|
||||||
// RPCClient mocks base method
|
|
||||||
func (m *MockNodeManager) RPCClient() *rpc.Client {
|
|
||||||
ret := m.ctrl.Call(m, "RPCClient")
|
|
||||||
ret0, _ := ret[0].(*rpc.Client)
|
|
||||||
return ret0
|
|
||||||
}
|
|
||||||
|
|
||||||
// RPCClient indicates an expected call of RPCClient
|
|
||||||
func (mr *MockNodeManagerMockRecorder) RPCClient() *gomock.Call {
|
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RPCClient", reflect.TypeOf((*MockNodeManager)(nil).RPCClient))
|
|
||||||
}
|
|
|
@ -40,10 +40,10 @@ type RPCClientError error
|
||||||
// EthNodeError is reported when node crashed on start up.
|
// EthNodeError is reported when node crashed on start up.
|
||||||
type EthNodeError error
|
type EthNodeError error
|
||||||
|
|
||||||
// NodeManager manages Status node (which abstracts contained geth node)
|
// Manager manages Status node (which abstracts contained geth node)
|
||||||
// nolint: golint
|
// nolint: golint
|
||||||
// should be fixed at https://github.com/status-im/status-go/issues/200
|
// should be fixed at https://github.com/status-im/status-go/issues/200
|
||||||
type NodeManager struct {
|
type Manager struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
config *params.NodeConfig // Status node configuration
|
config *params.NodeConfig // Status node configuration
|
||||||
node *node.Node // reference to Geth P2P stack/node
|
node *node.Node // reference to Geth P2P stack/node
|
||||||
|
@ -54,22 +54,22 @@ type NodeManager struct {
|
||||||
log log.Logger
|
log log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNodeManager makes new instance of node manager
|
// NewManager makes new instance of node manager
|
||||||
func NewNodeManager() *NodeManager {
|
func NewManager() *Manager {
|
||||||
return &NodeManager{
|
return &Manager{
|
||||||
log: log.New("package", "status-go/geth/node.NodeManager"),
|
log: log.New("package", "status-go/geth/node.Manager"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// StartNode start Status node, fails if node is already started
|
// StartNode start Status node, fails if node is already started
|
||||||
func (m *NodeManager) StartNode(config *params.NodeConfig) error {
|
func (m *Manager) StartNode(config *params.NodeConfig) error {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
return m.startNode(config)
|
return m.startNode(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// startNode start Status node, fails if node is already started
|
// startNode start Status node, fails if node is already started
|
||||||
func (m *NodeManager) startNode(config *params.NodeConfig) error {
|
func (m *Manager) startNode(config *params.NodeConfig) error {
|
||||||
if err := m.isNodeAvailable(); err == nil {
|
if err := m.isNodeAvailable(); err == nil {
|
||||||
return ErrNodeExists
|
return ErrNodeExists
|
||||||
}
|
}
|
||||||
|
@ -105,14 +105,14 @@ func (m *NodeManager) startNode(config *params.NodeConfig) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// StopNode stop Status node. Stopped node cannot be resumed.
|
// StopNode stop Status node. Stopped node cannot be resumed.
|
||||||
func (m *NodeManager) StopNode() error {
|
func (m *Manager) StopNode() error {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
return m.stopNode()
|
return m.stopNode()
|
||||||
}
|
}
|
||||||
|
|
||||||
// stopNode stop Status node. Stopped node cannot be resumed.
|
// stopNode stop Status node. Stopped node cannot be resumed.
|
||||||
func (m *NodeManager) stopNode() error {
|
func (m *Manager) stopNode() error {
|
||||||
if err := m.isNodeAvailable(); err != nil {
|
if err := m.isNodeAvailable(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ func (m *NodeManager) stopNode() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetChainData removes chain data if node is not running.
|
// ResetChainData removes chain data if node is not running.
|
||||||
func (m *NodeManager) ResetChainData(config *params.NodeConfig) error {
|
func (m *Manager) ResetChainData(config *params.NodeConfig) error {
|
||||||
if m.IsNodeRunning() {
|
if m.IsNodeRunning() {
|
||||||
return ErrNodeExists
|
return ErrNodeExists
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ func (m *NodeManager) ResetChainData(config *params.NodeConfig) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNodeRunning confirm that node is running
|
// IsNodeRunning confirm that node is running
|
||||||
func (m *NodeManager) IsNodeRunning() bool {
|
func (m *Manager) IsNodeRunning() bool {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ func (m *NodeManager) IsNodeRunning() bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Node returns underlying Status node
|
// Node returns underlying Status node
|
||||||
func (m *NodeManager) Node() (*node.Node, error) {
|
func (m *Manager) Node() (*node.Node, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -169,14 +169,14 @@ func (m *NodeManager) Node() (*node.Node, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PopulateStaticPeers connects current node with our publicly available LES/SHH/Swarm cluster
|
// PopulateStaticPeers connects current node with our publicly available LES/SHH/Swarm cluster
|
||||||
func (m *NodeManager) PopulateStaticPeers() error {
|
func (m *Manager) PopulateStaticPeers() error {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
return m.populateStaticPeers()
|
return m.populateStaticPeers()
|
||||||
}
|
}
|
||||||
|
|
||||||
// populateStaticPeers connects current node with our publicly available LES/SHH/Swarm cluster
|
// populateStaticPeers connects current node with our publicly available LES/SHH/Swarm cluster
|
||||||
func (m *NodeManager) populateStaticPeers() error {
|
func (m *Manager) populateStaticPeers() error {
|
||||||
if err := m.isNodeAvailable(); err != nil {
|
if err := m.isNodeAvailable(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ func (m *NodeManager) populateStaticPeers() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *NodeManager) removeStaticPeers() error {
|
func (m *Manager) removeStaticPeers() error {
|
||||||
if !m.config.ClusterConfig.Enabled {
|
if !m.config.ClusterConfig.Enabled {
|
||||||
m.log.Info("Static peers are disabled")
|
m.log.Info("Static peers are disabled")
|
||||||
return nil
|
return nil
|
||||||
|
@ -218,7 +218,7 @@ func (m *NodeManager) removeStaticPeers() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReconnectStaticPeers removes and adds static peers to a server.
|
// ReconnectStaticPeers removes and adds static peers to a server.
|
||||||
func (m *NodeManager) ReconnectStaticPeers() error {
|
func (m *Manager) ReconnectStaticPeers() error {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
if err := m.removeStaticPeers(); err != nil {
|
if err := m.removeStaticPeers(); err != nil {
|
||||||
|
@ -228,7 +228,7 @@ func (m *NodeManager) ReconnectStaticPeers() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddPeer adds new static peer node
|
// AddPeer adds new static peer node
|
||||||
func (m *NodeManager) AddPeer(url string) error {
|
func (m *Manager) AddPeer(url string) error {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
if err := m.isNodeAvailable(); err != nil {
|
if err := m.isNodeAvailable(); err != nil {
|
||||||
|
@ -238,7 +238,7 @@ func (m *NodeManager) AddPeer(url string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// addPeer adds new static peer node
|
// addPeer adds new static peer node
|
||||||
func (m *NodeManager) addPeer(url string) error {
|
func (m *Manager) addPeer(url string) error {
|
||||||
// Try to add the url as a static peer and return
|
// Try to add the url as a static peer and return
|
||||||
parsedNode, err := discover.ParseNode(url)
|
parsedNode, err := discover.ParseNode(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -248,7 +248,7 @@ func (m *NodeManager) addPeer(url string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *NodeManager) removePeer(url string) error {
|
func (m *Manager) removePeer(url string) error {
|
||||||
parsedNode, err := discover.ParseNode(url)
|
parsedNode, err := discover.ParseNode(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -258,7 +258,7 @@ func (m *NodeManager) removePeer(url string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PeerCount returns the number of connected peers.
|
// PeerCount returns the number of connected peers.
|
||||||
func (m *NodeManager) PeerCount() int {
|
func (m *Manager) PeerCount() int {
|
||||||
if !m.IsNodeRunning() {
|
if !m.IsNodeRunning() {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ func (m *NodeManager) PeerCount() int {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeConfig exposes reference to running node's configuration
|
// NodeConfig exposes reference to running node's configuration
|
||||||
func (m *NodeManager) NodeConfig() (*params.NodeConfig, error) {
|
func (m *Manager) NodeConfig() (*params.NodeConfig, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -277,7 +277,7 @@ func (m *NodeManager) NodeConfig() (*params.NodeConfig, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// LightEthereumService exposes reference to LES service running on top of the node
|
// LightEthereumService exposes reference to LES service running on top of the node
|
||||||
func (m *NodeManager) LightEthereumService() (*les.LightEthereum, error) {
|
func (m *Manager) LightEthereumService() (*les.LightEthereum, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -297,7 +297,7 @@ func (m *NodeManager) LightEthereumService() (*les.LightEthereum, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// WhisperService exposes reference to Whisper service running on top of the node
|
// WhisperService exposes reference to Whisper service running on top of the node
|
||||||
func (m *NodeManager) WhisperService() (*whisper.Whisper, error) {
|
func (m *Manager) WhisperService() (*whisper.Whisper, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ func (m *NodeManager) WhisperService() (*whisper.Whisper, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AccountManager exposes reference to node's accounts manager
|
// AccountManager exposes reference to node's accounts manager
|
||||||
func (m *NodeManager) AccountManager() (*accounts.Manager, error) {
|
func (m *Manager) AccountManager() (*accounts.Manager, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ func (m *NodeManager) AccountManager() (*accounts.Manager, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AccountKeyStore exposes reference to accounts key store
|
// AccountKeyStore exposes reference to accounts key store
|
||||||
func (m *NodeManager) AccountKeyStore() (*keystore.KeyStore, error) {
|
func (m *Manager) AccountKeyStore() (*keystore.KeyStore, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
|
|
||||||
|
@ -358,14 +358,14 @@ func (m *NodeManager) AccountKeyStore() (*keystore.KeyStore, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// RPCClient exposes reference to RPC client connected to the running node.
|
// RPCClient exposes reference to RPC client connected to the running node.
|
||||||
func (m *NodeManager) RPCClient() *rpc.Client {
|
func (m *Manager) RPCClient() *rpc.Client {
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
defer m.mu.Unlock()
|
defer m.mu.Unlock()
|
||||||
return m.rpcClient
|
return m.rpcClient
|
||||||
}
|
}
|
||||||
|
|
||||||
// isNodeAvailable check if we have a node running and make sure is fully started
|
// isNodeAvailable check if we have a node running and make sure is fully started
|
||||||
func (m *NodeManager) isNodeAvailable() error {
|
func (m *Manager) isNodeAvailable() error {
|
||||||
if m.node == nil || m.node.Server() == nil {
|
if m.node == nil || m.node.Server() == nil {
|
||||||
return ErrNoRunningNode
|
return ErrNoRunningNode
|
||||||
}
|
}
|
||||||
|
@ -377,7 +377,7 @@ const tickerResolution = time.Second
|
||||||
|
|
||||||
// EnsureSync waits until blockchain synchronization
|
// EnsureSync waits until blockchain synchronization
|
||||||
// is complete and returns.
|
// is complete and returns.
|
||||||
func (m *NodeManager) EnsureSync(ctx context.Context) error {
|
func (m *Manager) EnsureSync(ctx context.Context) error {
|
||||||
// Don't wait for any blockchain sync for the
|
// Don't wait for any blockchain sync for the
|
||||||
// local private chain as blocks are never mined.
|
// local private chain as blocks are never mined.
|
||||||
if m.config.NetworkID == params.StatusChainNetworkID {
|
if m.config.NetworkID == params.StatusChainNetworkID {
|
||||||
|
@ -387,7 +387,7 @@ func (m *NodeManager) EnsureSync(ctx context.Context) error {
|
||||||
return m.ensureSync(ctx)
|
return m.ensureSync(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *NodeManager) ensureSync(ctx context.Context) error {
|
func (m *Manager) ensureSync(ctx context.Context) error {
|
||||||
les, err := m.LightEthereumService()
|
les, err := m.LightEthereumService()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to get LES service: %v", err)
|
return fmt.Errorf("failed to get LES service: %v", err)
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
|
// Source: geth/transactions/txqueue_manager_test.go
|
||||||
|
|
||||||
|
// Package transactions is a generated GoMock package.
|
||||||
|
package transactions
|
||||||
|
|
||||||
|
import (
|
||||||
|
reflect "reflect"
|
||||||
|
|
||||||
|
gomock "github.com/golang/mock/gomock"
|
||||||
|
rpc "github.com/status-im/status-go/geth/rpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MocktestRPCClientProvider is a mock of testRPCClientProvider interface
|
||||||
|
type MocktestRPCClientProvider struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MocktestRPCClientProviderMockRecorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// MocktestRPCClientProviderMockRecorder is the mock recorder for MocktestRPCClientProvider
|
||||||
|
type MocktestRPCClientProviderMockRecorder struct {
|
||||||
|
mock *MocktestRPCClientProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMocktestRPCClientProvider creates a new mock instance
|
||||||
|
func NewMocktestRPCClientProvider(ctrl *gomock.Controller) *MocktestRPCClientProvider {
|
||||||
|
mock := &MocktestRPCClientProvider{ctrl: ctrl}
|
||||||
|
mock.recorder = &MocktestRPCClientProviderMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use
|
||||||
|
func (m *MocktestRPCClientProvider) EXPECT() *MocktestRPCClientProviderMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// RPCClient mocks base method
|
||||||
|
func (m *MocktestRPCClientProvider) RPCClient() *rpc.Client {
|
||||||
|
ret := m.ctrl.Call(m, "RPCClient")
|
||||||
|
ret0, _ := ret[0].(*rpc.Client)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// RPCClient indicates an expected call of RPCClient
|
||||||
|
func (mr *MocktestRPCClientProviderMockRecorder) RPCClient() *gomock.Call {
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RPCClient", reflect.TypeOf((*MocktestRPCClientProvider)(nil).RPCClient))
|
||||||
|
}
|
|
@ -27,14 +27,10 @@ import (
|
||||||
. "github.com/status-im/status-go/t/utils"
|
. "github.com/status-im/status-go/t/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestTxQueueTestSuite(t *testing.T) {
|
|
||||||
suite.Run(t, new(TxQueueTestSuite))
|
|
||||||
}
|
|
||||||
|
|
||||||
type TxQueueTestSuite struct {
|
type TxQueueTestSuite struct {
|
||||||
suite.Suite
|
suite.Suite
|
||||||
nodeManagerMockCtrl *gomock.Controller
|
rpcClientMockCtrl *gomock.Controller
|
||||||
nodeManagerMock *common.MockNodeManager
|
rpcClientMock *MocktestRPCClientProvider
|
||||||
server *gethrpc.Server
|
server *gethrpc.Server
|
||||||
client *gethrpc.Client
|
client *gethrpc.Client
|
||||||
txServiceMockCtrl *gomock.Controller
|
txServiceMockCtrl *gomock.Controller
|
||||||
|
@ -45,20 +41,20 @@ type TxQueueTestSuite struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *TxQueueTestSuite) SetupTest() {
|
func (s *TxQueueTestSuite) SetupTest() {
|
||||||
s.nodeManagerMockCtrl = gomock.NewController(s.T())
|
s.rpcClientMockCtrl = gomock.NewController(s.T())
|
||||||
s.txServiceMockCtrl = gomock.NewController(s.T())
|
s.txServiceMockCtrl = gomock.NewController(s.T())
|
||||||
|
|
||||||
s.nodeManagerMock = common.NewMockNodeManager(s.nodeManagerMockCtrl)
|
s.rpcClientMock = NewMocktestRPCClientProvider(s.rpcClientMockCtrl)
|
||||||
|
|
||||||
s.server, s.txServiceMock = fake.NewTestServer(s.txServiceMockCtrl)
|
s.server, s.txServiceMock = fake.NewTestServer(s.txServiceMockCtrl)
|
||||||
s.client = gethrpc.DialInProc(s.server)
|
s.client = gethrpc.DialInProc(s.server)
|
||||||
rpclient, _ := rpc.NewClient(s.client, params.UpstreamRPCConfig{})
|
rpclient, _ := rpc.NewClient(s.client, params.UpstreamRPCConfig{})
|
||||||
s.nodeManagerMock.EXPECT().RPCClient().Return(rpclient)
|
s.rpcClientMock.EXPECT().RPCClient().Return(rpclient)
|
||||||
nodeConfig, err := params.NewNodeConfig("/tmp", "", params.RopstenNetworkID, true)
|
nodeConfig, err := params.NewNodeConfig("/tmp", "", params.RopstenNetworkID, true)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.nodeConfig = nodeConfig
|
s.nodeConfig = nodeConfig
|
||||||
|
|
||||||
s.manager = NewManager(s.nodeManagerMock)
|
s.manager = NewManager(s.rpcClientMock)
|
||||||
s.manager.DisableNotificactions()
|
s.manager.DisableNotificactions()
|
||||||
s.manager.completionTimeout = time.Second
|
s.manager.completionTimeout = time.Second
|
||||||
s.manager.rpcCallTimeout = time.Second
|
s.manager.rpcCallTimeout = time.Second
|
||||||
|
@ -67,7 +63,7 @@ func (s *TxQueueTestSuite) SetupTest() {
|
||||||
|
|
||||||
func (s *TxQueueTestSuite) TearDownTest() {
|
func (s *TxQueueTestSuite) TearDownTest() {
|
||||||
s.manager.Stop()
|
s.manager.Stop()
|
||||||
s.nodeManagerMockCtrl.Finish()
|
s.rpcClientMockCtrl.Finish()
|
||||||
s.txServiceMockCtrl.Finish()
|
s.txServiceMockCtrl.Finish()
|
||||||
s.server.Stop()
|
s.server.Stop()
|
||||||
s.client.Close()
|
s.client.Close()
|
||||||
|
|
|
@ -73,7 +73,7 @@ func (s *APIBackendTestSuite) TestRaceConditions() {
|
||||||
log.Info("NodeManager()")
|
log.Info("NodeManager()")
|
||||||
instance := s.Backend.NodeManager()
|
instance := s.Backend.NodeManager()
|
||||||
s.NotNil(instance)
|
s.NotNil(instance)
|
||||||
s.IsType(&node.NodeManager{}, instance)
|
s.IsType(&node.Manager{}, instance)
|
||||||
s.T().Logf("NodeManager(), result: %v", instance)
|
s.T().Logf("NodeManager(), result: %v", instance)
|
||||||
progress <- struct{}{}
|
progress <- struct{}{}
|
||||||
},
|
},
|
||||||
|
|
|
@ -36,7 +36,7 @@ type JailTestSuite struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *JailTestSuite) SetupTest() {
|
func (s *JailTestSuite) SetupTest() {
|
||||||
s.NodeManager = node.NewNodeManager()
|
s.NodeManager = node.NewManager()
|
||||||
s.Jail = jail.New(s.NodeManager)
|
s.Jail = jail.New(s.NodeManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ type ManagerTestSuite struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ManagerTestSuite) SetupTest() {
|
func (s *ManagerTestSuite) SetupTest() {
|
||||||
s.NodeManager = node.NewNodeManager()
|
s.NodeManager = node.NewManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ManagerTestSuite) TestReferencesWithoutStartedNode() {
|
func (s *ManagerTestSuite) TestReferencesWithoutStartedNode() {
|
||||||
|
|
|
@ -19,7 +19,7 @@ func TestRPCClientTestSuite(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *RPCClientTestSuite) SetupTest() {
|
func (s *RPCClientTestSuite) SetupTest() {
|
||||||
s.NodeManager = node.NewNodeManager()
|
s.NodeManager = node.NewManager()
|
||||||
s.NotNil(s.NodeManager)
|
s.NotNil(s.NodeManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ type RPCTestSuite struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *RPCTestSuite) SetupTest() {
|
func (s *RPCTestSuite) SetupTest() {
|
||||||
s.NodeManager = node.NewNodeManager()
|
s.NodeManager = node.NewManager()
|
||||||
s.NotNil(s.NodeManager)
|
s.NotNil(s.NodeManager)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ import (
|
||||||
// NodeManagerTestSuite defines a test suit with NodeManager.
|
// NodeManagerTestSuite defines a test suit with NodeManager.
|
||||||
type NodeManagerTestSuite struct {
|
type NodeManagerTestSuite struct {
|
||||||
suite.Suite
|
suite.Suite
|
||||||
NodeManager *node.NodeManager
|
NodeManager *node.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
// All general log messages in this package should be routed through this logger.
|
// All general log messages in this package should be routed through this logger.
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
gethcommon "github.com/ethereum/go-ethereum/common"
|
gethcommon "github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/status-im/status-go/geth/common"
|
"github.com/status-im/status-go/geth/node"
|
||||||
"github.com/status-im/status-go/geth/params"
|
"github.com/status-im/status-go/geth/params"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ func WithDataDir(path string) TestNodeOption {
|
||||||
}
|
}
|
||||||
|
|
||||||
// FirstBlockHash validates Attach operation for the NodeManager.
|
// FirstBlockHash validates Attach operation for the NodeManager.
|
||||||
func FirstBlockHash(nodeManager common.NodeManager) (string, error) {
|
func FirstBlockHash(nodeManager *node.Manager) (string, error) {
|
||||||
// obtain RPC client for running node
|
// obtain RPC client for running node
|
||||||
runningNode, err := nodeManager.Node()
|
runningNode, err := nodeManager.Node()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -21,7 +21,7 @@ type MailServiceSuite struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MailServiceSuite) SetupTest() {
|
func (s *MailServiceSuite) SetupTest() {
|
||||||
s.NodeManager = node.NewNodeManager()
|
s.NodeManager = node.NewManager()
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestShhRequestMessagesRPCMethodAvailability tests if `shh_requestMessages` is available
|
// TestShhRequestMessagesRPCMethodAvailability tests if `shh_requestMessages` is available
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/les"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
"github.com/status-im/status-go/geth/common"
|
"github.com/status-im/status-go/geth/common"
|
||||||
"github.com/status-im/status-go/geth/params"
|
"github.com/status-im/status-go/geth/params"
|
||||||
|
@ -95,10 +96,22 @@ func LoadFromFile(filename string) string {
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LightEthereumProvider interface to be used on EnsureNodeSync
|
||||||
|
// TODO (adriacidre) This interface name should be reviewed as it has a lot
|
||||||
|
// of unrelated methods.
|
||||||
|
type LightEthereumProvider interface {
|
||||||
|
// NodeConfig returns reference to running node's configuration
|
||||||
|
NodeConfig() (*params.NodeConfig, error)
|
||||||
|
// LightEthereumService exposes reference to LES service running on top of the node
|
||||||
|
LightEthereumService() (*les.LightEthereum, error)
|
||||||
|
// PeerCount returns number of connected peers
|
||||||
|
PeerCount() int
|
||||||
|
}
|
||||||
|
|
||||||
// EnsureNodeSync waits until node synchronzation is done to continue
|
// EnsureNodeSync waits until node synchronzation is done to continue
|
||||||
// with tests afterwards. Panics in case of an error or a timeout.
|
// with tests afterwards. Panics in case of an error or a timeout.
|
||||||
func EnsureNodeSync(nodeManager common.NodeManager) {
|
func EnsureNodeSync(lesProvider LightEthereumProvider) {
|
||||||
nc, err := nodeManager.NodeConfig()
|
nc, err := lesProvider.NodeConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("can't retrieve NodeConfig")
|
panic("can't retrieve NodeConfig")
|
||||||
}
|
}
|
||||||
|
@ -107,7 +120,7 @@ func EnsureNodeSync(nodeManager common.NodeManager) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
les, err := nodeManager.LightEthereumService()
|
les, err := lesProvider.LightEthereumService()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -129,7 +142,7 @@ func EnsureNodeSync(nodeManager common.NodeManager) {
|
||||||
if downloader == nil {
|
if downloader == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if nodeManager.PeerCount() == 0 {
|
if lesProvider.PeerCount() == 0 {
|
||||||
logger.Debug("No establishished connections with a peers, continue waiting for a sync")
|
logger.Debug("No establishished connections with a peers, continue waiting for a sync")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue