diff --git a/Makefile b/Makefile index dae876965a3a..fd69cc7e14b6 100644 --- a/Makefile +++ b/Makefile @@ -125,7 +125,7 @@ test-race: test-integration: build-sim BUILDDIR=$(BUILDDIR) go test -mod=readonly -p 4 `go list ./tests/cli/...` -tags=-tags='ledger test_ledger_mock cli_test' - BUILDDIR=$(BUILDDIR) go test -mod=readonly -p 4 `go list ./x/.../client/cli_test/...` -tags=-tags='ledger test_ledger_mock cli_test' + BUILDDIR=$(BUILDDIR) go test -mod=readonly -p 4 `go list ./x/.../client/cli/...` -tags=-tags='ledger test_ledger_mock cli_test' .PHONY: test test-all test-ledger-mock test-ledger test-unit test-race diff --git a/tests/cli/helpers.go b/tests/cli/helpers.go index eebcc336bcf5..516b56f13cd6 100644 --- a/tests/cli/helpers.go +++ b/tests/cli/helpers.go @@ -3,6 +3,7 @@ package cli import ( "encoding/json" "fmt" + "io/ioutil" "os" "path/filepath" "strings" @@ -168,18 +169,6 @@ func (f *Fixtures) CLIConfig(key, value string, flags ...string) { ExecuteWriteCheckErr(f.T, AddFlags(cmd, flags)) } -// TxBroadcast is simcli tx broadcast -func (f *Fixtures) TxBroadcast(fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx broadcast %v %v", f.SimcliBinary, f.Flags(), fileName) - return ExecuteWriteRetStdStreams(f.T, AddFlags(cmd, flags), clientkeys.DefaultKeyPass) -} - -// TxEncode is simcli tx encode -func (f *Fixtures) TxEncode(fileName string, flags ...string) (bool, string, string) { - cmd := fmt.Sprintf("%s tx encode %v %v", f.SimcliBinary, f.Flags(), fileName) - return ExecuteWriteRetStdStreams(f.T, AddFlags(cmd, flags), clientkeys.DefaultKeyPass) -} - //utils func AddFlags(cmd string, flags []string) string { @@ -189,6 +178,21 @@ func AddFlags(cmd string, flags []string) string { return strings.TrimSpace(cmd) } +// Write the given string to a new temporary file +func WriteToNewTempFile(t *testing.T, s string) *os.File { + fp, err := ioutil.TempFile(os.TempDir(), "cosmos_cli_test_") + require.Nil(t, err) + _, err = fp.WriteString(s) + require.Nil(t, err) + return fp +} + +func MarshalStdTx(t *testing.T, c *codec.Codec, stdTx auth.StdTx) []byte { + bz, err := c.MarshalBinaryBare(stdTx) + require.NoError(t, err) + return bz +} + func UnmarshalStdTx(t *testing.T, c *codec.Codec, s string) (stdTx auth.StdTx) { require.Nil(t, c.UnmarshalJSON([]byte(s), &stdTx)) return diff --git a/tests/cli/keys_test.go b/tests/cli/keys_test.go index 0a6c64ab3d3f..a661c98c57b6 100644 --- a/tests/cli/keys_test.go +++ b/tests/cli/keys_test.go @@ -6,8 +6,9 @@ import ( "fmt" "testing" - "github.com/cosmos/cosmos-sdk/tests/cli" "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/tests/cli" ) func TestCLIKeysAddMultisig(t *testing.T) { diff --git a/tests/cli/simd_test.go b/tests/cli/simd_test.go index b0860fdf0d4f..c8f21f2c17ba 100644 --- a/tests/cli/simd_test.go +++ b/tests/cli/simd_test.go @@ -2,16 +2,18 @@ package cli_test import ( "fmt" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/tests/cli" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/bank" - "github.com/stretchr/testify/require" - tmtypes "github.com/tendermint/tendermint/types" - "io/ioutil" - "path/filepath" - "testing" ) func TestSimdCollectGentxs(t *testing.T) { diff --git a/x/auth/client/cli/auth_test.go b/x/auth/client/cli/auth_test.go new file mode 100644 index 000000000000..dfe3dfb46925 --- /dev/null +++ b/x/auth/client/cli/auth_test.go @@ -0,0 +1,394 @@ +// +build cli_test + +package cli_test + +import ( + "encoding/base64" + "fmt" + "github.com/cosmos/cosmos-sdk/x/auth/client/testutil" + testutil2 "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" + "os" + "strings" + "testing" + + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/tests" + cli "github.com/cosmos/cosmos-sdk/tests/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/stretchr/testify/require" +) + +func TestCLIValidateSignatures(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + // start gaiad server + proc := f.SDStart() + defer proc.Stop(false) + + fooAddr := f.KeyAddress(cli.KeyFoo) + barAddr := f.KeyAddress(cli.KeyBar) + + // generate sendTx with default gas + success, stdout, stderr := testutil2.TxSend(f, fooAddr.String(), barAddr, sdk.NewInt64Coin(cli.Denom, 10), "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + + // write unsigned tx to file + unsignedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(unsignedTxFile.Name()) + + // validate we can successfully sign + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name()) + require.True(t, success) + stdTx := cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.Equal(t, len(stdTx.Msgs), 1) + require.Equal(t, 1, len(stdTx.GetSignatures())) + require.Equal(t, fooAddr.String(), stdTx.GetSigners()[0].String()) + + // write signed tx to file + signedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(signedTxFile.Name()) + + // validate signatures + success, _, _ = testutil.TxSign(f, cli.KeyFoo, signedTxFile.Name(), "--validate-signatures") + require.True(t, success) + + // modify the transaction + stdTx.Memo = "MODIFIED-ORIGINAL-TX-BAD" + bz := cli.MarshalStdTx(t, f.Cdc, stdTx) + modSignedTxFile := cli.WriteToNewTempFile(t, string(bz)) + defer os.Remove(modSignedTxFile.Name()) + + // validate signature validation failure due to different transaction sig bytes + success, _, _ = testutil.TxSign(f, cli.KeyFoo, modSignedTxFile.Name(), "--validate-signatures") + require.False(t, success) + + f.Cleanup() +} + +func TestCLISendGenerateSignAndBroadcast(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + // start gaiad server + proc := f.SDStart() + defer proc.Stop(false) + + fooAddr := f.KeyAddress(cli.KeyFoo) + barAddr := f.KeyAddress(cli.KeyBar) + + // Test generate sendTx with default gas + sendTokens := sdk.TokensFromConsensusPower(10) + success, stdout, stderr := testutil2.TxSend(f, fooAddr.String(), barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + msg := cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.Equal(t, msg.Fee.Gas, uint64(flags.DefaultGasLimit)) + require.Equal(t, len(msg.Msgs), 1) + require.Equal(t, 0, len(msg.GetSignatures())) + + // Test generate sendTx with --gas=$amount + success, stdout, stderr = testutil2.TxSend(f, fooAddr.String(), barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--gas=100", "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + msg = cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.Equal(t, msg.Fee.Gas, uint64(100)) + require.Equal(t, len(msg.Msgs), 1) + require.Equal(t, 0, len(msg.GetSignatures())) + + // Test generate sendTx, estimate gas + success, stdout, stderr = testutil2.TxSend(f, fooAddr.String(), barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + msg = cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.True(t, msg.Fee.Gas > 0) + require.Equal(t, len(msg.Msgs), 1) + + // Write the output to disk + unsignedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(unsignedTxFile.Name()) + + // Test sign --validate-signatures + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name(), "--validate-signatures") + require.False(t, success) + require.Equal(t, fmt.Sprintf("Signers:\n 0: %v\n\nSignatures:\n\n", fooAddr.String()), stdout) + + // Test sign + + // Does not work in offline mode + success, stdout, stderr = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name(), "--offline") + require.Contains(t, stderr, "required flag(s) \"account-number\", \"sequence\" not set") + require.False(t, success) + + // But works offline if we set account number and sequence + success, _, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name(), "--offline", "--account-number", "1", "--sequence", "1") + require.True(t, success) + + // Sign transaction + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name()) + require.True(t, success) + msg = cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.Equal(t, len(msg.Msgs), 1) + require.Equal(t, 1, len(msg.GetSignatures())) + require.Equal(t, fooAddr.String(), msg.GetSigners()[0].String()) + + // Write the output to disk + signedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(signedTxFile.Name()) + + // Test sign --validate-signatures + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, signedTxFile.Name(), "--validate-signatures") + require.True(t, success) + require.Equal(t, fmt.Sprintf("Signers:\n 0: %v\n\nSignatures:\n 0: %v\t\t\t[OK]\n\n", fooAddr.String(), + fooAddr.String()), stdout) + + // Ensure foo has right amount of funds + startTokens := sdk.TokensFromConsensusPower(50) + require.Equal(t, startTokens, testutil2.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + + // Test broadcast + + // Does not work in offline mode + success, _, stderr = testutil.TxBroadcast(f, signedTxFile.Name(), "--offline") + require.Contains(t, stderr, "cannot broadcast tx during offline mode") + require.False(t, success) + tests.WaitForNextNBlocksTM(1, f.Port) + + success, stdout, _ = testutil.TxBroadcast(f, signedTxFile.Name()) + require.True(t, success) + tests.WaitForNextNBlocksTM(1, f.Port) + + // Ensure account state + require.Equal(t, sendTokens, testutil2.QueryBalances(f, barAddr).AmountOf(cli.Denom)) + require.Equal(t, startTokens.Sub(sendTokens), testutil2.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + + f.Cleanup() +} + +func TestCLIMultisignInsufficientCosigners(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + // start gaiad server with minimum fees + proc := f.SDStart() + defer proc.Stop(false) + + fooBarBazAddr := f.KeyAddress(cli.KeyFooBarBaz) + barAddr := f.KeyAddress(cli.KeyBar) + + // Send some tokens from one account to the other + success, _, _ := testutil2.TxSend(f, cli.KeyFoo, fooBarBazAddr, sdk.NewInt64Coin(cli.Denom, 10), "-y") + require.True(t, success) + tests.WaitForNextNBlocksTM(1, f.Port) + + // Test generate sendTx with multisig + success, stdout, _ := testutil2.TxSend(f, fooBarBazAddr.String(), barAddr, sdk.NewInt64Coin(cli.Denom, 5), "--generate-only") + require.True(t, success) + + // Write the output to disk + unsignedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(unsignedTxFile.Name()) + + // Sign with foo's key + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name(), "--multisig", fooBarBazAddr.String(), "-y") + require.True(t, success) + + // Write the output to disk + fooSignatureFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(fooSignatureFile.Name()) + + // Multisign, not enough signatures + success, stdout, _ = testutil.TxMultisign(f, unsignedTxFile.Name(), cli.KeyFooBarBaz, []string{fooSignatureFile.Name()}) + require.True(t, success) + + // Write the output to disk + signedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(signedTxFile.Name()) + + // Validate the multisignature + success, _, _ = testutil.TxSign(f, cli.KeyFooBarBaz, signedTxFile.Name(), "--validate-signatures") + require.False(t, success) + + // Broadcast the transaction + success, stdOut, _ := testutil.TxBroadcast(f, signedTxFile.Name()) + require.Contains(t, stdOut, "signature verification failed") + require.True(t, success) + + // Cleanup testing directories + f.Cleanup() +} + +func TestCLIEncode(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + // start gaiad server + proc := f.SDStart() + defer proc.Stop(false) + + // Build a testing transaction and write it to disk + barAddr := f.KeyAddress(cli.KeyBar) + keyAddr := f.KeyAddress(cli.KeyFoo) + + sendTokens := sdk.TokensFromConsensusPower(10) + success, stdout, stderr := testutil2.TxSend(f, keyAddr.String(), barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--generate-only", "--memo", "deadbeef") + require.True(t, success) + require.Empty(t, stderr) + + // Write it to disk + jsonTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(jsonTxFile.Name()) + + // Run the encode command, and trim the extras from the stdout capture + success, base64Encoded, _ := testutil.TxEncode(f, jsonTxFile.Name()) + require.True(t, success) + trimmedBase64 := strings.Trim(base64Encoded, "\"\n") + + // Decode the base64 + decodedBytes, err := base64.StdEncoding.DecodeString(trimmedBase64) + require.Nil(t, err) + + // Check that the transaction decodes as epxceted + var decodedTx auth.StdTx + require.Nil(t, f.Cdc.UnmarshalBinaryBare(decodedBytes, &decodedTx)) + require.Equal(t, "deadbeef", decodedTx.Memo) +} + +func TestCLIMultisignSortSignatures(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + // start gaiad server with minimum fees + proc := f.SDStart() + defer proc.Stop(false) + + fooBarBazAddr := f.KeyAddress(cli.KeyFooBarBaz) + barAddr := f.KeyAddress(cli.KeyBar) + + // Send some tokens from one account to the other + success, _, _ := testutil2.TxSend(f, cli.KeyFoo, fooBarBazAddr, sdk.NewInt64Coin(cli.Denom, 10), "-y") + require.True(t, success) + tests.WaitForNextNBlocksTM(1, f.Port) + + // Ensure account balances match expected + require.Equal(t, int64(10), testutil2.QueryBalances(f, fooBarBazAddr).AmountOf(cli.Denom).Int64()) + + // Test generate sendTx with multisig + success, stdout, _ := testutil2.TxSend(f, fooBarBazAddr.String(), barAddr, sdk.NewInt64Coin(cli.Denom, 5), "--generate-only") + require.True(t, success) + + // Write the output to disk + unsignedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(unsignedTxFile.Name()) + + // Sign with foo's key + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name(), "--multisig", fooBarBazAddr.String()) + require.True(t, success) + + // Write the output to disk + fooSignatureFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(fooSignatureFile.Name()) + + // Sign with baz's key + success, stdout, _ = testutil.TxSign(f, cli.KeyBaz, unsignedTxFile.Name(), "--multisig", fooBarBazAddr.String()) + require.True(t, success) + + // Write the output to disk + bazSignatureFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(bazSignatureFile.Name()) + + // Multisign, keys in different order + success, stdout, _ = testutil.TxMultisign(f, unsignedTxFile.Name(), cli.KeyFooBarBaz, []string{ + bazSignatureFile.Name(), fooSignatureFile.Name()}) + require.True(t, success) + + // Write the output to disk + signedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(signedTxFile.Name()) + + // Validate the multisignature + success, _, _ = testutil.TxSign(f, cli.KeyFooBarBaz, signedTxFile.Name(), "--validate-signatures") + require.True(t, success) + + // Broadcast the transaction + success, _, _ = testutil.TxBroadcast(f, signedTxFile.Name()) + require.True(t, success) + + // Cleanup testing directories + f.Cleanup() +} + +func TestGaiaCLIMultisign(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + // start gaiad server with minimum fees + proc := f.SDStart() + defer proc.Stop(false) + + fooBarBazAddr := f.KeyAddress(cli.KeyFooBarBaz) + bazAddr := f.KeyAddress(cli.KeyBaz) + + // Send some tokens from one account to the other + success, _, _ := testutil2.TxSend(f, cli.KeyFoo, fooBarBazAddr, sdk.NewInt64Coin(cli.Denom, 10), "-y") + require.True(t, success) + tests.WaitForNextNBlocksTM(1, f.Port) + + // Ensure account balances match expected + require.Equal(t, int64(10), testutil2.QueryBalances(f, fooBarBazAddr).AmountOf(cli.Denom).Int64()) + + // Test generate sendTx with multisig + success, stdout, stderr := testutil2.TxSend(f, fooBarBazAddr.String(), bazAddr, sdk.NewInt64Coin(cli.Denom, 10), "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + + // Write the output to disk + unsignedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(unsignedTxFile.Name()) + + // Sign with foo's key + success, stdout, _ = testutil.TxSign(f, cli.KeyFoo, unsignedTxFile.Name(), "--multisig", fooBarBazAddr.String(), "-y") + require.True(t, success) + + // Write the output to disk + fooSignatureFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(fooSignatureFile.Name()) + + // Sign with bar's key + success, stdout, _ = testutil.TxSign(f, cli.KeyBar, unsignedTxFile.Name(), "--multisig", fooBarBazAddr.String(), "-y") + require.True(t, success) + + // Write the output to disk + barSignatureFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(barSignatureFile.Name()) + + // Multisign + + // Does not work in offline mode + success, stdout, _ = testutil.TxMultisign(f, unsignedTxFile.Name(), cli.KeyFooBarBaz, []string{ + fooSignatureFile.Name(), barSignatureFile.Name()}, "--offline") + require.Contains(t, "couldn't verify signature", stdout) + require.False(t, success) + + // Success multisign + success, stdout, _ = testutil.TxMultisign(f, unsignedTxFile.Name(), cli.KeyFooBarBaz, []string{ + fooSignatureFile.Name(), barSignatureFile.Name()}) + require.True(t, success) + + // Write the output to disk + signedTxFile := cli.WriteToNewTempFile(t, stdout) + defer os.Remove(signedTxFile.Name()) + + // Validate the multisignature + success, _, _ = testutil.TxSign(f, cli.KeyFooBarBaz, signedTxFile.Name(), "--validate-signatures", "-y") + require.True(t, success) + + // Broadcast the transaction + success, _, _ = testutil.TxBroadcast(f, signedTxFile.Name()) + require.True(t, success) + + // Cleanup testing directories + f.Cleanup() +} diff --git a/x/auth/client/testutil/helpers.go b/x/auth/client/testutil/helpers.go new file mode 100644 index 000000000000..a82d486d5a5d --- /dev/null +++ b/x/auth/client/testutil/helpers.go @@ -0,0 +1,37 @@ +package testutil + +import ( + "fmt" + clientkeys "github.com/cosmos/cosmos-sdk/client/keys" + cli "github.com/cosmos/cosmos-sdk/tests/cli" + "strings" +) + +// TxSign is gaiacli tx sign +func TxSign(f *cli.Fixtures, signer, fileName string, flags ...string) (bool, string, string) { + cmd := fmt.Sprintf("%s tx sign %v --keyring-backend=test --from=%s %v", f.SimcliBinary, + f.Flags(), signer, fileName) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) +} + +// TxBroadcast is gaiacli tx broadcast +func TxBroadcast(f *cli.Fixtures, fileName string, flags ...string) (bool, string, string) { + cmd := fmt.Sprintf("%s tx broadcast %v %v", f.SimcliBinary, f.Flags(), fileName) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) +} + +// TxEncode is gaiacli tx encode +func TxEncode(f *cli.Fixtures, fileName string, flags ...string) (bool, string, string) { + cmd := fmt.Sprintf("%s tx encode %v %v", f.SimcliBinary, f.Flags(), fileName) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) +} + +// TxMultisign is gaiacli tx multisign +func TxMultisign(f *cli.Fixtures, fileName, name string, signaturesFiles []string, + flags ...string) (bool, string, string) { + + cmd := fmt.Sprintf("%s tx multisign --keyring-backend=test %v %s %s %s", f.SimcliBinary, f.Flags(), + fileName, name, strings.Join(signaturesFiles, " "), + ) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags)) +} diff --git a/x/bank/client/cli_test/send_test.go b/x/bank/client/cli/send_test.go similarity index 69% rename from x/bank/client/cli_test/send_test.go rename to x/bank/client/cli/send_test.go index 153f6245d86f..a4bc96545b02 100644 --- a/x/bank/client/cli_test/send_test.go +++ b/x/bank/client/cli/send_test.go @@ -4,6 +4,7 @@ package cli_test import ( "fmt" + "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" "testing" "github.com/stretchr/testify/require" @@ -11,7 +12,6 @@ import ( "github.com/cosmos/cosmos-sdk/tests" "github.com/cosmos/cosmos-sdk/tests/cli" sdk "github.com/cosmos/cosmos-sdk/types" - bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/cli_test" ) func TestCLISend(t *testing.T) { @@ -27,30 +27,30 @@ func TestCLISend(t *testing.T) { barAddr := f.KeyAddress(cli.KeyBar) startTokens := sdk.TokensFromConsensusPower(50) - require.Equal(t, startTokens, bankcli.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + require.Equal(t, startTokens, testutil.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) sendTokens := sdk.TokensFromConsensusPower(10) // It does not allow to send in offline mode - success, _, stdErr := bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y", "--offline") + success, _, stdErr := testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y", "--offline") require.Contains(t, stdErr, "no RPC client is defined in offline mode") require.False(f.T, success) tests.WaitForNextNBlocksTM(1, f.Port) // Send some tokens from one account to the other - bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y") + testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y") tests.WaitForNextNBlocksTM(1, f.Port) // Ensure account balances match expected - require.Equal(t, sendTokens, bankcli.QueryBalances(f, barAddr).AmountOf(cli.Denom)) - require.Equal(t, startTokens.Sub(sendTokens), bankcli.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + require.Equal(t, sendTokens, testutil.QueryBalances(f, barAddr).AmountOf(cli.Denom)) + require.Equal(t, startTokens.Sub(sendTokens), testutil.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) // Test --dry-run - success, _, _ = bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--dry-run") + success, _, _ = testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--dry-run") require.True(t, success) // Test --generate-only - success, stdout, stderr := bankcli.TxSend( + success, stdout, stderr := testutil.TxSend( f, fooAddr.String(), barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--generate-only=true", ) require.Empty(t, stderr) @@ -62,23 +62,23 @@ func TestCLISend(t *testing.T) { require.Len(t, msg.GetSignatures(), 0) // Check state didn't change - require.Equal(t, startTokens.Sub(sendTokens), bankcli.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + require.Equal(t, startTokens.Sub(sendTokens), testutil.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) // test autosequencing - bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y") + testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y") tests.WaitForNextNBlocksTM(1, f.Port) // Ensure account balances match expected - require.Equal(t, sendTokens.MulRaw(2), bankcli.QueryBalances(f, barAddr).AmountOf(cli.Denom)) - require.Equal(t, startTokens.Sub(sendTokens.MulRaw(2)), bankcli.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + require.Equal(t, sendTokens.MulRaw(2), testutil.QueryBalances(f, barAddr).AmountOf(cli.Denom)) + require.Equal(t, startTokens.Sub(sendTokens.MulRaw(2)), testutil.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) // test memo - bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--memo='testmemo'", "-y") + testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "--memo='testmemo'", "-y") tests.WaitForNextNBlocksTM(1, f.Port) // Ensure account balances match expected - require.Equal(t, sendTokens.MulRaw(3), bankcli.QueryBalances(f, barAddr).AmountOf(cli.Denom)) - require.Equal(t, startTokens.Sub(sendTokens.MulRaw(3)), bankcli.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) + require.Equal(t, sendTokens.MulRaw(3), testutil.QueryBalances(f, barAddr).AmountOf(cli.Denom)) + require.Equal(t, startTokens.Sub(sendTokens.MulRaw(3)), testutil.QueryBalances(f, fooAddr).AmountOf(cli.Denom)) f.Cleanup() } @@ -100,20 +100,20 @@ func TestCLIMinimumFees(t *testing.T) { barAddr := f.KeyAddress(cli.KeyBar) // Send a transaction that will get rejected - success, stdOut, _ := bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.Fee2Denom, 10), "-y") + success, stdOut, _ := testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.Fee2Denom, 10), "-y") require.Contains(t, stdOut, "insufficient fees") require.True(f.T, success) tests.WaitForNextNBlocksTM(1, f.Port) // Ensure tx w/ correct fees pass txFees := fmt.Sprintf("--fees=%s", sdk.NewInt64Coin(cli.FeeDenom, 2)) - success, _, _ = bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.Fee2Denom, 10), txFees, "-y") + success, _, _ = testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.Fee2Denom, 10), txFees, "-y") require.True(f.T, success) tests.WaitForNextNBlocksTM(1, f.Port) // Ensure tx w/ improper fees fails txFees = fmt.Sprintf("--fees=%s", sdk.NewInt64Coin(cli.FeeDenom, 1)) - success, _, _ = bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.FooDenom, 10), txFees, "-y") + success, _, _ = testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.FooDenom, 10), txFees, "-y") require.Contains(t, stdOut, "insufficient fees") require.True(f.T, success) @@ -134,7 +134,7 @@ func TestCLIGasPrices(t *testing.T) { // insufficient gas prices (tx fails) badGasPrice, _ := sdk.NewDecFromStr("0.000003") - success, stdOut, _ := bankcli.TxSend( + success, stdOut, _ := testutil.TxSend( f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.FooDenom, 50), fmt.Sprintf("--gas-prices=%s", sdk.NewDecCoinFromDec(cli.FeeDenom, badGasPrice)), "-y") require.Contains(t, stdOut, "insufficient fees") @@ -144,7 +144,7 @@ func TestCLIGasPrices(t *testing.T) { tests.WaitForNextNBlocksTM(1, f.Port) // sufficient gas prices (tx passes) - success, _, _ = bankcli.TxSend( + success, _, _ = testutil.TxSend( f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.FooDenom, 50), fmt.Sprintf("--gas-prices=%s", sdk.NewDecCoinFromDec(cli.FeeDenom, minGasPrice)), "-y") require.True(t, success) @@ -168,10 +168,10 @@ func TestCLIFeesDeduction(t *testing.T) { fooAddr := f.KeyAddress(cli.KeyFoo) barAddr := f.KeyAddress(cli.KeyBar) - fooAmt := bankcli.QueryBalances(f, fooAddr).AmountOf(cli.FooDenom) + fooAmt := testutil.QueryBalances(f, fooAddr).AmountOf(cli.FooDenom) // test simulation - success, _, _ := bankcli.TxSend( + success, _, _ := testutil.TxSend( f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.FooDenom, 1000), fmt.Sprintf("--fees=%s", sdk.NewInt64Coin(cli.FeeDenom, 2)), "--dry-run") require.True(t, success) @@ -180,11 +180,11 @@ func TestCLIFeesDeduction(t *testing.T) { tests.WaitForNextNBlocksTM(1, f.Port) // ensure state didn't change - require.Equal(t, fooAmt.Int64(), bankcli.QueryBalances(f, fooAddr).AmountOf(cli.FooDenom).Int64()) + require.Equal(t, fooAmt.Int64(), testutil.QueryBalances(f, fooAddr).AmountOf(cli.FooDenom).Int64()) // insufficient funds (coins + fees) tx fails largeCoins := sdk.TokensFromConsensusPower(10000000) - success, stdOut, _ := bankcli.TxSend( + success, stdOut, _ := testutil.TxSend( f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.FooDenom, largeCoins), fmt.Sprintf("--fees=%s", sdk.NewInt64Coin(cli.FeeDenom, 2)), "-y") require.Contains(t, stdOut, "insufficient funds") @@ -194,10 +194,10 @@ func TestCLIFeesDeduction(t *testing.T) { tests.WaitForNextNBlocksTM(1, f.Port) // ensure state didn't change - require.Equal(t, fooAmt.Int64(), bankcli.QueryBalances(f, fooAddr).AmountOf(cli.FooDenom).Int64()) + require.Equal(t, fooAmt.Int64(), testutil.QueryBalances(f, fooAddr).AmountOf(cli.FooDenom).Int64()) // test success (transfer = coins + fees) - success, _, _ = bankcli.TxSend( + success, _, _ = testutil.TxSend( f, cli.KeyFoo, barAddr, sdk.NewInt64Coin(cli.FooDenom, 500), fmt.Sprintf("--fees=%s", sdk.NewInt64Coin(cli.FeeDenom, 2)), "-y") require.True(t, success) diff --git a/x/bank/client/cli_test/helpers.go b/x/bank/client/testutil/helpers.go similarity index 99% rename from x/bank/client/cli_test/helpers.go rename to x/bank/client/testutil/helpers.go index 5722e5abed6a..49c4611f669b 100644 --- a/x/bank/client/cli_test/helpers.go +++ b/x/bank/client/testutil/helpers.go @@ -1,4 +1,4 @@ -package cli +package testutil import ( "encoding/json" diff --git a/x/distribution/client/cli_test/distr_test.go b/x/distribution/client/cli/distr_test.go similarity index 85% rename from x/distribution/client/cli_test/distr_test.go rename to x/distribution/client/cli/distr_test.go index e3dbc4b516bc..30c939527380 100644 --- a/x/distribution/client/cli_test/distr_test.go +++ b/x/distribution/client/cli/distr_test.go @@ -2,6 +2,7 @@ package cli_test import ( "github.com/cosmos/cosmos-sdk/tests/cli" + "github.com/cosmos/cosmos-sdk/x/distribution/client/testutil" "path/filepath" "testing" @@ -9,7 +10,6 @@ import ( tmtypes "github.com/tendermint/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" - distrcli "github.com/cosmos/cosmos-sdk/x/distribution/client/cli_test" "github.com/cosmos/cosmos-sdk/x/mint" ) @@ -39,15 +39,15 @@ func TestCliWithdrawRewards(t *testing.T) { defer proc.Stop(false) fooAddr := f.KeyAddress(cli.KeyFoo) - rewards := distrcli.QueryRewards(f, fooAddr) + rewards := testutil.QueryRewards(f, fooAddr) require.Equal(t, 1, len(rewards.Rewards)) require.NotNil(t, rewards.Total) fooVal := sdk.ValAddress(fooAddr) - success := distrcli.TxWithdrawRewards(f, fooVal, fooAddr.String(), "-y") + success := testutil.TxWithdrawRewards(f, fooVal, fooAddr.String(), "-y") require.True(t, success) - rewards = distrcli.QueryRewards(f, fooAddr) + rewards = testutil.QueryRewards(f, fooAddr) require.Equal(t, 1, len(rewards.Rewards)) require.Nil(t, rewards.Total) diff --git a/x/distribution/client/cli_test/helpers.go b/x/distribution/client/testutil/helpers.go similarity index 98% rename from x/distribution/client/cli_test/helpers.go rename to x/distribution/client/testutil/helpers.go index 5322165f4c1c..975d31674a64 100644 --- a/x/distribution/client/cli_test/helpers.go +++ b/x/distribution/client/testutil/helpers.go @@ -1,4 +1,4 @@ -package cli +package testutil import ( "fmt" diff --git a/x/staking/client/cli_test/staking_test.go b/x/staking/client/cli/staking_test.go similarity index 63% rename from x/staking/client/cli_test/staking_test.go rename to x/staking/client/cli/staking_test.go index 380d6011e698..83b4ab424284 100644 --- a/x/staking/client/cli_test/staking_test.go +++ b/x/staking/client/cli/staking_test.go @@ -3,6 +3,8 @@ package cli_test import ( + "github.com/cosmos/cosmos-sdk/x/bank/client/testutil" + testutil2 "github.com/cosmos/cosmos-sdk/x/staking/client/testutil" "testing" "github.com/stretchr/testify/require" @@ -11,8 +13,6 @@ import ( "github.com/cosmos/cosmos-sdk/tests" "github.com/cosmos/cosmos-sdk/tests/cli" sdk "github.com/cosmos/cosmos-sdk/types" - bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/cli_test" - stakingcli "github.com/cosmos/cosmos-sdk/x/staking/client/cli_test" ) func TestCLICreateValidator(t *testing.T) { @@ -29,13 +29,13 @@ func TestCLICreateValidator(t *testing.T) { consPubKey := sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeConsPub, ed25519.GenPrivKey().PubKey()) sendTokens := sdk.TokensFromConsensusPower(10) - bankcli.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y") + testutil.TxSend(f, cli.KeyFoo, barAddr, sdk.NewCoin(cli.Denom, sendTokens), "-y") tests.WaitForNextNBlocksTM(1, f.Port) - require.Equal(t, sendTokens, bankcli.QueryBalances(f, barAddr).AmountOf(cli.Denom)) + require.Equal(t, sendTokens, testutil.QueryBalances(f, barAddr).AmountOf(cli.Denom)) //Generate a create validator transaction and ensure correctness - success, stdout, stderr := stakingcli.TxStakingCreateValidator(f, barAddr.String(), consPubKey, sdk.NewInt64Coin(cli.Denom, 2), "--generate-only") + success, stdout, stderr := testutil2.TxStakingCreateValidator(f, barAddr.String(), consPubKey, sdk.NewInt64Coin(cli.Denom, 2), "--generate-only") require.True(f.T, success) require.Empty(f.T, stderr) @@ -46,39 +46,39 @@ func TestCLICreateValidator(t *testing.T) { // Test --dry-run newValTokens := sdk.TokensFromConsensusPower(2) - success, _, _ = stakingcli.TxStakingCreateValidator(f, barAddr.String(), consPubKey, sdk.NewCoin(cli.Denom, newValTokens), "--dry-run") + success, _, _ = testutil2.TxStakingCreateValidator(f, barAddr.String(), consPubKey, sdk.NewCoin(cli.Denom, newValTokens), "--dry-run") require.True(t, success) // Create the validator - stakingcli.TxStakingCreateValidator(f, cli.KeyBar, consPubKey, sdk.NewCoin(cli.Denom, newValTokens), "-y") + testutil2.TxStakingCreateValidator(f, cli.KeyBar, consPubKey, sdk.NewCoin(cli.Denom, newValTokens), "-y") tests.WaitForNextNBlocksTM(1, f.Port) // Ensure funds were deducted properly - require.Equal(t, sendTokens.Sub(newValTokens), bankcli.QueryBalances(f, barAddr).AmountOf(cli.Denom)) + require.Equal(t, sendTokens.Sub(newValTokens), testutil.QueryBalances(f, barAddr).AmountOf(cli.Denom)) // Ensure that validator state is as expected - validator := stakingcli.QueryStakingValidator(f, barVal) + validator := testutil2.QueryStakingValidator(f, barVal) require.Equal(t, validator.OperatorAddress, barVal) require.True(sdk.IntEq(t, newValTokens, validator.Tokens)) // Query delegations to the validator - validatorDelegations := stakingcli.QueryStakingDelegationsTo(f, barVal) + validatorDelegations := testutil2.QueryStakingDelegationsTo(f, barVal) require.Len(t, validatorDelegations, 1) require.NotZero(t, validatorDelegations[0].Shares) // unbond a single share unbondAmt := sdk.NewCoin(sdk.DefaultBondDenom, sdk.TokensFromConsensusPower(1)) - success = stakingcli.TxStakingUnbond(f, cli.KeyBar, unbondAmt.String(), barVal, "-y") + success = testutil2.TxStakingUnbond(f, cli.KeyBar, unbondAmt.String(), barVal, "-y") require.True(t, success) tests.WaitForNextNBlocksTM(1, f.Port) // Ensure bonded staking is correct remainingTokens := newValTokens.Sub(unbondAmt.Amount) - validator = stakingcli.QueryStakingValidator(f, barVal) + validator = testutil2.QueryStakingValidator(f, barVal) require.Equal(t, remainingTokens, validator.Tokens) // Get unbonding delegations from the validator - validatorUbds := stakingcli.QueryStakingUnbondingDelegationsFrom(f, barVal) + validatorUbds := testutil2.QueryStakingUnbondingDelegationsFrom(f, barVal) require.Len(t, validatorUbds, 1) require.Len(t, validatorUbds[0].Entries, 1) require.Equal(t, remainingTokens.String(), validatorUbds[0].Entries[0].Balance.String()) diff --git a/x/staking/client/cli_test/helpers.go b/x/staking/client/testutil/helpers.go similarity index 99% rename from x/staking/client/cli_test/helpers.go rename to x/staking/client/testutil/helpers.go index 57d67a7f8546..69bcec92bd43 100644 --- a/x/staking/client/cli_test/helpers.go +++ b/x/staking/client/testutil/helpers.go @@ -1,4 +1,4 @@ -package cli +package testutil import ( "fmt"