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

197 lines
7.2 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"
"testing"
"time"
2018-04-13 16:45:26 -07:00
"github.com/stretchr/testify/assert"
2018-04-13 13:08:06 -07:00
"github.com/stretchr/testify/require"
"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-04-16 16:49:00 -07:00
"github.com/cosmos/cosmos-sdk/x/stake"
crypto "github.com/tendermint/go-crypto"
2018-04-13 13:08:06 -07:00
)
2018-04-16 16:49:00 -07:00
func TestGaiaCLISend(t *testing.T) {
2018-04-16 16:17:09 -07:00
2018-04-25 13:38:13 -07:00
tests.ExecuteT(t, "gaiad unsafe_reset_all")
2018-04-16 16:49:00 -07:00
pass := "1234567890"
executeWrite(t, "gaiacli keys delete foo", pass)
executeWrite(t, "gaiacli keys delete bar", pass)
2018-04-25 21:27:40 -07:00
chainID := executeInit(t, "gaiad init -o --name=foo")
executeWrite(t, "gaiacli keys add bar", pass)
2018-04-16 16:17:09 -07:00
2018-04-16 16:49:00 -07:00
// get a free port, also setup some common flags
servAddr := server.FreeTCPAddr(t)
flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID)
2018-04-16 16:17:09 -07:00
2018-04-16 16:49:00 -07:00
// start gaiad server
2018-05-31 04:16:05 -07:00
proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr))
defer proc.Stop(false)
2018-04-16 16:17:09 -07:00
fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json")
barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json")
2018-04-16 16:17:09 -07:00
fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr)
if err != nil {
t.Error(err)
}
barBech, err := sdk.Bech32CosmosifyAcc(barAddr)
if err != nil {
t.Error(err)
}
2018-05-31 11:00:54 -07:00
time.Sleep(time.Second * 5) // Wait for RPC server to start.
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags))
2018-04-30 16:24:46 -07:00
assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak"))
2018-04-16 16:17:09 -07:00
2018-05-31 11:00:54 -07:00
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass)
2018-04-16 16:49:00 -07:00
time.Sleep(time.Second * 3) // waiting for some blocks to pass
2018-04-16 16:17:09 -07:00
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags))
2018-04-30 16:24:46 -07:00
assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak"))
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags))
2018-04-30 16:24:46 -07:00
assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak"))
// test autosequencing
2018-05-31 11:00:54 -07:00
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass)
time.Sleep(time.Second * 3) // waiting for some blocks to pass
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags))
assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak"))
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags))
assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak"))
2018-04-16 16:49:00 -07:00
}
2018-04-16 16:17:09 -07:00
func TestGaiaCLIDeclareCandidacy(t *testing.T) {
2018-04-13 13:08:06 -07:00
2018-04-25 13:38:13 -07:00
tests.ExecuteT(t, "gaiad unsafe_reset_all")
2018-04-14 00:16:49 -07:00
pass := "1234567890"
2018-04-16 13:47:28 -07:00
executeWrite(t, "gaiacli keys delete foo", pass)
2018-04-25 13:38:13 -07:00
executeWrite(t, "gaiacli keys delete bar", pass)
2018-04-25 21:27:40 -07:00
chainID := executeInit(t, "gaiad init -o --name=foo")
executeWrite(t, "gaiacli keys add bar", pass)
2018-04-13 13:08:06 -07:00
2018-04-14 00:16:49 -07:00
// get a free port, also setup some common flags
2018-04-13 16:45:26 -07:00
servAddr := server.FreeTCPAddr(t)
2018-04-14 00:16:49 -07:00
flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID)
2018-04-13 16:45:26 -07:00
2018-04-13 13:08:06 -07:00
// start gaiad server
2018-05-31 04:16:05 -07:00
proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr))
defer proc.Stop(false)
2018-04-13 13:08:06 -07:00
fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json")
barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json")
2018-04-25 13:38:13 -07:00
fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr)
if err != nil {
t.Error(err)
}
barBech, err := sdk.Bech32CosmosifyAcc(barAddr)
if err != nil {
t.Error(err)
}
valPrivkey := crypto.GenPrivKeyEd25519()
valAddr := sdk.Address((valPrivkey.PubKey().Address()))
bechVal, err := sdk.Bech32CosmosifyVal(valAddr)
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass)
time.Sleep(time.Second * 3) // waiting for some blocks to pass
2018-04-25 13:38:13 -07:00
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags))
2018-04-30 16:24:46 -07:00
assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak"))
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags))
2018-04-30 16:24:46 -07:00
assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak"))
2018-04-14 00:16:49 -07:00
// declare candidacy
declStr := fmt.Sprintf("gaiacli create-validator %v", flags)
declStr += fmt.Sprintf(" --name=%v", "bar")
declStr += fmt.Sprintf(" --validator-address=%v", bechVal)
2018-04-30 16:24:46 -07:00
declStr += fmt.Sprintf(" --amount=%v", "3steak")
declStr += fmt.Sprintf(" --moniker=%v", "bar-vally")
2018-05-31 04:16:05 -07:00
t.Log(fmt.Sprintf("debug declStr: %v\n", declStr))
2018-04-16 13:47:28 -07:00
executeWrite(t, declStr, pass)
2018-04-25 13:38:13 -07:00
time.Sleep(time.Second) // waiting for some blocks to pass
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags))
2018-04-30 16:24:46 -07:00
assert.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak"))
candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr))
assert.Equal(t, candidate.Owner.String(), barAddr)
assert.Equal(t, int64(3), candidate.PoolShares)
// TODO timeout issues if not connected to the internet
// unbond a single share
2018-04-21 21:57:53 -07:00
//unbondStr := fmt.Sprintf("gaiacli unbond %v", flags)
//unbondStr += fmt.Sprintf(" --name=%v", "bar")
//unbondStr += fmt.Sprintf(" --address-candidate=%v", barAddr)
//unbondStr += fmt.Sprintf(" --address-delegator=%v", barAddr)
2018-04-21 21:57:53 -07:00
//unbondStr += fmt.Sprintf(" --shares=%v", "1")
//unbondStr += fmt.Sprintf(" --sequence=%v", "1")
2018-05-31 04:16:05 -07:00
//t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr))
2018-04-21 21:57:53 -07:00
//executeWrite(t, unbondStr, pass)
//time.Sleep(time.Second * 3) // waiting for some blocks to pass
//barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags))
2018-04-30 16:24:46 -07:00
//assert.Equal(t, int64(99998), barAcc.GetCoins().AmountOf("steak"))
//candidate = executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr))
2018-05-04 12:38:25 -07:00
//assert.Equal(t, int64(2), candidate.BondedShares.Evaluate())
2018-04-14 00:16:49 -07:00
}
2018-04-13 13:08:06 -07:00
2018-04-16 13:47:28 -07:00
func executeWrite(t *testing.T, cmdStr string, writes ...string) {
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)
}
2018-05-31 04:16:05 -07:00
proc.Wait()
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
}
func executeGetAddrPK(t *testing.T, cmdStr string) (sdk.Address, 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)
return ko.Address, ko.PubKey
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
func executeGetCandidate(t *testing.T, cmdStr string) stake.Validator {
2018-04-25 13:38:13 -07:00
out := tests.ExecuteT(t, cmdStr)
var candidate stake.Validator
2018-04-16 16:49:00 -07:00
cdc := app.MakeCodec()
err := cdc.UnmarshalJSON([]byte(out), &candidate)
require.NoError(t, err, "out %v, err %v", out, err)
return candidate
}