2018-04-18 11:06:49 -07:00
|
|
|
package clitest
|
2018-04-13 13:08:06 -07:00
|
|
|
|
|
|
|
import (
|
2018-04-14 13:52:58 -07:00
|
|
|
"encoding/hex"
|
2018-04-13 13:08:06 -07:00
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"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"
|
|
|
|
|
2018-04-14 13:52:58 -07:00
|
|
|
"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"
|
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"
|
2018-04-14 13:52:58 -07:00
|
|
|
crypto "github.com/tendermint/go-crypto"
|
|
|
|
crkeys "github.com/tendermint/go-crypto/keys"
|
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-17 21:33:33 -07:00
|
|
|
tests.ExecuteT(t, "gaiad unsafe_reset_all", 1)
|
2018-04-16 16:49:00 -07:00
|
|
|
pass := "1234567890"
|
|
|
|
executeWrite(t, "gaiacli keys delete foo", pass)
|
|
|
|
executeWrite(t, "gaiacli keys delete bar", pass)
|
|
|
|
masterKey, chainID := executeInit(t, "gaiad init")
|
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
|
|
|
|
cmd, _, _ := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr))
|
|
|
|
defer cmd.Process.Kill()
|
2018-04-16 16:17:09 -07:00
|
|
|
|
2018-04-16 16:49:00 -07:00
|
|
|
executeWrite(t, "gaiacli keys add foo --recover", pass, masterKey)
|
|
|
|
executeWrite(t, "gaiacli keys add bar", pass)
|
2018-04-16 16:17:09 -07:00
|
|
|
|
2018-04-16 16:49:00 -07:00
|
|
|
fooAddr, _ := executeGetAddr(t, "gaiacli keys show foo --output=json")
|
|
|
|
barAddr, _ := executeGetAddr(t, "gaiacli keys show bar --output=json")
|
2018-04-16 16:17:09 -07:00
|
|
|
|
2018-04-16 16:49:00 -07:00
|
|
|
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags))
|
|
|
|
assert.Equal(t, int64(100000), fooAcc.GetCoins().AmountOf("fermion"))
|
2018-04-16 16:17:09 -07:00
|
|
|
|
2018-04-16 16:49:00 -07:00
|
|
|
executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10fermion --to=%v --name=foo", flags, barAddr), pass)
|
|
|
|
time.Sleep(time.Second * 3) // waiting for some blocks to pass
|
2018-04-16 16:17:09 -07:00
|
|
|
|
2018-04-16 16:49:00 -07:00
|
|
|
barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags))
|
|
|
|
assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("fermion"))
|
|
|
|
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags))
|
|
|
|
assert.Equal(t, int64(99990), fooAcc.GetCoins().AmountOf("fermion"))
|
|
|
|
}
|
2018-04-16 16:17:09 -07:00
|
|
|
|
|
|
|
func TestGaiaCLIDeclareCandidacy(t *testing.T) {
|
2018-04-13 13:08:06 -07:00
|
|
|
|
2018-04-17 21:33:33 -07:00
|
|
|
tests.ExecuteT(t, "gaiad unsafe_reset_all", 1)
|
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-14 00:16:49 -07:00
|
|
|
masterKey, chainID := executeInit(t, "gaiad init")
|
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-04-14 00:16:49 -07:00
|
|
|
cmd, _, _ := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr))
|
2018-04-13 16:45:26 -07:00
|
|
|
defer cmd.Process.Kill()
|
2018-04-13 13:08:06 -07:00
|
|
|
|
2018-04-16 13:47:28 -07:00
|
|
|
executeWrite(t, "gaiacli keys add foo --recover", pass, masterKey)
|
2018-04-14 13:52:58 -07:00
|
|
|
fooAddr, fooPubKey := executeGetAddr(t, "gaiacli keys show foo --output=json")
|
|
|
|
fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags))
|
|
|
|
assert.Equal(t, int64(100000), fooAcc.GetCoins().AmountOf("fermion"))
|
|
|
|
|
2018-04-14 00:16:49 -07:00
|
|
|
// declare candidacy
|
2018-04-16 13:47:28 -07:00
|
|
|
declStr := fmt.Sprintf("gaiacli declare-candidacy %v", flags)
|
|
|
|
declStr += fmt.Sprintf(" --name=%v", "foo")
|
|
|
|
declStr += fmt.Sprintf(" --address-candidate=%v", fooAddr)
|
|
|
|
declStr += fmt.Sprintf(" --pubkey=%v", fooPubKey)
|
|
|
|
declStr += fmt.Sprintf(" --amount=%v", "3fermion")
|
|
|
|
declStr += fmt.Sprintf(" --moniker=%v", "foo-vally")
|
|
|
|
fmt.Printf("debug declStr: %v\n", declStr)
|
|
|
|
executeWrite(t, declStr, pass)
|
2018-04-16 16:17:09 -07:00
|
|
|
time.Sleep(time.Second * 3) // waiting for some blocks to pass
|
2018-04-16 16:49:00 -07:00
|
|
|
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags))
|
2018-04-16 16:17:09 -07:00
|
|
|
assert.Equal(t, int64(99997), fooAcc.GetCoins().AmountOf("fermion"))
|
2018-04-17 21:33:33 -07:00
|
|
|
candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, fooAddr))
|
2018-04-16 16:49:00 -07:00
|
|
|
assert.Equal(t, candidate.Address.String(), fooAddr)
|
2018-04-17 21:33:33 -07:00
|
|
|
assert.Equal(t, int64(3), candidate.Assets.Evaluate())
|
|
|
|
|
|
|
|
// TODO figure out why this times out with connection refused errors in go-bash
|
|
|
|
// unbond a single share
|
2018-04-18 11:21:07 -07:00
|
|
|
unbondStr := fmt.Sprintf("gaiacli unbond %v", flags)
|
|
|
|
unbondStr += fmt.Sprintf(" --name=%v", "foo")
|
|
|
|
unbondStr += fmt.Sprintf(" --address-candidate=%v", fooAddr)
|
|
|
|
unbondStr += fmt.Sprintf(" --address-delegator=%v", fooAddr)
|
|
|
|
unbondStr += fmt.Sprintf(" --shares=%v", "1")
|
|
|
|
unbondStr += fmt.Sprintf(" --sequence=%v", "1")
|
|
|
|
fmt.Printf("debug unbondStr: %v\n", unbondStr)
|
|
|
|
executeWrite(t, unbondStr, pass)
|
|
|
|
time.Sleep(time.Second * 3) // waiting for some blocks to pass
|
|
|
|
fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooAddr, flags))
|
|
|
|
assert.Equal(t, int64(99998), fooAcc.GetCoins().AmountOf("fermion"))
|
|
|
|
candidate = executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, fooAddr))
|
|
|
|
assert.Equal(t, int64(2), candidate.Assets.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) {
|
|
|
|
cmd, wc, _ := tests.GoExecuteT(t, cmdStr)
|
2018-04-14 13:52:58 -07:00
|
|
|
|
2018-04-16 16:17:09 -07:00
|
|
|
for _, write := range writes {
|
|
|
|
_, err := wc.Write([]byte(write + "\n"))
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
cmd.Wait()
|
|
|
|
}
|
|
|
|
|
|
|
|
func executeWritePrint(t *testing.T, cmdStr string, writes ...string) {
|
|
|
|
cmd, wc, rc := tests.GoExecuteT(t, cmdStr)
|
2018-04-14 13:52:58 -07:00
|
|
|
|
2018-04-14 00:16:49 -07:00
|
|
|
for _, write := range writes {
|
|
|
|
_, err := wc.Write([]byte(write + "\n"))
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
2018-04-13 16:45:26 -07:00
|
|
|
cmd.Wait()
|
2018-04-16 16:17:09 -07:00
|
|
|
|
|
|
|
bz := make([]byte, 100000)
|
|
|
|
rc.Read(bz)
|
|
|
|
fmt.Printf("debug read: %v\n", string(bz))
|
2018-04-14 00:16:49 -07:00
|
|
|
}
|
2018-04-13 13:08:06 -07:00
|
|
|
|
2018-04-14 00:16:49 -07:00
|
|
|
func executeInit(t *testing.T, cmdStr string) (masterKey, chainID string) {
|
2018-04-17 21:33:33 -07:00
|
|
|
out := tests.ExecuteT(t, cmdStr, 1)
|
2018-04-14 00:16:49 -07:00
|
|
|
outCut := "{" + strings.SplitN(out, "{", 2)[1] // weird I'm sorry
|
2018-04-13 16:45:26 -07:00
|
|
|
|
2018-04-14 00:16:49 -07:00
|
|
|
var initRes map[string]json.RawMessage
|
|
|
|
err := json.Unmarshal([]byte(outCut), &initRes)
|
2018-04-14 10:06:54 -07:00
|
|
|
require.NoError(t, err)
|
|
|
|
err = json.Unmarshal(initRes["secret"], &masterKey)
|
|
|
|
require.NoError(t, err)
|
|
|
|
err = json.Unmarshal(initRes["chain_id"], &chainID)
|
|
|
|
require.NoError(t, err)
|
2018-04-14 00:16:49 -07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-04-14 13:52:58 -07:00
|
|
|
func executeGetAddr(t *testing.T, cmdStr string) (addr, pubKey string) {
|
2018-04-17 21:33:33 -07:00
|
|
|
out := tests.ExecuteT(t, cmdStr, 2)
|
2018-04-14 13:52:58 -07:00
|
|
|
var info crkeys.Info
|
|
|
|
keys.UnmarshalJSON([]byte(out), &info)
|
|
|
|
pubKey = hex.EncodeToString(info.PubKey.(crypto.PubKeyEd25519).Bytes())
|
2018-04-16 16:49:00 -07:00
|
|
|
|
|
|
|
// TODO this is really wierd, also error that not 64 characters!
|
2018-04-14 13:52:58 -07:00
|
|
|
pubKey = strings.TrimLeft(pubKey, "1624de6220")
|
2018-04-16 16:49:00 -07:00
|
|
|
pubKey = fmt.Sprintf("%064v", pubKey)
|
|
|
|
|
2018-04-14 13:52:58 -07:00
|
|
|
fmt.Printf("debug pubKey: %v\n", pubKey)
|
|
|
|
addr = info.PubKey.Address().String()
|
|
|
|
fmt.Printf("debug addr: %v\n", addr)
|
|
|
|
return
|
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-17 21:33:33 -07:00
|
|
|
out := tests.ExecuteT(t, cmdStr, 2)
|
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
|
|
|
|
_ = json.Unmarshal(value, &acc) //XXX pubkey can't be decoded go amino issue
|
|
|
|
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.Candidate {
|
2018-04-17 21:33:33 -07:00
|
|
|
out := tests.ExecuteT(t, cmdStr, 2)
|
2018-04-16 16:49:00 -07:00
|
|
|
var candidate stake.Candidate
|
|
|
|
cdc := app.MakeCodec()
|
|
|
|
err := cdc.UnmarshalJSON([]byte(out), &candidate)
|
|
|
|
require.NoError(t, err, "out %v, err %v", out, err)
|
|
|
|
return candidate
|
|
|
|
}
|