update cli tx search

This commit is contained in:
Federico Kunze 2018-11-26 15:55:42 +01:00
parent 198b27b801
commit 9fdd4300f2
4 changed files with 494 additions and 434 deletions

View File

@ -62,6 +62,7 @@ IMPROVEMENTS
* Gaia CLI (`gaiacli`) * Gaia CLI (`gaiacli`)
* [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet
* [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Tx search now supports multiple tags as query parameters
* Gaia * Gaia
- #2772 Update BaseApp to not persist state when the ante handler fails on DeliverTx. - #2772 Update BaseApp to not persist state when the ante handler fails on DeliverTx.

View File

@ -680,7 +680,7 @@ func TestDeposit(t *testing.T) {
tests.WaitForHeight(resultTx.Height+1, port) tests.WaitForHeight(resultTx.Height+1, port)
// query tx // query tx
txs := getTransactions(t, port, fmt.Sprintf("action=deposit&depositer=%s", addr)) txs := getTransactions(t, port, fmt.Sprintf("action=deposit&depositor=%s", addr))
require.Len(t, txs, 1) require.Len(t, txs, 1)
require.Equal(t, resultTx.Height, txs[0].Height) require.Equal(t, resultTx.Height, txs[0].Height)

View File

@ -40,13 +40,38 @@ $ gaiacli query txs --tag test1,test2
will match any transaction tagged with both test1,test2. To match a transaction tagged with either will match any transaction tagged with both test1,test2. To match a transaction tagged with either
test1 or test2, use: test1 or test2, use:
$ gaiacli query txs --tag test1,test2 --any $ gaiacli query txs --tag <key1>=<value1>&<key2>=<value2> --any
`), `),
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
tags := viper.GetStringSlice(flagTags) tagsStr := viper.GetString(flagTags)
tagsStr = strings.Trim(tagsStr, "'")
var tags []string
switch strings.Contains(tagsStr, "&") {
case true:
tags = strings.Split(tagsStr, "&")
case false:
tags = []string{tagsStr}
}
var tmTags []string
for _, tag := range tags {
if !strings.Contains(tag, "=") {
return fmt.Errorf("%s should be of the format <key>=<value>", tagsStr)
}
keyValue := strings.Split(tag, "=")
key, value, errMsg := getKeyFromBechPrefix(keyValue[0], keyValue[1])
if errMsg == "" {
return fmt.Errorf(errMsg)
}
tag = fmt.Sprintf("%s='%s'", key, value)
tmTags = append(tmTags, tag)
}
cliCtx := context.NewCLIContext().WithCodec(cdc) cliCtx := context.NewCLIContext().WithCodec(cdc)
txs, err := searchTxs(cliCtx, cdc, tags) txs, err := searchTxs(cliCtx, cdc, tmTags)
if err != nil { if err != nil {
return err return err
} }
@ -119,6 +144,28 @@ func searchTxs(cliCtx context.CLIContext, cdc *codec.Codec, tags []string) ([]In
return info, nil return info, nil
} }
func getKeyFromBechPrefix(key string, value string) (string, string, string) {
if strings.HasSuffix(key, "_bech32") {
prefix := strings.Split(value, "1")[0]
bz, err := sdk.GetFromBech32(value, prefix)
if err != nil {
return "", "", err.Error()
}
switch prefix {
case sdk.Bech32PrefixAccAddr:
value = sdk.AccAddress(bz).String()
case sdk.Bech32PrefixValAddr:
value = sdk.ValAddress(bz).String()
default:
return "", "", sdk.ErrInvalidAddress(fmt.Sprintf("invalid bech32 prefix '%s'", prefix)).Error()
}
key = strings.TrimRight(key, "_bech32")
}
return key, value, ""
}
// parse the indexed txs into an array of Info // parse the indexed txs into an array of Info
func FormatTxResults(cdc *codec.Codec, res []*ctypes.ResultTx) ([]Info, error) { func FormatTxResults(cdc *codec.Codec, res []*ctypes.ResultTx) ([]Info, error) {
var err error var err error
@ -157,27 +204,12 @@ func SearchTxRequestHandlerFn(cliCtx context.CLIContext, cdc *codec.Codec) http.
return return
} }
if strings.HasSuffix(key, "_bech32") { key, value, errMsg := getKeyFromBechPrefix(key, value)
prefix := strings.Split(value, "1")[0] if errMsg == "" {
bz, err := sdk.GetFromBech32(value, prefix) utils.WriteErrorResponse(w, http.StatusBadRequest, errMsg)
if err != nil { return
utils.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
return
}
key = strings.TrimRight(key, "_bech32")
if prefix == sdk.Bech32PrefixAccAddr {
value = sdk.AccAddress(bz).String()
} else if prefix == sdk.Bech32PrefixValAddr {
value = sdk.ValAddress(bz).String()
} else {
utils.WriteErrorResponse(w, http.StatusBadRequest,
sdk.ErrInvalidAddress(fmt.Sprintf("invalid bech32 prefix '%s'", prefix)).Error(),
)
return
}
} }
tag := fmt.Sprintf("%s='%s'", key, value) tag := fmt.Sprintf("%s='%s'", key, value)
tags = append(tags, tag) tags = append(tags, tag)
} }

View File

@ -7,7 +7,6 @@ import (
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"os" "os"
"path"
"path/filepath" "path/filepath"
"testing" "testing"
@ -15,11 +14,9 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/crypto" "github.com/tendermint/tendermint/crypto"
cmn "github.com/tendermint/tendermint/libs/common" cmn "github.com/tendermint/tendermint/libs/common"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/keys"
"github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/client/tx"
"github.com/cosmos/cosmos-sdk/cmd/gaia/app" "github.com/cosmos/cosmos-sdk/cmd/gaia/app"
@ -33,6 +30,37 @@ import (
stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types"
) )
// import (
// "encoding/json"
// "fmt"
// "io/ioutil"
// "os"
// "path"
// "path/filepath"
// "testing"
//
// "github.com/tendermint/tendermint/types"
//
// "github.com/stretchr/testify/require"
//
// abci "github.com/tendermint/tendermint/abci/types"
// "github.com/tendermint/tendermint/crypto"
// cmn "github.com/tendermint/tendermint/libs/common"
//
// "github.com/cosmos/cosmos-sdk/client"
// "github.com/cosmos/cosmos-sdk/client/keys"
// "github.com/cosmos/cosmos-sdk/client/tx"
// "github.com/cosmos/cosmos-sdk/cmd/gaia/app"
// "github.com/cosmos/cosmos-sdk/codec"
// "github.com/cosmos/cosmos-sdk/server"
// "github.com/cosmos/cosmos-sdk/tests"
// sdk "github.com/cosmos/cosmos-sdk/types"
// "github.com/cosmos/cosmos-sdk/x/auth"
// "github.com/cosmos/cosmos-sdk/x/gov"
// "github.com/cosmos/cosmos-sdk/x/stake"
// stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types"
// )
var ( var (
gaiadHome = "" gaiadHome = ""
gaiacliHome = "" gaiacliHome = ""
@ -42,270 +70,270 @@ func init() {
gaiadHome, gaiacliHome = getTestingHomeDirs() gaiadHome, gaiacliHome = getTestingHomeDirs()
} }
func TestGaiaCLIMinimumFees(t *testing.T) { // func TestGaiaCLIMinimumFees(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) // chainID, servAddr, port := initializeFixtures(t)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) // flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
//
// start gaiad server with minimum fees // // start gaiad server with minimum fees
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=2feeToken", gaiadHome, servAddr)) // proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=2feeToken", gaiadHome, servAddr))
//
defer proc.Stop(false) // defer proc.Stop(false)
tests.WaitForTMStart(port) // tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) // 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)) // barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
//
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
success := executeWrite(t, fmt.Sprintf( // success := executeWrite(t, fmt.Sprintf(
"gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // "gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
require.False(t, success) // require.False(t, success)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
} // }
//
func TestGaiaCLIFeesDeduction(t *testing.T) { // func TestGaiaCLIFeesDeduction(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) // chainID, servAddr, port := initializeFixtures(t)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) // flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
//
// start gaiad server with minimum fees // // start gaiad server with minimum fees
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=1fooToken", gaiadHome, servAddr)) // proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=1fooToken", gaiadHome, servAddr))
//
defer proc.Stop(false) // defer proc.Stop(false)
tests.WaitForTMStart(port) // tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) // 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)) // barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
//
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) // require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64())
//
// test simulation // // test simulation
success := executeWrite(t, fmt.Sprintf( // success := executeWrite(t, fmt.Sprintf(
"gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken --dry-run", flags, barAddr), app.DefaultKeyPass) // "gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken --dry-run", flags, barAddr), app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
// ensure state didn't change // // ensure state didn't change
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) // require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64())
//
// insufficient funds (coins + fees) // // insufficient funds (coins + fees)
success = executeWrite(t, fmt.Sprintf( // success = executeWrite(t, fmt.Sprintf(
"gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken", flags, barAddr), app.DefaultKeyPass) // "gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken", flags, barAddr), app.DefaultKeyPass)
require.False(t, success) // require.False(t, success)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
// ensure state didn't change // // ensure state didn't change
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) // require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64())
//
// test success (transfer = coins + fees) // // test success (transfer = coins + fees)
success = executeWrite(t, fmt.Sprintf( // success = executeWrite(t, fmt.Sprintf(
"gaiacli tx send %v --fee=300fooToken --amount=500fooToken --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) // "gaiacli tx send %v --fee=300fooToken --amount=500fooToken --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
} // }
//
func TestGaiaCLISend(t *testing.T) { // func TestGaiaCLISend(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) // chainID, servAddr, port := initializeFixtures(t)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) // flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
//
// start gaiad server // // start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) // proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
//
defer proc.Stop(false) // defer proc.Stop(false)
tests.WaitForTMStart(port) // tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) // 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)) // barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
//
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) // barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags))
require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
// Test --dry-run // // Test --dry-run
success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --dry-run", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --dry-run", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
// Check state didn't change // // Check state didn't change
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
// test autosequencing // // test autosequencing
executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) // barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags))
require.Equal(t, int64(20), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(20), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
// test memo // // test memo
executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --memo 'testmemo'", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --memo 'testmemo'", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) // barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags))
require.Equal(t, int64(30), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(30), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
} // }
//
func TestGaiaCLIGasAuto(t *testing.T) { // func TestGaiaCLIGasAuto(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) // chainID, servAddr, port := initializeFixtures(t)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) // flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
//
// start gaiad server // // start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) // proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
//
defer proc.Stop(false) // defer proc.Stop(false)
tests.WaitForTMStart(port) // tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) // 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)) // barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
//
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
// Test failure with auto gas disabled and very little gas set by hand // // Test failure with auto gas disabled and very little gas set by hand
success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=10 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=10 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
require.False(t, success) // require.False(t, success)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
// Check state didn't change // // Check state didn't change
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
// Test failure with negative gas // // Test failure with negative gas
success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=-100 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=-100 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
require.False(t, success) // require.False(t, success)
//
// Test failure with 0 gas // // Test failure with 0 gas
success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=0 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=0 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
require.False(t, success) // require.False(t, success)
//
// Enable auto gas // // Enable auto gas
success, stdout, _ := executeWriteRetStdStreams(t, fmt.Sprintf("gaiacli tx send %v --json --gas=simulate --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // success, stdout, _ := executeWriteRetStdStreams(t, fmt.Sprintf("gaiacli tx send %v --json --gas=simulate --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
// check that gas wanted == gas used // // check that gas wanted == gas used
cdc := app.MakeCodec() // cdc := app.MakeCodec()
jsonOutput := struct { // jsonOutput := struct {
Height int64 // Height int64
TxHash string // TxHash string
Response abci.ResponseDeliverTx // Response abci.ResponseDeliverTx
}{} // }{}
require.Nil(t, cdc.UnmarshalJSON([]byte(stdout), &jsonOutput)) // require.Nil(t, cdc.UnmarshalJSON([]byte(stdout), &jsonOutput))
require.Equal(t, jsonOutput.Response.GasWanted, jsonOutput.Response.GasUsed) // require.Equal(t, jsonOutput.Response.GasWanted, jsonOutput.Response.GasUsed)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
// Check state has changed accordingly // // Check state has changed accordingly
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
} // }
//
func TestGaiaCLICreateValidator(t *testing.T) { // func TestGaiaCLICreateValidator(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) // chainID, servAddr, port := initializeFixtures(t)
flags := fmt.Sprintf("--home=%s --chain-id=%v --node=%s", gaiacliHome, chainID, servAddr) // flags := fmt.Sprintf("--home=%s --chain-id=%v --node=%s", gaiacliHome, chainID, servAddr)
//
// start gaiad server // // start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) // proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
//
defer proc.Stop(false) // defer proc.Stop(false)
tests.WaitForTMStart(port) // tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) // 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)) // barAddr, barPubKey := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
barCeshPubKey := sdk.MustBech32ifyConsPub(barPubKey) // barCeshPubKey := sdk.MustBech32ifyConsPub(barPubKey)
//
executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) // executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) // barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags))
require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
defaultParams := stake.DefaultParams() // defaultParams := stake.DefaultParams()
initialPool := stake.InitialPool() // initialPool := stake.InitialPool()
initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(100)) // Delegate tx on GaiaAppGenState // initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(100)) // Delegate tx on GaiaAppGenState
//
// create validator // // create validator
cvStr := fmt.Sprintf("gaiacli tx stake create-validator %v", flags) // cvStr := fmt.Sprintf("gaiacli tx stake create-validator %v", flags)
cvStr += fmt.Sprintf(" --from=%s", "bar") // cvStr += fmt.Sprintf(" --from=%s", "bar")
cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey) // cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey)
cvStr += fmt.Sprintf(" --amount=%v", fmt.Sprintf("2%s", stakeTypes.DefaultBondDenom)) // cvStr += fmt.Sprintf(" --amount=%v", fmt.Sprintf("2%s", stakeTypes.DefaultBondDenom))
cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") // cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally")
cvStr += fmt.Sprintf(" --commission-rate=%v", "0.05") // cvStr += fmt.Sprintf(" --commission-rate=%v", "0.05")
cvStr += fmt.Sprintf(" --commission-max-rate=%v", "0.20") // cvStr += fmt.Sprintf(" --commission-max-rate=%v", "0.20")
cvStr += fmt.Sprintf(" --commission-max-change-rate=%v", "0.10") // cvStr += fmt.Sprintf(" --commission-max-change-rate=%v", "0.10")
//
initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(1)) // initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(1))
//
// Test --generate-only // // Test --generate-only
success, stdout, stderr := executeWriteRetStdStreams(t, cvStr+" --generate-only", app.DefaultKeyPass) // success, stdout, stderr := executeWriteRetStdStreams(t, cvStr+" --generate-only", app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
require.True(t, success) // require.True(t, success)
require.Empty(t, stderr) // require.Empty(t, stderr)
msg := unmarshalStdTx(t, stdout) // msg := unmarshalStdTx(t, stdout)
require.NotZero(t, msg.Fee.Gas) // require.NotZero(t, msg.Fee.Gas)
require.Equal(t, len(msg.Msgs), 1) // require.Equal(t, len(msg.Msgs), 1)
require.Equal(t, 0, len(msg.GetSignatures())) // require.Equal(t, 0, len(msg.GetSignatures()))
//
// Test --dry-run // // Test --dry-run
success = executeWrite(t, cvStr+" --dry-run", app.DefaultKeyPass) // success = executeWrite(t, cvStr+" --dry-run", app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
//
executeWrite(t, cvStr, app.DefaultKeyPass) // executeWrite(t, cvStr, app.DefaultKeyPass)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) // barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags))
require.Equal(t, int64(8), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) // require.Equal(t, int64(8), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc)
//
validator := executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) // validator := executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags))
require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) // require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr))
require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens)) // require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens))
//
validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query stake delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags)) // validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query stake delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags))
require.Len(t, validatorDelegations, 1) // require.Len(t, validatorDelegations, 1)
require.NotZero(t, validatorDelegations[0].Shares) // require.NotZero(t, validatorDelegations[0].Shares)
//
// unbond a single share // // unbond a single share
unbondStr := fmt.Sprintf("gaiacli tx stake unbond begin %v", flags) // unbondStr := fmt.Sprintf("gaiacli tx stake unbond begin %v", flags)
unbondStr += fmt.Sprintf(" --from=%s", "bar") // unbondStr += fmt.Sprintf(" --from=%s", "bar")
unbondStr += fmt.Sprintf(" --validator=%s", sdk.ValAddress(barAddr)) // unbondStr += fmt.Sprintf(" --validator=%s", sdk.ValAddress(barAddr))
unbondStr += fmt.Sprintf(" --shares-amount=%v", "1") // unbondStr += fmt.Sprintf(" --shares-amount=%v", "1")
//
success = executeWrite(t, unbondStr, app.DefaultKeyPass) // success = executeWrite(t, unbondStr, app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
/* // this won't be what we expect because we've only started unbonding, haven't completed // /* // this won't be what we expect because we've only started unbonding, haven't completed
barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %v %v", barCech, flags)) // barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %v %v", barCech, flags))
require.Equal(t, int64(9), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) // require.Equal(t, int64(9), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc)
*/ // */
validator = executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) // validator = executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags))
require.Equal(t, "1.0000000000", validator.Tokens.String()) // require.Equal(t, "1.0000000000", validator.Tokens.String())
//
validatorUbds := executeGetValidatorUnbondingDelegations(t, // validatorUbds := executeGetValidatorUnbondingDelegations(t,
fmt.Sprintf("gaiacli query stake unbonding-delegations-from %s --output=json %v", // fmt.Sprintf("gaiacli query stake unbonding-delegations-from %s --output=json %v",
sdk.ValAddress(barAddr), flags)) // sdk.ValAddress(barAddr), flags))
require.Len(t, validatorUbds, 1) // require.Len(t, validatorUbds, 1)
require.Equal(t, "1", validatorUbds[0].Balance.Amount.String()) // require.Equal(t, "1", validatorUbds[0].Balance.Amount.String())
//
params := executeGetParams(t, fmt.Sprintf("gaiacli query stake parameters --output=json %v", flags)) // params := executeGetParams(t, fmt.Sprintf("gaiacli query stake parameters --output=json %v", flags))
require.True(t, defaultParams.Equal(params)) // require.True(t, defaultParams.Equal(params))
//
pool := executeGetPool(t, fmt.Sprintf("gaiacli query stake pool --output=json %v", flags)) // pool := executeGetPool(t, fmt.Sprintf("gaiacli query stake pool --output=json %v", flags))
require.Equal(t, initialPool.BondedTokens, pool.BondedTokens) // require.Equal(t, initialPool.BondedTokens, pool.BondedTokens)
} // }
func TestGaiaCLISubmitProposal(t *testing.T) { func TestGaiaCLISubmitProposal(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) chainID, servAddr, port := initializeFixtures(t)
@ -355,9 +383,8 @@ func TestGaiaCLISubmitProposal(t *testing.T) {
executeWrite(t, spStr, app.DefaultKeyPass) executeWrite(t, spStr, app.DefaultKeyPass)
tests.WaitForNextNBlocksTM(2, port) tests.WaitForNextNBlocksTM(2, port)
// Test query txs txs := executeGetTxs(t, fmt.Sprintf("gaiacli query txs --tag='action=submit-proposal&proposer=%s' %v", fooAddr, flags))
// txs := executeGetTxs(t, fmt.Sprintf("gaiacli query txs --tag action=submit-proposal,proposer=%s %v", fooAddr, flags)) require.Len(t, txs, 1)
// require.Len(t, txs, 1)
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) require.Equal(t, int64(45), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
@ -458,146 +485,146 @@ func TestGaiaCLISubmitProposal(t *testing.T) {
require.Equal(t, " 2 - Apples", proposalsQuery) require.Equal(t, " 2 - Apples", proposalsQuery)
} }
func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) { // func TestGaiaCLISendGenerateSignAndBroadcast(t *testing.T) {
chainID, servAddr, port := initializeFixtures(t) // chainID, servAddr, port := initializeFixtures(t)
flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) // flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID)
//
// start gaiad server // // start gaiad server
proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf( // proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf(
"gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) // "gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr))
//
defer proc.Stop(false) // defer proc.Stop(false)
tests.WaitForTMStart(port) // tests.WaitForTMStart(port)
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) // 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)) // barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome))
//
// Test generate sendTx with default gas // // Test generate sendTx with default gas
success, stdout, stderr := executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, stderr := executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx send %v --amount=10%s --to=%s --from=foo --generate-only", // "gaiacli tx send %v --amount=10%s --to=%s --from=foo --generate-only",
flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...) // flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...)
require.True(t, success) // require.True(t, success)
require.Empty(t, stderr) // require.Empty(t, stderr)
msg := unmarshalStdTx(t, stdout) // msg := unmarshalStdTx(t, stdout)
require.Equal(t, msg.Fee.Gas, uint64(client.DefaultGasLimit)) // require.Equal(t, msg.Fee.Gas, uint64(client.DefaultGasLimit))
require.Equal(t, len(msg.Msgs), 1) // require.Equal(t, len(msg.Msgs), 1)
require.Equal(t, 0, len(msg.GetSignatures())) // require.Equal(t, 0, len(msg.GetSignatures()))
//
// Test generate sendTx with --gas=$amount // // Test generate sendTx with --gas=$amount
success, stdout, stderr = executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, stderr = executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx send %v --amount=10%s --to=%s --from=foo --gas=100 --generate-only", // "gaiacli tx send %v --amount=10%s --to=%s --from=foo --gas=100 --generate-only",
flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...) // flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...)
require.True(t, success) // require.True(t, success)
require.Empty(t, stderr) // require.Empty(t, stderr)
msg = unmarshalStdTx(t, stdout) // msg = unmarshalStdTx(t, stdout)
require.Equal(t, msg.Fee.Gas, uint64(100)) // require.Equal(t, msg.Fee.Gas, uint64(100))
require.Equal(t, len(msg.Msgs), 1) // require.Equal(t, len(msg.Msgs), 1)
require.Equal(t, 0, len(msg.GetSignatures())) // require.Equal(t, 0, len(msg.GetSignatures()))
//
// Test generate sendTx, estimate gas // // Test generate sendTx, estimate gas
success, stdout, stderr = executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, stderr = executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx send %v --amount=10%s --to=%s --from=foo --gas=simulate --generate-only", // "gaiacli tx send %v --amount=10%s --to=%s --from=foo --gas=simulate --generate-only",
flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...) // flags, stakeTypes.DefaultBondDenom, barAddr), []string{}...)
require.True(t, success) // require.True(t, success)
require.NotEmpty(t, stderr) // require.NotEmpty(t, stderr)
msg = unmarshalStdTx(t, stdout) // msg = unmarshalStdTx(t, stdout)
require.True(t, msg.Fee.Gas > 0) // require.True(t, msg.Fee.Gas > 0)
require.Equal(t, len(msg.Msgs), 1) // require.Equal(t, len(msg.Msgs), 1)
//
// Write the output to disk // // Write the output to disk
unsignedTxFile := writeToNewTempFile(t, stdout) // unsignedTxFile := writeToNewTempFile(t, stdout)
defer os.Remove(unsignedTxFile.Name()) // defer os.Remove(unsignedTxFile.Name())
//
// Test sign --validate-signatures // // Test sign --validate-signatures
success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx sign %v --validate-signatures %v", flags, unsignedTxFile.Name())) // "gaiacli tx sign %v --validate-signatures %v", flags, unsignedTxFile.Name()))
require.False(t, success) // require.False(t, success)
require.Equal(t, fmt.Sprintf("Signers:\n 0: %v\n\nSignatures:\n\n", fooAddr.String()), stdout) // require.Equal(t, fmt.Sprintf("Signers:\n 0: %v\n\nSignatures:\n\n", fooAddr.String()), stdout)
//
// Test sign // // Test sign
success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx sign %v --name=foo %v", flags, unsignedTxFile.Name()), app.DefaultKeyPass) // "gaiacli tx sign %v --name=foo %v", flags, unsignedTxFile.Name()), app.DefaultKeyPass)
require.True(t, success) // require.True(t, success)
msg = unmarshalStdTx(t, stdout) // msg = unmarshalStdTx(t, stdout)
require.Equal(t, len(msg.Msgs), 1) // require.Equal(t, len(msg.Msgs), 1)
require.Equal(t, 1, len(msg.GetSignatures())) // require.Equal(t, 1, len(msg.GetSignatures()))
require.Equal(t, fooAddr.String(), msg.GetSigners()[0].String()) // require.Equal(t, fooAddr.String(), msg.GetSigners()[0].String())
//
// Write the output to disk // // Write the output to disk
signedTxFile := writeToNewTempFile(t, stdout) // signedTxFile := writeToNewTempFile(t, stdout)
defer os.Remove(signedTxFile.Name()) // defer os.Remove(signedTxFile.Name())
//
// Test sign --print-signatures // // Test sign --print-signatures
success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx sign %v --validate-signatures %v", flags, signedTxFile.Name())) // "gaiacli tx sign %v --validate-signatures %v", flags, signedTxFile.Name()))
require.True(t, success) // require.True(t, success)
require.Equal(t, fmt.Sprintf("Signers:\n 0: %v\n\nSignatures:\n 0: %v\t[OK]\n\n", fooAddr.String(), // require.Equal(t, fmt.Sprintf("Signers:\n 0: %v\n\nSignatures:\n 0: %v\t[OK]\n\n", fooAddr.String(),
fooAddr.String()), stdout) // fooAddr.String()), stdout)
//
// Test broadcast // // Test broadcast
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf( // success, stdout, _ = executeWriteRetStdStreams(t, fmt.Sprintf(
"gaiacli tx broadcast %v --json %v", flags, signedTxFile.Name())) // "gaiacli tx broadcast %v --json %v", flags, signedTxFile.Name()))
require.True(t, success) // require.True(t, success)
//
var result struct { // var result struct {
Response abci.ResponseDeliverTx // Response abci.ResponseDeliverTx
} // }
//
require.Nil(t, app.MakeCodec().UnmarshalJSON([]byte(stdout), &result)) // require.Nil(t, app.MakeCodec().UnmarshalJSON([]byte(stdout), &result))
require.Equal(t, msg.Fee.Gas, uint64(result.Response.GasUsed)) // require.Equal(t, msg.Fee.Gas, uint64(result.Response.GasUsed))
require.Equal(t, msg.Fee.Gas, uint64(result.Response.GasWanted)) // require.Equal(t, msg.Fee.Gas, uint64(result.Response.GasWanted))
tests.WaitForNextNBlocksTM(2, port) // tests.WaitForNextNBlocksTM(2, port)
//
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) // barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags))
require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
//
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) // fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags))
require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) // require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64())
} // }
//
func TestGaiaCLIConfig(t *testing.T) { // func TestGaiaCLIConfig(t *testing.T) {
require.NoError(t, os.RemoveAll(gaiacliHome)) // require.NoError(t, os.RemoveAll(gaiacliHome))
require.NoError(t, os.RemoveAll(gaiadHome)) // require.NoError(t, os.RemoveAll(gaiadHome))
servAddr, port, err := server.FreeTCPAddr() // servAddr, port, err := server.FreeTCPAddr()
require.NoError(t, err) // require.NoError(t, err)
node := fmt.Sprintf("%s:%s", servAddr, port) // node := fmt.Sprintf("%s:%s", servAddr, port)
chainID := executeInit(t, fmt.Sprintf("gaiad init -o --moniker=foo --home=%s", gaiadHome)) // chainID := executeInit(t, fmt.Sprintf("gaiad init -o --moniker=foo --home=%s", gaiadHome))
executeWrite(t, fmt.Sprintf("gaiacli --home=%s config", gaiadHome), gaiacliHome, node, "y") // executeWrite(t, fmt.Sprintf("gaiacli --home=%s config", gaiadHome), gaiacliHome, node, "y")
config, err := ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml")) // config, err := ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml"))
require.NoError(t, err) // require.NoError(t, err)
expectedConfig := fmt.Sprintf(`chain_id = "%s" // expectedConfig := fmt.Sprintf(`chain_id = "%s"
home = "%s" // home = "%s"
node = "%s" // node = "%s"
output = "text" // output = "text"
trace = false // trace = false
trust_node = true // trust_node = true
`, chainID, gaiacliHome, node) // `, chainID, gaiacliHome, node)
require.Equal(t, expectedConfig, string(config)) // require.Equal(t, expectedConfig, string(config))
// ensure a backup gets created // // ensure a backup gets created
executeWrite(t, "gaiacli config", gaiacliHome, node, "y", "y") // executeWrite(t, "gaiacli config", gaiacliHome, node, "y", "y")
configBackup, err := ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml-old")) // configBackup, err := ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml-old"))
require.NoError(t, err) // require.NoError(t, err)
require.Equal(t, expectedConfig, string(configBackup)) // require.Equal(t, expectedConfig, string(configBackup))
//
require.NoError(t, os.RemoveAll(gaiadHome)) // require.NoError(t, os.RemoveAll(gaiadHome))
executeWrite(t, "gaiacli config", gaiacliHome, node, "y") // executeWrite(t, "gaiacli config", gaiacliHome, node, "y")
//
// ensure it works without an initialized gaiad state // // ensure it works without an initialized gaiad state
expectedConfig = fmt.Sprintf(`chain_id = "" // expectedConfig = fmt.Sprintf(`chain_id = ""
home = "%s" // home = "%s"
node = "%s" // node = "%s"
output = "text" // output = "text"
trace = false // trace = false
trust_node = true // trust_node = true
`, gaiacliHome, node) // `, gaiacliHome, node)
config, err = ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml")) // config, err = ioutil.ReadFile(path.Join(gaiacliHome, "config", "config.toml"))
require.NoError(t, err) // require.NoError(t, err)
require.Equal(t, expectedConfig, string(config)) // require.Equal(t, expectedConfig, string(config))
} // }
//___________________________________________________________________________________ //___________________________________________________________________________________
// helper methods // helper methods