forked from TrueCloudLab/neoneo-go
1518019be8
Some commands don't accept arguments, but users try giving them and don't notice a mistake. It's a bit more user-friendly to tell the user that there is something wrong with the way he tries to use the command.
155 lines
5.1 KiB
Go
155 lines
5.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"math/big"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// Register standby validator and vote for it.
|
|
// We don't create a new account here, because chain will
|
|
// stop working after validator will change.
|
|
func TestRegisterCandidate(t *testing.T) {
|
|
e := newExecutor(t, true)
|
|
|
|
validatorHex := hex.EncodeToString(validatorPriv.PublicKey().Bytes())
|
|
|
|
e.In.WriteString("one\r")
|
|
e.Run(t, "neo-go", "wallet", "nep17", "multitransfer",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--from", validatorAddr,
|
|
"--force",
|
|
"NEO:"+validatorPriv.Address()+":10",
|
|
"GAS:"+validatorPriv.Address()+":10000")
|
|
e.checkTxPersisted(t)
|
|
|
|
e.Run(t, "neo-go", "query", "committee",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr)
|
|
e.checkNextLine(t, "^\\s*"+validatorHex)
|
|
|
|
e.Run(t, "neo-go", "query", "candidates",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr)
|
|
e.checkNextLine(t, "^\\s*Key.+$") // Header.
|
|
e.checkEOF(t)
|
|
|
|
// missing address
|
|
e.RunWithError(t, "neo-go", "wallet", "candidate", "register",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet)
|
|
|
|
// additional parameter
|
|
e.RunWithError(t, "neo-go", "wallet", "candidate", "register",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address(),
|
|
"error")
|
|
|
|
e.In.WriteString("one\r")
|
|
e.Run(t, "neo-go", "wallet", "candidate", "register",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address())
|
|
e.checkTxPersisted(t)
|
|
|
|
vs, err := e.Chain.GetEnrollments()
|
|
require.NoError(t, err)
|
|
require.Equal(t, 1, len(vs))
|
|
require.Equal(t, validatorPriv.PublicKey(), vs[0].Key)
|
|
require.Equal(t, big.NewInt(0), vs[0].Votes)
|
|
|
|
t.Run("VoteUnvote", func(t *testing.T) {
|
|
// positional instead of a flag.
|
|
e.RunWithError(t, "neo-go", "wallet", "candidate", "vote",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address(),
|
|
validatorHex) // not "--candidate hex", but "hex".
|
|
|
|
e.In.WriteString("one\r")
|
|
e.Run(t, "neo-go", "wallet", "candidate", "vote",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address(),
|
|
"--candidate", validatorHex)
|
|
_, index := e.checkTxPersisted(t)
|
|
|
|
vs, err = e.Chain.GetEnrollments()
|
|
require.Equal(t, 1, len(vs))
|
|
require.Equal(t, validatorPriv.PublicKey(), vs[0].Key)
|
|
b, _ := e.Chain.GetGoverningTokenBalance(validatorPriv.GetScriptHash())
|
|
require.Equal(t, b, vs[0].Votes)
|
|
|
|
e.Run(t, "neo-go", "query", "committee",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr)
|
|
e.checkNextLine(t, "^\\s*"+validatorHex)
|
|
|
|
e.Run(t, "neo-go", "query", "candidates",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr)
|
|
e.checkNextLine(t, "^\\s*Key.+$") // Header.
|
|
e.checkNextLine(t, "^\\s*"+validatorHex+"\\s*"+b.String()+"\\s*true\\s*true$")
|
|
e.checkEOF(t)
|
|
|
|
// check state
|
|
e.Run(t, "neo-go", "query", "voter",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
validatorPriv.Address())
|
|
e.checkNextLine(t, "^\\s*Voted:\\s+"+validatorHex+"\\s+\\("+validatorPriv.Address()+"\\)$")
|
|
e.checkNextLine(t, "^\\s*Amount\\s*:\\s*"+b.String()+"$")
|
|
e.checkNextLine(t, "^\\s*Block\\s*:\\s*"+strconv.FormatUint(uint64(index), 10))
|
|
e.checkEOF(t)
|
|
|
|
// unvote
|
|
e.In.WriteString("one\r")
|
|
e.Run(t, "neo-go", "wallet", "candidate", "vote",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address())
|
|
_, index = e.checkTxPersisted(t)
|
|
|
|
vs, err = e.Chain.GetEnrollments()
|
|
require.Equal(t, 1, len(vs))
|
|
require.Equal(t, validatorPriv.PublicKey(), vs[0].Key)
|
|
require.Equal(t, big.NewInt(0), vs[0].Votes)
|
|
|
|
// check state
|
|
e.Run(t, "neo-go", "query", "voter",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
validatorPriv.Address())
|
|
e.checkNextLine(t, "^\\s*Voted:\\s+"+"null") // no vote.
|
|
e.checkNextLine(t, "^\\s*Amount\\s*:\\s*"+b.String()+"$")
|
|
e.checkNextLine(t, "^\\s*Block\\s*:\\s*"+strconv.FormatUint(uint64(index), 10))
|
|
e.checkEOF(t)
|
|
})
|
|
|
|
// missing address
|
|
e.RunWithError(t, "neo-go", "wallet", "candidate", "unregister",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet)
|
|
// additional argument
|
|
e.RunWithError(t, "neo-go", "wallet", "candidate", "unregister",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address(),
|
|
"argument")
|
|
|
|
e.In.WriteString("one\r")
|
|
e.Run(t, "neo-go", "wallet", "candidate", "unregister",
|
|
"--rpc-endpoint", "http://"+e.RPC.Addr,
|
|
"--wallet", validatorWallet,
|
|
"--address", validatorPriv.Address())
|
|
e.checkTxPersisted(t)
|
|
|
|
vs, err = e.Chain.GetEnrollments()
|
|
require.Equal(t, 0, len(vs))
|
|
|
|
// query voter: missing address
|
|
e.RunWithError(t, "neo-go", "query", "voter")
|
|
// Excessive parameters.
|
|
e.RunWithError(t, "neo-go", "query", "voter", "--rpc-endpoint", "http://"+e.RPC.Addr, validatorPriv.Address(), validatorPriv.Address())
|
|
e.RunWithError(t, "neo-go", "query", "committee", "--rpc-endpoint", "http://"+e.RPC.Addr, "something")
|
|
e.RunWithError(t, "neo-go", "query", "candidates", "--rpc-endpoint", "http://"+e.RPC.Addr, "something")
|
|
}
|