erigon-pulse/cmd/devnet/args/node_args_test.go
battlmonstr 3698e7f476
devnet: configuration fixes (#8592)
* fix "genesis hash does not match" when dev nodes connect  
The "dev" nodes need to have the same --miner.etherbase in order to
generate the same genesis ExtraData by DeveloperGenesisBlock(). Override
DevnetEtherbase global var that's used if --miner.etherbase is not
passed. (for NonBlockProducer case)

* fix missing private key for the hardcoded DevnetEtherbase  
Fixes panic if SigKey is not found. Bor non-producers will use a default
`DevnetEtherbase` while Dev nodes modify it. Save hardcoded
DevnetEtherbase/DevnetSignPrivateKey into accounts so that SigKey can
recover it.

* refactor devnet.node to contain Node config  
This avoids interface{} type casts and fixes an error with
Heimdall.validatorSet == nil

* add connection retries to rpcCall and Subscribe of requestGenerator  
Fixes "connection refused" errors due to node not ready to handle early
RPC requests.

* fix deadlock in Heimdall.NodeStarted

* fix GetBlockByNumber
Fixes "cannot unmarshal string into Go struct field body.transactions of
type jsonrpc.RPCTransaction"

* demote "no of blocks on childchain is less than confirmations
required" to Info (#8626)

* demote "mismatched pending subpool size" to Debug (#8615)

* revert wiggle testing code
2023-11-01 11:08:47 +01:00

224 lines
6.8 KiB
Go

package args_test
import (
"errors"
"fmt"
"path/filepath"
"testing"
"github.com/ledgerwatch/erigon/cmd/devnet/args"
)
func TestNodeArgs(t *testing.T) {
asMap := map[string]struct{}{}
nodeArgs, _ := args.AsArgs(args.BlockProducer{
NodeArgs: args.NodeArgs{
DataDir: filepath.Join("data", fmt.Sprintf("%d", 1)),
PrivateApiAddr: "localhost:9092",
},
DevPeriod: 30,
})
for _, arg := range nodeArgs {
asMap[arg] = struct{}{}
}
for _, arg := range producingNodeArgs("data", 1) {
if _, ok := asMap[arg]; !ok {
t.Fatal(arg, "missing")
}
delete(asMap, arg)
}
if len(asMap) > 0 {
t.Fatal(asMap, "not found")
}
nodeArgs, _ = args.AsArgs(args.NonBlockProducer{
NodeArgs: args.NodeArgs{
DataDir: filepath.Join("data", fmt.Sprintf("%d", 2)),
StaticPeers: "enode",
PrivateApiAddr: "localhost:9091",
},
})
for _, arg := range nodeArgs {
asMap[arg] = struct{}{}
}
for _, arg := range nonProducingNodeArgs("data", 2, "enode") {
if _, ok := asMap[arg]; !ok {
t.Fatal(arg, "missing")
}
delete(asMap, arg)
}
if len(asMap) > 0 {
t.Fatal(asMap, "not found")
}
}
func TestParameterFromArgument(t *testing.T) {
enode := fmt.Sprintf("%q", "1234567")
testCases := []struct {
argInput string
paramInput string
expectedRes string
expectedErr error
}{
{"--datadir", "./dev", "--datadir=./dev", nil},
{"--chain", "dev", "--chain=dev", nil},
{"--dev.period", "30", "--dev.period=30", nil},
{"--staticpeers", enode, "--staticpeers=" + enode, nil},
{"", "30", "", errInvalidArgument},
}
for _, testCase := range testCases {
got, err := parameterFromArgument(testCase.argInput, testCase.paramInput)
if got != testCase.expectedRes {
t.Errorf("expected %s, got %s", testCase.expectedRes, got)
}
if err != testCase.expectedErr {
t.Errorf("expected error: %s, got error: %s", testCase.expectedErr, err)
}
}
}
// errInvalidArgument for invalid arguments
var errInvalidArgument = errors.New("invalid argument")
// ParameterFromArgument merges the argument and parameter and returns a flag input string
func parameterFromArgument(arg, param string) (string, error) {
if arg == "" {
return "", errInvalidArgument
}
return fmt.Sprintf("%s=%s", arg, param), nil
}
const (
// BuildDirArg is the build directory for the devnet executable
buildDirArg = "./build/bin/devnet"
// DataDirArg is the datadir flag
dataDirArg = "--datadir"
// ChainArg is the chain flag
chainArg = "--chain"
// DevPeriodArg is the dev.period flag
devPeriodArg = "--dev.period"
// ConsoleVerbosityArg is the log.console.verbosity flag
consoleVerbosityArg = "--log.console.verbosity"
// LogDirArg is the log.dir.path flag
logDirArg = "--log.dir.path"
// TorrentPortArg is the --torrent.port flag argument
torrentPortArg = "--torrent.port"
// Mine is the mine flag
mine = "--mine"
// NoDiscover is the nodiscover flag
noDiscover = "--nodiscover"
// PrivateApiAddrArg is the private.api.addr flag
privateApiAddrArg = "--private.api.addr"
// StaticPeersArg is the staticpeers flag
staticPeersArg = "--staticpeers"
// HttpApiArg is the http.api flag
httpApiArg = "--http.api"
// WSArg is the --ws flag for rpcdaemon
wsArg = "--ws"
// DataDirParam is the datadir parameter
dataDirParam = "./dev"
// ChainParam is the chain parameter
chainParam = "dev"
// DevPeriodParam is the dev.period parameter
devPeriodParam = "30"
// ConsoleVerbosityParam is the verbosity parameter for the console logs
consoleVerbosityParam = "0"
// LogDirParam is the log directory parameter for logging to disk
logDirParam = "./cmd/devnet/debug_logs"
// TorrentPortParam is the port parameter for the second node
torrentPortParam = "42070"
// PrivateApiParamMine is the private.api.addr parameter for the mining node
privateApiParamMine = "localhost:9092"
// PrivateApiParamNoMine is the private.api.addr parameter for the non-mining node
privateApiParamNoMine = "localhost:9091"
// HttpApiParam is the http.api default parameter for rpcdaemon
httpApiParam = "admin,eth,erigon,web3,net,debug,trace,txpool,parity,ots"
)
// miningNodeArgs returns custom args for starting a mining node
func producingNodeArgs(dataDir string, nodeNumber int) []string {
nodeDataDir := filepath.Join(dataDir, fmt.Sprintf("%d", nodeNumber))
dataDirArg, _ := parameterFromArgument(dataDirArg, nodeDataDir)
chainType, _ := parameterFromArgument(chainArg, chainParam)
devPeriod, _ := parameterFromArgument(devPeriodArg, devPeriodParam)
privateApiAddr, _ := parameterFromArgument(privateApiAddrArg, privateApiParamMine)
httpApi, _ := parameterFromArgument(httpApiArg, httpApiParam)
ws := wsArg
consoleVerbosity, _ := parameterFromArgument(consoleVerbosityArg, consoleVerbosityParam)
p2pProtocol, _ := parameterFromArgument("--p2p.protocol", "68")
downloaderArg, _ := parameterFromArgument("--no-downloader", "true")
httpPortArg, _ := parameterFromArgument("--http.port", "8545")
authrpcPortArg, _ := parameterFromArgument("--authrpc.port", "8551")
natArg, _ := parameterFromArgument("--nat", "none")
accountSlotsArg, _ := parameterFromArgument("--txpool.accountslots", "16")
withHeimdallMilestonesArg, _ := parameterFromArgument("--bor.milestone", "false")
return []string{
buildDirArg,
dataDirArg,
chainType,
privateApiAddr,
httpPortArg,
authrpcPortArg,
mine,
httpApi,
ws,
natArg,
devPeriod,
consoleVerbosity,
p2pProtocol,
downloaderArg,
accountSlotsArg,
withHeimdallMilestonesArg,
}
}
// nonMiningNodeArgs returns custom args for starting a non-mining node
func nonProducingNodeArgs(dataDir string, nodeNumber int, enode string) []string {
nodeDataDir := filepath.Join(dataDir, fmt.Sprintf("%d", nodeNumber))
dataDirArg, _ := parameterFromArgument(dataDirArg, nodeDataDir)
chainType, _ := parameterFromArgument(chainArg, chainParam)
privateApiAddr, _ := parameterFromArgument(privateApiAddrArg, privateApiParamNoMine)
staticPeers, _ := parameterFromArgument(staticPeersArg, enode)
consoleVerbosity, _ := parameterFromArgument(consoleVerbosityArg, consoleVerbosityParam)
torrentPort, _ := parameterFromArgument(torrentPortArg, torrentPortParam)
p2pProtocol, _ := parameterFromArgument("--p2p.protocol", "68")
downloaderArg, _ := parameterFromArgument("--no-downloader", "true")
httpPortArg, _ := parameterFromArgument("--http.port", "8545")
httpApi, _ := parameterFromArgument(httpApiArg, "admin,eth,debug,net,trace,web3,erigon,txpool")
authrpcPortArg, _ := parameterFromArgument("--authrpc.port", "8551")
natArg, _ := parameterFromArgument("--nat", "none")
ws := wsArg
withHeimdallMilestonesArg, _ := parameterFromArgument("--bor.milestone", "false")
return []string{
buildDirArg,
dataDirArg,
chainType,
privateApiAddr,
httpPortArg,
authrpcPortArg,
httpApi,
ws,
natArg,
staticPeers,
noDiscover,
consoleVerbosity,
torrentPort,
p2pProtocol,
downloaderArg,
withHeimdallMilestonesArg,
}
}