cosmos-sdk/cmd/gaia/cli_test/cli_test.go

324 lines
12 KiB
Go
Raw Normal View History

2018-04-18 11:06:49 -07:00
package clitest
2018-04-13 13:08:06 -07:00
import (
"encoding/json"
"fmt"
"os"
2018-04-13 13:08:06 -07:00
"testing"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/crypto"
cmn "github.com/tendermint/tendermint/libs/common"
"github.com/cosmos/cosmos-sdk/client/keys"
2018-04-16 16:49:00 -07:00
"github.com/cosmos/cosmos-sdk/cmd/gaia/app"
2018-04-13 16:45:26 -07:00
"github.com/cosmos/cosmos-sdk/server"
2018-04-13 13:08:06 -07:00
"github.com/cosmos/cosmos-sdk/tests"
sdk "github.com/cosmos/cosmos-sdk/types"
2018-04-25 13:38:13 -07:00
"github.com/cosmos/cosmos-sdk/wire"
2018-04-13 16:45:26 -07:00
"github.com/cosmos/cosmos-sdk/x/auth"
2018-06-21 17:19:14 -07:00
"github.com/cosmos/cosmos-sdk/x/gov"
2018-04-16 16:49:00 -07:00
"github.com/cosmos/cosmos-sdk/x/stake"
2018-04-13 13:08:06 -07:00
)
var (
pass = "1234567890"
gaiadHome = ""
gaiacliHome = ""
)
2018-04-16 16:17:09 -07:00
func init() {
gaiadHome, gaiacliHome = getTestingHomeDirs()
}
2018-04-16 16:17:09 -07:00
func TestGaiaCLISend(t *testing.T) {
tests.ExecuteT(t, fmt.Sprintf("gaiad --home=%s unsafe_reset_all", gaiadHome))
executeWrite(t, fmt.Sprintf("gaiacli keys delete --home=%s foo", gaiacliHome), pass)
executeWrite(t, fmt.Sprintf("gaiacli keys delete --home=%s bar", gaiacliHome), pass)
2018-07-05 10:14:12 -07:00
chainID := executeInit(t, fmt.Sprintf("gaiad init -o --name=foo --home=%s --home-client=%s", gaiadHome, gaiacliHome))
executeWrite(t, fmt.Sprintf("gaiacli keys add --home=%s bar", gaiacliHome), pass)
// get a free port, also setup some common flags
servAddr, port, err := server.FreeTCPAddr()
require.NoError(t, err)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
// start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
2018-04-16 16:17:09 -07:00
2018-05-31 04:16:05 -07:00
defer proc.Stop(false)
tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port)
2018-04-16 16:17:09 -07:00
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome))
barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
2018-07-09 02:05:19 -07:00
2018-07-06 00:06:53 -07:00
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64())
2018-04-16 16:17:09 -07:00
2018-07-06 00:06:53 -07:00
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo", flags, barAddr), pass)
tests.WaitForNextNBlocksTM(2, port)
2018-04-16 16:17:09 -07:00
2018-07-06 00:06:53 -07:00
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags))
require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64())
2018-07-06 00:06:53 -07:00
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64())
// test autosequencing
2018-07-06 00:06:53 -07:00
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo", flags, barAddr), pass)
tests.WaitForNextNBlocksTM(2, port)
2018-07-06 00:06:53 -07:00
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags))
require.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak").Int64())
2018-07-06 00:06:53 -07:00
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak").Int64())
// test memo
2018-07-06 00:06:53 -07:00
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo --memo 'testmemo'", flags, barAddr), pass)
tests.WaitForNextNBlocksTM(2, port)
2018-07-06 00:06:53 -07:00
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags))
require.Equal(t, int64(30), barAcc.GetCoins().AmountOf("steak").Int64())
2018-07-06 00:06:53 -07:00
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf("steak").Int64())
2018-04-16 16:49:00 -07:00
}
2018-04-16 16:17:09 -07:00
2018-05-31 12:10:12 -07:00
func TestGaiaCLICreateValidator(t *testing.T) {
tests.ExecuteT(t, fmt.Sprintf("gaiad --home=%s unsafe_reset_all", gaiadHome))
executeWrite(t, fmt.Sprintf("gaiacli keys delete --home=%s foo", gaiacliHome), pass)
executeWrite(t, fmt.Sprintf("gaiacli keys delete --home=%s bar", gaiacliHome), pass)
2018-07-05 10:14:12 -07:00
chainID := executeInit(t, fmt.Sprintf("gaiad init -o --name=foo --home=%s --home-client=%s", gaiadHome, gaiacliHome))
executeWrite(t, fmt.Sprintf("gaiacli keys add --home=%s bar", gaiacliHome), pass)
// get a free port, also setup some common flags
servAddr, port, err := server.FreeTCPAddr()
require.NoError(t, err)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
// start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
2018-05-31 04:16:05 -07:00
defer proc.Stop(false)
tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port)
2018-04-13 13:08:06 -07:00
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome))
barAddr, barPubKey := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
barCeshPubKey := sdk.MustBech32ifyValPub(barPubKey)
2018-07-09 02:05:19 -07:00
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%s --from=foo", flags, barAddr), pass)
tests.WaitForNextNBlocksTM(2, port)
2018-04-25 13:38:13 -07:00
2018-07-06 00:06:53 -07:00
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags))
require.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak").Int64())
2018-07-06 00:06:53 -07:00
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak").Int64())
2018-05-31 12:10:12 -07:00
2018-05-31 12:22:46 -07:00
// create validator
cvStr := fmt.Sprintf("gaiacli stake create-validator %v", flags)
2018-07-09 02:05:19 -07:00
cvStr += fmt.Sprintf(" --from=%s", "bar")
cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey)
2018-05-31 15:49:18 -07:00
cvStr += fmt.Sprintf(" --amount=%v", "2steak")
2018-05-31 12:10:12 -07:00
cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally")
executeWrite(t, cvStr, pass)
tests.WaitForNextNBlocksTM(2, port)
2018-05-31 12:10:12 -07:00
2018-07-06 00:06:53 -07:00
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", barAddr, flags))
require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc)
2018-05-31 12:10:12 -07:00
2018-07-06 00:06:53 -07:00
validator := executeGetValidator(t, fmt.Sprintf("gaiacli stake validator %s --output=json %v", barAddr, flags))
require.Equal(t, validator.Owner, barAddr)
require.True(sdk.RatEq(t, sdk.NewRat(2), validator.Tokens))
// unbond a single share
unbondStr := fmt.Sprintf("gaiacli stake unbond begin %v", flags)
2018-07-09 02:05:19 -07:00
unbondStr += fmt.Sprintf(" --from=%s", "bar")
2018-07-06 00:06:53 -07:00
unbondStr += fmt.Sprintf(" --address-validator=%s", barAddr)
unbondStr += fmt.Sprintf(" --shares-amount=%v", "1")
2018-05-31 15:49:18 -07:00
success := executeWrite(t, unbondStr, pass)
require.True(t, success)
tests.WaitForNextNBlocksTM(2, port)
2018-05-31 15:49:18 -07:00
/* // this won't be what we expect because we've only started unbonding, haven't completed
2018-05-31 15:49:18 -07:00
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags))
require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak").Int64(), "%v", barAcc)
*/
2018-07-06 00:06:53 -07:00
validator = executeGetValidator(t, fmt.Sprintf("gaiacli stake validator %s --output=json %v", barAddr, flags))
require.Equal(t, "1/1", validator.Tokens.String())
2018-04-14 00:16:49 -07:00
}
2018-04-13 13:08:06 -07:00
2018-06-21 17:19:14 -07:00
func TestGaiaCLISubmitProposal(t *testing.T) {
tests.ExecuteT(t, fmt.Sprintf("gaiad --home=%s unsafe_reset_all", gaiadHome))
executeWrite(t, fmt.Sprintf("gaiacli keys delete --home=%s foo", gaiacliHome), pass)
executeWrite(t, fmt.Sprintf("gaiacli keys delete --home=%s bar", gaiacliHome), pass)
2018-07-05 10:14:12 -07:00
chainID := executeInit(t, fmt.Sprintf("gaiad init -o --name=foo --home=%s --home-client=%s", gaiadHome, gaiacliHome))
executeWrite(t, fmt.Sprintf("gaiacli keys add --home=%s bar", gaiacliHome), pass)
// get a free port, also setup some common flags
servAddr, port, err := server.FreeTCPAddr()
require.NoError(t, err)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
// start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
2018-06-21 17:19:14 -07:00
defer proc.Stop(false)
tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port)
2018-06-21 17:19:14 -07:00
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome))
2018-06-21 17:19:14 -07:00
2018-07-06 00:06:53 -07:00
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak").Int64())
2018-06-21 17:19:14 -07:00
// unbond a single share
spStr := fmt.Sprintf("gaiacli gov submit-proposal %v", flags)
spStr += fmt.Sprintf(" --from=%s", "foo")
spStr += fmt.Sprintf(" --deposit=%s", "5steak")
spStr += fmt.Sprintf(" --type=%s", "Text")
spStr += fmt.Sprintf(" --title=%s", "Test")
spStr += fmt.Sprintf(" --description=%s", "test")
executeWrite(t, spStr, pass)
tests.WaitForNextNBlocksTM(2, port)
2018-06-21 17:19:14 -07:00
2018-07-06 00:06:53 -07:00
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf("steak").Int64())
2018-06-21 17:19:14 -07:00
proposal1 := executeGetProposal(t, fmt.Sprintf("gaiacli gov query-proposal --proposalID=1 --output=json %v", flags))
2018-07-10 17:59:07 -07:00
require.Equal(t, int64(1), proposal1.GetProposalID())
require.Equal(t, gov.StatusDepositPeriod, proposal1.GetStatus())
2018-06-21 17:19:14 -07:00
depositStr := fmt.Sprintf("gaiacli gov deposit %v", flags)
depositStr += fmt.Sprintf(" --from=%s", "foo")
depositStr += fmt.Sprintf(" --deposit=%s", "10steak")
depositStr += fmt.Sprintf(" --proposalID=%s", "1")
executeWrite(t, depositStr, pass)
tests.WaitForNextNBlocksTM(2, port)
2018-06-21 17:19:14 -07:00
2018-07-06 00:06:53 -07:00
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %s %v", fooAddr, flags))
require.Equal(t, int64(35), fooAcc.GetCoins().AmountOf("steak").Int64())
2018-06-21 17:19:14 -07:00
proposal1 = executeGetProposal(t, fmt.Sprintf("gaiacli gov query-proposal --proposalID=1 --output=json %v", flags))
2018-07-10 17:59:07 -07:00
require.Equal(t, int64(1), proposal1.GetProposalID())
require.Equal(t, gov.StatusVotingPeriod, proposal1.GetStatus())
2018-06-21 17:19:14 -07:00
voteStr := fmt.Sprintf("gaiacli gov vote %v", flags)
voteStr += fmt.Sprintf(" --from=%s", "foo")
voteStr += fmt.Sprintf(" --proposalID=%s", "1")
voteStr += fmt.Sprintf(" --option=%s", "Yes")
executeWrite(t, voteStr, pass)
tests.WaitForNextNBlocksTM(2, port)
2018-06-21 17:19:14 -07:00
vote := executeGetVote(t, fmt.Sprintf("gaiacli gov query-vote --proposalID=1 --voter=%s --output=json %v", fooAddr, flags))
require.Equal(t, int64(1), vote.ProposalID)
2018-07-10 17:59:07 -07:00
require.Equal(t, gov.OptionYes, vote.Option)
2018-06-21 17:19:14 -07:00
}
//___________________________________________________________________________________
// helper methods
func getTestingHomeDirs() (string, string) {
tmpDir := os.TempDir()
gaiadHome := fmt.Sprintf("%s%s.test_gaiad", tmpDir, string(os.PathSeparator))
gaiacliHome := fmt.Sprintf("%s%s.test_gaiacli", tmpDir, string(os.PathSeparator))
return gaiadHome, gaiacliHome
}
2018-05-31 12:10:12 -07:00
//___________________________________________________________________________________
// executors
func executeWrite(t *testing.T, cmdStr string, writes ...string) bool {
2018-05-31 04:16:05 -07:00
proc := tests.GoExecuteT(t, cmdStr)
2018-04-16 16:17:09 -07:00
for _, write := range writes {
2018-05-31 04:16:05 -07:00
_, err := proc.StdinPipe.Write([]byte(write + "\n"))
2018-04-16 16:17:09 -07:00
require.NoError(t, err)
}
stdout, stderr, err := proc.ReadAll()
if err != nil {
fmt.Println("Err on proc.ReadAll()", err, cmdStr)
}
// Log output.
if len(stdout) > 0 {
t.Log("Stdout:", cmn.Green(string(stdout)))
}
if len(stderr) > 0 {
t.Log("Stderr:", cmn.Red(string(stderr)))
}
2018-05-31 04:16:05 -07:00
proc.Wait()
return proc.ExitState.Success()
2018-06-13 17:41:01 -07:00
// bz := proc.StdoutBuffer.Bytes()
// fmt.Println("EXEC WRITE", string(bz))
2018-04-14 00:16:49 -07:00
}
2018-04-13 13:08:06 -07:00
2018-04-25 21:27:40 -07:00
func executeInit(t *testing.T, cmdStr string) (chainID string) {
2018-04-25 13:38:13 -07:00
out := tests.ExecuteT(t, cmdStr)
2018-04-13 16:45:26 -07:00
2018-04-14 00:16:49 -07:00
var initRes map[string]json.RawMessage
2018-04-21 21:57:53 -07:00
err := json.Unmarshal([]byte(out), &initRes)
2018-04-14 10:06:54 -07:00
require.NoError(t, err)
2018-04-21 21:57:53 -07:00
2018-04-14 10:06:54 -07:00
err = json.Unmarshal(initRes["chain_id"], &chainID)
require.NoError(t, err)
2018-04-21 21:57:53 -07:00
2018-04-14 00:16:49 -07:00
return
}
2018-07-06 00:06:53 -07:00
func executeGetAddrPK(t *testing.T, cmdStr string) (sdk.AccAddress, crypto.PubKey) {
2018-04-25 13:38:13 -07:00
out := tests.ExecuteT(t, cmdStr)
2018-04-20 09:51:47 -07:00
var ko keys.KeyOutput
keys.UnmarshalJSON([]byte(out), &ko)
2018-05-31 12:10:12 -07:00
pk, err := sdk.GetAccPubKeyBech32(ko.PubKey)
require.NoError(t, err)
2018-07-06 00:06:53 -07:00
return ko.Address, pk
2018-04-13 16:45:26 -07:00
}
2018-04-14 00:16:49 -07:00
func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount {
2018-04-25 13:38:13 -07:00
out := tests.ExecuteT(t, cmdStr)
2018-04-13 16:45:26 -07:00
var initRes map[string]json.RawMessage
2018-04-14 00:16:49 -07:00
err := json.Unmarshal([]byte(out), &initRes)
require.NoError(t, err, "out %v, err %v", out, err)
2018-04-13 16:45:26 -07:00
value := initRes["value"]
var acc auth.BaseAccount
2018-04-25 13:38:13 -07:00
cdc := wire.NewCodec()
wire.RegisterCrypto(cdc)
err = cdc.UnmarshalJSON(value, &acc)
2018-04-13 16:45:26 -07:00
require.NoError(t, err, "value %v, err %v", string(value), err)
return acc
2018-04-13 13:08:06 -07:00
}
2018-04-16 16:49:00 -07:00
2018-05-31 12:10:12 -07:00
func executeGetValidator(t *testing.T, cmdStr string) stake.Validator {
2018-04-25 13:38:13 -07:00
out := tests.ExecuteT(t, cmdStr)
2018-05-31 12:10:12 -07:00
var validator stake.Validator
2018-04-16 16:49:00 -07:00
cdc := app.MakeCodec()
2018-05-31 12:10:12 -07:00
err := cdc.UnmarshalJSON([]byte(out), &validator)
2018-05-31 14:45:07 -07:00
require.NoError(t, err, "out %v\n, err %v", out, err)
2018-05-31 12:10:12 -07:00
return validator
2018-04-16 16:49:00 -07:00
}
2018-06-21 17:19:14 -07:00
2018-07-10 17:59:07 -07:00
func executeGetProposal(t *testing.T, cmdStr string) gov.Proposal {
2018-06-21 17:19:14 -07:00
out := tests.ExecuteT(t, cmdStr)
2018-07-10 17:59:07 -07:00
var proposal gov.Proposal
2018-06-21 17:19:14 -07:00
cdc := app.MakeCodec()
err := cdc.UnmarshalJSON([]byte(out), &proposal)
require.NoError(t, err, "out %v\n, err %v", out, err)
return proposal
}
2018-07-10 17:59:07 -07:00
func executeGetVote(t *testing.T, cmdStr string) gov.Vote {
2018-06-21 17:19:14 -07:00
out := tests.ExecuteT(t, cmdStr)
2018-07-10 17:59:07 -07:00
var vote gov.Vote
2018-06-21 17:19:14 -07:00
cdc := app.MakeCodec()
err := cdc.UnmarshalJSON([]byte(out), &vote)
require.NoError(t, err, "out %v\n, err %v", out, err)
return vote
}