99 lines
3.0 KiB
Go
99 lines
3.0 KiB
Go
package devtests
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"crypto/sha256"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
"github.com/ethereum/go-ethereum/ethclient"
|
|
"github.com/ethereum/go-ethereum/node"
|
|
"github.com/ethereum/go-ethereum/rpc"
|
|
|
|
"github.com/status-im/status-go/api"
|
|
"github.com/status-im/status-go/eth-node/crypto"
|
|
"github.com/status-im/status-go/eth-node/types"
|
|
"github.com/status-im/status-go/multiaccounts"
|
|
"github.com/status-im/status-go/multiaccounts/accounts"
|
|
"github.com/status-im/status-go/params"
|
|
statusrpc "github.com/status-im/status-go/rpc"
|
|
"github.com/status-im/status-go/t/devtests/miner"
|
|
)
|
|
|
|
// DevNodeSuite provides convenient wrapper for starting node with clique backend for mining.
|
|
type DevNodeSuite struct {
|
|
suite.Suite
|
|
|
|
Remote *rpc.Client
|
|
Eth *ethclient.Client
|
|
Local *statusrpc.Client
|
|
DevAccount *ecdsa.PrivateKey
|
|
DevAccountAddress types.Address
|
|
|
|
dir string
|
|
backend *api.GethStatusBackend
|
|
miner *node.Node
|
|
}
|
|
|
|
// SetupTest creates clique node and status node with an rpc connection to a clique node.
|
|
func (s *DevNodeSuite) SetupTest() {
|
|
account, err := crypto.GenerateKey()
|
|
s.Require().NoError(err)
|
|
s.DevAccount = account
|
|
s.DevAccountAddress = crypto.PubkeyToAddress(account.PublicKey)
|
|
s.miner, err = miner.NewDevNode(common.Address(s.DevAccountAddress))
|
|
s.Require().NoError(err)
|
|
s.Require().NoError(miner.StartWithMiner(s.miner))
|
|
|
|
s.dir, err = ioutil.TempDir("", "devtests-")
|
|
s.Require().NoError(err)
|
|
config, err := params.NewNodeConfig(
|
|
s.dir,
|
|
1337,
|
|
)
|
|
networks := json.RawMessage("{}")
|
|
settings := accounts.Settings{Networks: &networks}
|
|
s.Require().NoError(err)
|
|
config.WakuConfig.Enabled = false
|
|
config.LightEthConfig.Enabled = false
|
|
config.UpstreamConfig.Enabled = true
|
|
config.WalletConfig.Enabled = true
|
|
config.UpstreamConfig.URL = s.miner.IPCEndpoint()
|
|
s.backend = api.NewGethStatusBackend()
|
|
s.Require().NoError(s.backend.AccountManager().InitKeystore(config.KeyStoreDir))
|
|
_, err = s.backend.AccountManager().ImportAccount(s.DevAccount, "test")
|
|
s.Require().NoError(err)
|
|
s.backend.UpdateRootDataDir(s.dir)
|
|
s.Require().NoError(s.backend.OpenAccounts())
|
|
keyUIDHex := sha256.Sum256(crypto.FromECDSAPub(&account.PublicKey))
|
|
keyUID := types.EncodeHex(keyUIDHex[:])
|
|
s.Require().NoError(s.backend.StartNodeWithAccountAndConfig(multiaccounts.Account{
|
|
Name: "main",
|
|
KeyUID: keyUID,
|
|
}, "test", settings, config, []accounts.Account{{Address: s.DevAccountAddress, Wallet: true, Chat: true}}))
|
|
s.Remote, err = s.miner.Attach()
|
|
s.Require().NoError(err)
|
|
s.Eth = ethclient.NewClient(s.Remote)
|
|
s.Local = s.backend.StatusNode().RPCClient()
|
|
}
|
|
|
|
// TearDownTest stops status node and clique node.
|
|
func (s *DevNodeSuite) TearDownTest() {
|
|
if s.miner != nil {
|
|
s.Require().NoError(s.miner.Stop())
|
|
s.miner = nil
|
|
}
|
|
if s.backend != nil {
|
|
s.Require().NoError(s.backend.Logout())
|
|
s.backend = nil
|
|
}
|
|
if len(s.dir) != 0 {
|
|
os.RemoveAll(s.dir)
|
|
s.dir = ""
|
|
}
|
|
}
|