From 871574888b5baea46ada824d4a0907f7d9a4f0ae Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Thu, 31 May 2018 04:16:05 -0700 Subject: [PATCH 01/14] Make Execute and GoExecute log better --- cmd/gaia/cli_test/cli_test.go | 37 +++--------- tests/gobash.go | 104 ++++++++++++++++++++++---------- tests/process.go | 109 ++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 60 deletions(-) create mode 100644 tests/process.go diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 0f549d6d6f..7efe07f91a 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -34,8 +34,8 @@ func TestGaiaCLISend(t *testing.T) { flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server - cmd, _, _ := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) - defer cmd.Process.Kill() + proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) + defer proc.Stop(false) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") @@ -83,8 +83,8 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server - cmd, _, _ := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) - defer cmd.Process.Kill() + proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) + defer proc.Stop(false) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") @@ -115,7 +115,7 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { declStr += fmt.Sprintf(" --validator-address=%v", bechVal) declStr += fmt.Sprintf(" --amount=%v", "3steak") declStr += fmt.Sprintf(" --moniker=%v", "bar-vally") - fmt.Printf("debug declStr: %v\n", declStr) + t.Log(fmt.Sprintf("debug declStr: %v\n", declStr)) executeWrite(t, declStr, pass) time.Sleep(time.Second) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) @@ -132,7 +132,7 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { //unbondStr += fmt.Sprintf(" --address-delegator=%v", barAddr) //unbondStr += fmt.Sprintf(" --shares=%v", "1") //unbondStr += fmt.Sprintf(" --sequence=%v", "1") - //fmt.Printf("debug unbondStr: %v\n", unbondStr) + //t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) //executeWrite(t, unbondStr, pass) //time.Sleep(time.Second * 3) // waiting for some blocks to pass //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) @@ -142,32 +142,13 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { } func executeWrite(t *testing.T, cmdStr string, writes ...string) { - cmd, wc, _ := tests.GoExecuteT(t, cmdStr) + proc := tests.GoExecuteT(t, cmdStr) for _, write := range writes { - _, err := wc.Write([]byte(write + "\n")) - if err != nil { - fmt.Println(err) - } + _, err := proc.StdinPipe.Write([]byte(write + "\n")) require.NoError(t, err) } - fmt.Printf("debug waiting cmdStr: %v\n", cmdStr) - cmd.Wait() -} - -func executeWritePrint(t *testing.T, cmdStr string, writes ...string) { - cmd, wc, rc := tests.GoExecuteT(t, cmdStr) - - for _, write := range writes { - _, err := wc.Write([]byte(write + "\n")) - require.NoError(t, err) - } - fmt.Printf("debug waiting cmdStr: %v\n", cmdStr) - cmd.Wait() - - bz := make([]byte, 100000) - rc.Read(bz) - fmt.Printf("debug read: %v\n", string(bz)) + proc.Wait() } func executeInit(t *testing.T, cmdStr string) (chainID string) { diff --git a/tests/gobash.go b/tests/gobash.go index baa84f417f..f46bad3c1c 100644 --- a/tests/gobash.go +++ b/tests/gobash.go @@ -1,51 +1,91 @@ package tests import ( - "io" - "os/exec" "strings" "testing" - "time" "github.com/stretchr/testify/require" + cmn "github.com/tendermint/tmlibs/common" ) -func getCmd(t *testing.T, command string) *exec.Cmd { +// Execute the command, return stdout, logging stdout/err to t. +func ExecuteT(t *testing.T, cmd string) (out string) { + t.Log("Running", cmn.Cyan(cmd)) - //split command into command and args - split := strings.Split(command, " ") + // Split cmd to name and args. + split := strings.Split(cmd, " ") require.True(t, len(split) > 0, "no command provided") - - var cmd *exec.Cmd - if len(split) == 1 { - cmd = exec.Command(split[0]) - } else { - cmd = exec.Command(split[0], split[1:]...) + name, args := split[0], []string(nil) + if len(split) > 1 { + args = split[1:] } - return cmd -} -// Execute the command, return standard output and error, try a few times if requested -func ExecuteT(t *testing.T, command string) (out string) { - cmd := getCmd(t, command) - bz, err := cmd.CombinedOutput() - if err != nil { - panic(err) + // Start process and wait. + proc, err := StartProcess("", name, args, nil, nil) + require.NoError(t, err) + proc.Wait() + + // Get the output. + outbz := proc.StdoutBuffer.Bytes() + errbz := proc.StderrBuffer.Bytes() + + // Log output. + if len(outbz) > 0 { + t.Log("Stdout:", cmn.Green(string(outbz))) } - require.NoError(t, err, string(bz)) - out = strings.Trim(string(bz), "\n") //trim any new lines - time.Sleep(time.Second) + if len(errbz) > 0 { + t.Log("Stderr:", cmn.Red(string(errbz))) + } + + // Collect STDOUT output. + out = strings.Trim(string(outbz), "\n") //trim any new lines return out } -// Asynchronously execute the command, return standard output and error -func GoExecuteT(t *testing.T, command string) (cmd *exec.Cmd, pipeIn io.WriteCloser, pipeOut io.ReadCloser) { - cmd = getCmd(t, command) - pipeIn, err := cmd.StdinPipe() +// Execute the command, launch goroutines to log stdout/err to t. +// Caller should wait for .Wait() or .Stop() to terminate. +func GoExecuteT(t *testing.T, cmd string) (proc *Process) { + t.Log("Running", cmn.Cyan(cmd)) + + // Split cmd to name and args. + split := strings.Split(cmd, " ") + require.True(t, len(split) > 0, "no command provided") + name, args := split[0], []string(nil) + if len(split) > 1 { + args = split[1:] + } + + // Start process. + proc, err := StartProcess("", name, args, nil, nil) require.NoError(t, err) - pipeOut, err = cmd.StdoutPipe() - require.NoError(t, err) - cmd.Start() - time.Sleep(time.Second) - return cmd, pipeIn, pipeOut + + // Run goroutines to log stdout. + go func() { + buf := make([]byte, 10240) // TODO Document the effects. + for { + n, err := proc.StdoutBuffer.Read(buf) + if err != nil { + return + } + if n > 0 { + t.Log("Stdout:", cmn.Green(string(buf[:n]))) + } + } + }() + + // Run goroutines to log stderr. + go func() { + buf := make([]byte, 10240) // TODO Document the effects. + for { + n, err := proc.StderrBuffer.Read(buf) + if err != nil { + return + } + if n > 0 { + t.Log("Stderr:", cmn.Red(string(buf[:n]))) + } + } + }() + + return proc } diff --git a/tests/process.go b/tests/process.go new file mode 100644 index 0000000000..fcc6e3e0ea --- /dev/null +++ b/tests/process.go @@ -0,0 +1,109 @@ +package tests + +import ( + "bytes" + "io" + "os" + "os/exec" + "time" +) + +type Process struct { + ExecPath string + Args []string + Pid int + StartTime time.Time + EndTime time.Time + Cmd *exec.Cmd `json:"-"` + ExitState *os.ProcessState `json:"-"` + WaitCh chan struct{} `json:"-"` + StdinPipe io.WriteCloser `json:"-"` + StdoutBuffer *bytes.Buffer `json:"-"` + StderrBuffer *bytes.Buffer `json:"-"` +} + +// dir: The working directory. If "", os.Getwd() is used. +// name: Command name +// args: Args to command. (should not include name) +// outFile, errFile: If not nil, will use, otherwise new Buffers will be +// allocated. Either way, Process.Cmd.StdoutPipe and Process.Cmd.StderrPipe will be nil +// respectively. +func StartProcess(dir string, name string, args []string, outFile, errFile io.WriteCloser) (*Process, error) { + var cmd = exec.Command(name, args...) // is not yet started. + // cmd dir + if dir == "" { + pwd, err := os.Getwd() + if err != nil { + panic(err) + } + cmd.Dir = pwd + } else { + cmd.Dir = dir + } + // cmd stdin + stdin, err := cmd.StdinPipe() + if err != nil { + return nil, err + } + // cmd stdout, stderr + var outBuffer, errBuffer *bytes.Buffer + if outFile != nil { + cmd.Stdout = outFile + } else { + outBuffer = bytes.NewBuffer(nil) + cmd.Stdout = outBuffer + } + if errFile != nil { + cmd.Stderr = errFile + } else { + errBuffer = bytes.NewBuffer(nil) + cmd.Stderr = errBuffer + } + // cmd start + if err := cmd.Start(); err != nil { + return nil, err + } + proc := &Process{ + ExecPath: name, + Args: args, + Pid: cmd.Process.Pid, + StartTime: time.Now(), + Cmd: cmd, + ExitState: nil, + WaitCh: make(chan struct{}), + StdinPipe: stdin, + } + if outBuffer != nil { + proc.StdoutBuffer = outBuffer + } + if errBuffer != nil { + proc.StderrBuffer = errBuffer + } + go func() { + err := proc.Cmd.Wait() + if err != nil { + // fmt.Printf("Process exit: %v\n", err) + if exitError, ok := err.(*exec.ExitError); ok { + proc.ExitState = exitError.ProcessState + } + } + proc.ExitState = proc.Cmd.ProcessState + proc.EndTime = time.Now() // TODO make this goroutine-safe + close(proc.WaitCh) + }() + return proc, nil +} + +func (proc *Process) Stop(kill bool) error { + if kill { + // fmt.Printf("Killing process %v\n", proc.Cmd.Process) + return proc.Cmd.Process.Kill() + } else { + // fmt.Printf("Stopping process %v\n", proc.Cmd.Process) + return proc.Cmd.Process.Signal(os.Interrupt) + } +} + +func (proc *Process) Wait() { + <-proc.WaitCh +} From 94e78e060288a2296b890bcabfb9490ecb35b0ef Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 11:00:54 -0700 Subject: [PATCH 02/14] cech32 fixes for TestGaiaCLISend --- cmd/gaia/cli_test/cli_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 7efe07f91a..c76221c2d7 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -48,10 +48,11 @@ func TestGaiaCLISend(t *testing.T) { if err != nil { t.Error(err) } + time.Sleep(time.Second * 5) // Wait for RPC server to start. fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) @@ -60,7 +61,7 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) // test autosequencing - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barAddr), pass) + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) From afc2bbfe091a46154e271083369768d8032e9bba Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 12:10:12 -0700 Subject: [PATCH 03/14] working through cli --- client/keys/utils.go | 2 +- cmd/gaia/cli_test/cli_test.go | 118 +++++++++++++++++----------------- cmd/gaia/cmd/gaiacli/main.go | 4 +- x/stake/client/cli/tx.go | 4 +- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index 1a358cfc9c..7224294290 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -76,7 +76,7 @@ func printInfo(info keys.Info) { fmt.Printf("NAME:\tADDRESS:\t\t\t\t\t\tPUBKEY:\n") printKeyOutput(ko) case "json": - out, err := json.MarshalIndent(ko, "", "\t") + out, err := MarshalJSON(ko) if err != nil { panic(err) } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index c76221c2d7..8d98486d72 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -36,41 +36,37 @@ func TestGaiaCLISend(t *testing.T) { // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) + time.Sleep(time.Second * 5) // Wait for RPC server to start. fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") + fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) + require.NoError(t, err) barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + barCech, err := sdk.Bech32CosmosifyAcc(barAddr) + require.NoError(t, err) - fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr) - if err != nil { - t.Error(err) - } - barBech, err := sdk.Bech32CosmosifyAcc(barAddr) - if err != nil { - t.Error(err) - } - time.Sleep(time.Second * 5) // Wait for RPC server to start. - fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + time.Sleep(time.Second * 2) // waiting for some blocks to pass - barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) - fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) // test autosequencing - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + time.Sleep(time.Second * 2) // waiting for some blocks to pass - barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(20), barAcc.GetCoins().AmountOf("steak")) - fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(30), fooAcc.GetCoins().AmountOf("steak")) } -func TestGaiaCLIDeclareCandidacy(t *testing.T) { +func TestGaiaCLICreateValidator(t *testing.T) { tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" @@ -86,62 +82,67 @@ func TestGaiaCLIDeclareCandidacy(t *testing.T) { // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) + time.Sleep(time.Second * 5) // Wait for RPC server to start. fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") - barAddr, _ := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) + require.NoError(t, err) + barAddr, barPubKey := executeGetAddrPK(t, "gaiacli keys show bar --output=json") + barCech, err := sdk.Bech32CosmosifyAcc(barAddr) + require.NoError(t, err) + barCeshPubKey, err := sdk.Bech32CosmosifyValPub(barPubKey) + require.NoError(t, err) - fooBech, err := sdk.Bech32CosmosifyAcc(fooAddr) - if err != nil { - t.Error(err) - } - barBech, err := sdk.Bech32CosmosifyAcc(barAddr) - if err != nil { - t.Error(err) - } - valPrivkey := crypto.GenPrivKeyEd25519() - valAddr := sdk.Address((valPrivkey.PubKey().Address())) - bechVal, err := sdk.Bech32CosmosifyVal(valAddr) + executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + time.Sleep(time.Second * 2) // waiting for some blocks to pass - executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barBech), pass) - time.Sleep(time.Second * 3) // waiting for some blocks to pass - - fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooBech, flags)) - assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) - barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barBech, flags)) + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(10), barAcc.GetCoins().AmountOf("steak")) + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) + assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) + + //valPrivkey := crypto.GenPrivKeyEd25519() + //valAddr := sdk.Address((valPrivkey.PubKey().Address())) + //bechVal, err := sdk.Bech32CosmosifyVal(valAddr) // declare candidacy - declStr := fmt.Sprintf("gaiacli create-validator %v", flags) - declStr += fmt.Sprintf(" --name=%v", "bar") - declStr += fmt.Sprintf(" --validator-address=%v", bechVal) - declStr += fmt.Sprintf(" --amount=%v", "3steak") - declStr += fmt.Sprintf(" --moniker=%v", "bar-vally") - t.Log(fmt.Sprintf("debug declStr: %v\n", declStr)) - executeWrite(t, declStr, pass) - time.Sleep(time.Second) // waiting for some blocks to pass - barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) + cvStr += fmt.Sprintf(" --name=%v", "bar") + cvStr += fmt.Sprintf(" --validator-address=%v", barCech) + cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) + cvStr += fmt.Sprintf(" --amount=%v", "3steak") + cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") + + executeWrite(t, cvStr, pass) + time.Sleep(time.Second * 5) // waiting for some blocks to pass + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) assert.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak")) - candidate := executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr)) - assert.Equal(t, candidate.Owner.String(), barAddr) - assert.Equal(t, int64(3), candidate.PoolShares) + + validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v %v", barCech, flags)) + assert.Equal(t, validator.Owner.String(), barCech) + assert.Equal(t, int64(3), validator.PoolShares) // TODO timeout issues if not connected to the internet // unbond a single share //unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) //unbondStr += fmt.Sprintf(" --name=%v", "bar") - //unbondStr += fmt.Sprintf(" --address-candidate=%v", barAddr) - //unbondStr += fmt.Sprintf(" --address-delegator=%v", barAddr) + //unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) + //unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) //unbondStr += fmt.Sprintf(" --shares=%v", "1") //unbondStr += fmt.Sprintf(" --sequence=%v", "1") //t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) //executeWrite(t, unbondStr, pass) //time.Sleep(time.Second * 3) // waiting for some blocks to pass - //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barAddr, flags)) + //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) //assert.Equal(t, int64(99998), barAcc.GetCoins().AmountOf("steak")) - //candidate = executeGetCandidate(t, fmt.Sprintf("gaiacli candidate %v --address-candidate=%v", flags, barAddr)) - //assert.Equal(t, int64(2), candidate.BondedShares.Evaluate()) + //validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --address-validator=%v", flags, barCech)) + //assert.Equal(t, int64(2), validator.BondedShares.Evaluate()) } +//___________________________________________________________________________________ +// executors + func executeWrite(t *testing.T, cmdStr string, writes ...string) { proc := tests.GoExecuteT(t, cmdStr) @@ -169,6 +170,7 @@ func executeGetAddrPK(t *testing.T, cmdStr string) (sdk.Address, crypto.PubKey) out := tests.ExecuteT(t, cmdStr) var ko keys.KeyOutput keys.UnmarshalJSON([]byte(out), &ko) + return ko.Address, ko.PubKey } @@ -186,11 +188,11 @@ func executeGetAccount(t *testing.T, cmdStr string) auth.BaseAccount { return acc } -func executeGetCandidate(t *testing.T, cmdStr string) stake.Validator { +func executeGetValidator(t *testing.T, cmdStr string) stake.Validator { out := tests.ExecuteT(t, cmdStr) - var candidate stake.Validator + var validator stake.Validator cdc := app.MakeCodec() - err := cdc.UnmarshalJSON([]byte(out), &candidate) + err := cdc.UnmarshalJSON([]byte(out), &validator) require.NoError(t, err, "out %v, err %v", out, err) - return candidate + return validator } diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index 2f36201b2f..51dab68e28 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -55,8 +55,8 @@ func main() { bankcmd.SendTxCmd(cdc), ibccmd.IBCTransferCmd(cdc), ibccmd.IBCRelayCmd(cdc), - stakecmd.GetCmdDeclareCandidacy(cdc), - stakecmd.GetCmdEditCandidacy(cdc), + stakecmd.GetCmdCreateValidator(cdc), + stakecmd.GetCmdEditValidator(cdc), stakecmd.GetCmdDelegate(cdc), stakecmd.GetCmdUnbond(cdc), )...) diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index dc88bfc209..5cd2656b62 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -14,7 +14,7 @@ import ( ) // create declare candidacy command -func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { +func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "create-validator", Short: "create new validator initialized with a self-delegation to it", @@ -68,7 +68,7 @@ func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command { } // create edit candidacy command -func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command { +func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "edit-validator", Short: "edit and existing validator account", From 952aedc4f19c25cc92c5abc8fe7744341d0872d0 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 12:22:46 -0700 Subject: [PATCH 04/14] get rid of candidacy references --- CHANGELOG.md | 4 +- cmd/gaia/app/app_test.go | 12 +++--- cmd/gaia/cli_test/cli_test.go | 2 +- examples/basecoin/cmd/basecli/main.go | 4 +- examples/democoin/x/simplestake/msgs.go | 4 +- x/slashing/keeper_test.go | 4 +- x/slashing/test_common.go | 4 +- x/stake/client/cli/tx.go | 12 +++--- x/stake/errors.go | 4 +- x/stake/handler.go | 24 +++++------ x/stake/handler_test.go | 54 ++++++++++++------------- x/stake/msg.go | 40 +++++++++--------- x/stake/msg_test.go | 16 ++++---- x/stake/test_common.go | 4 +- x/stake/wire.go | 4 +- 15 files changed, 96 insertions(+), 96 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f12eaa4203..8a0bed5b18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,7 +100,7 @@ FEATURES * [gaiacli] Support queries for candidates, delegator-bonds * [gaiad] Added `gaiad export` command to export current state to JSON * [x/bank] Tx tags with sender/recipient for indexing & later retrieval -* [x/stake] Tx tags with delegator/candidate for delegation & unbonding, and candidate info for declare candidate / edit candidacy +* [x/stake] Tx tags with delegator/candidate for delegation & unbonding, and candidate info for declare candidate / edit validator IMPROVEMENTS @@ -134,7 +134,7 @@ BREAKING CHANGES FEATURES: -* Gaia stake commands include, DeclareCandidacy, EditCandidacy, Delegate, Unbond +* Gaia stake commands include, CreateValidator, EditValidator, Delegate, Unbond * MountStoreWithDB without providing a custom store works. * Repo is now lint compliant / GoMetaLinter with tendermint-lint integrated into CI * Better key output, pubkey go-amino hex bytes now output by default diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index b6f1c9e03c..13ffdc33b7 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -394,13 +394,13 @@ func TestStakeMsgs(t *testing.T) { require.Equal(t, acc1, res1) require.Equal(t, acc2, res2) - // Declare Candidacy + // Create Validator description := stake.NewDescription("foo_moniker", "", "", "") - declareCandidacyMsg := stake.NewMsgDeclareCandidacy( + createValidatorMsg := stake.NewMsgCreateValidator( addr1, priv1.PubKey(), bondCoin, description, ) - SignCheckDeliver(t, gapp, declareCandidacyMsg, []int64{0}, true, priv1) + SignCheckDeliver(t, gapp, createValidatorMsg, []int64{0}, true, priv1) ctxDeliver := gapp.BaseApp.NewContext(false, abci.Header{}) res1 = gapp.accountMapper.GetAccount(ctxDeliver, addr1) @@ -415,13 +415,13 @@ func TestStakeMsgs(t *testing.T) { bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1) require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares)) - // Edit Candidacy + // Edit Validator description = stake.NewDescription("bar_moniker", "", "", "") - editCandidacyMsg := stake.NewMsgEditCandidacy( + editValidatorMsg := stake.NewMsgEditValidator( addr1, description, ) - SignDeliver(t, gapp, editCandidacyMsg, []int64{1}, true, priv1) + SignDeliver(t, gapp, editValidatorMsg, []int64{1}, true, priv1) validator, found = gapp.stakeKeeper.GetValidator(ctxDeliver, addr1) require.True(t, found) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 8d98486d72..79deaeb983 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -105,7 +105,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { //valAddr := sdk.Address((valPrivkey.PubKey().Address())) //bechVal, err := sdk.Bech32CosmosifyVal(valAddr) - // declare candidacy + // create validator cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --validator-address=%v", barCech) diff --git a/examples/basecoin/cmd/basecli/main.go b/examples/basecoin/cmd/basecli/main.go index f5385b5596..6540af38aa 100644 --- a/examples/basecoin/cmd/basecli/main.go +++ b/examples/basecoin/cmd/basecli/main.go @@ -59,8 +59,8 @@ func main() { bankcmd.SendTxCmd(cdc), ibccmd.IBCTransferCmd(cdc), ibccmd.IBCRelayCmd(cdc), - stakecmd.GetCmdDeclareCandidacy(cdc), - stakecmd.GetCmdEditCandidacy(cdc), + stakecmd.GetCmdCreateValidator(cdc), + stakecmd.GetCmdEditValidator(cdc), stakecmd.GetCmdDelegate(cdc), stakecmd.GetCmdUnbond(cdc), )...) diff --git a/examples/democoin/x/simplestake/msgs.go b/examples/democoin/x/simplestake/msgs.go index 01797a65bf..605f6f4e23 100644 --- a/examples/democoin/x/simplestake/msgs.go +++ b/examples/democoin/x/simplestake/msgs.go @@ -26,7 +26,7 @@ func NewMsgBond(addr sdk.Address, stake sdk.Coin, pubKey crypto.PubKey) MsgBond } //nolint -func (msg MsgBond) Type() string { return moduleName } //TODO update "stake/declarecandidacy" +func (msg MsgBond) Type() string { return moduleName } //TODO update "stake/createvalidator" func (msg MsgBond) GetSigners() []sdk.Address { return []sdk.Address{msg.Address} } // basic validation of the bond message @@ -65,7 +65,7 @@ func NewMsgUnbond(addr sdk.Address) MsgUnbond { } //nolint -func (msg MsgUnbond) Type() string { return moduleName } //TODO update "stake/declarecandidacy" +func (msg MsgUnbond) Type() string { return moduleName } //TODO update "stake/createvalidator" func (msg MsgUnbond) GetSigners() []sdk.Address { return []sdk.Address{msg.Address} } func (msg MsgUnbond) ValidateBasic() sdk.Error { return nil } diff --git a/x/slashing/keeper_test.go b/x/slashing/keeper_test.go index 3d6da8c232..a385627737 100644 --- a/x/slashing/keeper_test.go +++ b/x/slashing/keeper_test.go @@ -16,7 +16,7 @@ func TestHandleDoubleSign(t *testing.T) { // initial setup ctx, ck, sk, keeper := createTestInput(t) addr, val, amt := addrs[0], pks[0], int64(100) - got := stake.NewHandler(sk)(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + got := stake.NewHandler(sk)(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) @@ -39,7 +39,7 @@ func TestHandleAbsentValidator(t *testing.T) { addr, val, amt := addrs[0], pks[0], int64(100) sh := stake.NewHandler(sk) slh := NewHandler(keeper) - got := sh(ctx, newTestMsgDeclareCandidacy(addr, val, amt)) + got := sh(ctx, newTestMsgCreateValidator(addr, val, amt)) require.True(t, got.IsOK()) sk.Tick(ctx) require.Equal(t, ck.GetCoins(ctx, addr), sdk.Coins{{sk.GetParams(ctx).BondDenom, initCoins - amt}}) diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 0228e9498b..c76eaadde7 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -85,8 +85,8 @@ func testAddr(addr string) sdk.Address { return res } -func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgDeclareCandidacy { - return stake.MsgDeclareCandidacy{ +func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt int64) stake.MsgCreateValidator { + return stake.MsgCreateValidator{ Description: stake.Description{}, ValidatorAddr: address, PubKey: pubKey, diff --git a/x/stake/client/cli/tx.go b/x/stake/client/cli/tx.go index 5cd2656b62..3abd366ece 100644 --- a/x/stake/client/cli/tx.go +++ b/x/stake/client/cli/tx.go @@ -13,7 +13,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/stake" ) -// create declare candidacy command +// create create validator command func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "create-validator", @@ -47,7 +47,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { Website: viper.GetString(FlagWebsite), Details: viper.GetString(FlagDetails), } - msg := stake.NewMsgDeclareCandidacy(validatorAddr, pk, amount, description) + msg := stake.NewMsgCreateValidator(validatorAddr, pk, amount, description) // build and sign the transaction, then broadcast to Tendermint res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc) @@ -67,7 +67,7 @@ func GetCmdCreateValidator(cdc *wire.Codec) *cobra.Command { return cmd } -// create edit candidacy command +// create edit validator command func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "edit-validator", @@ -84,7 +84,7 @@ func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { Website: viper.GetString(FlagWebsite), Details: viper.GetString(FlagDetails), } - msg := stake.NewMsgEditCandidacy(validatorAddr, description) + msg := stake.NewMsgEditValidator(validatorAddr, description) // build and sign the transaction, then broadcast to Tendermint ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) @@ -104,7 +104,7 @@ func GetCmdEditValidator(cdc *wire.Codec) *cobra.Command { return cmd } -// create edit candidacy command +// create edit validator command func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "delegate", @@ -142,7 +142,7 @@ func GetCmdDelegate(cdc *wire.Codec) *cobra.Command { return cmd } -// create edit candidacy command +// create edit validator command func GetCmdUnbond(cdc *wire.Codec) *cobra.Command { cmd := &cobra.Command{ Use: "unbond", diff --git a/x/stake/errors.go b/x/stake/errors.go index 77090d9dc3..0ae57530ad 100644 --- a/x/stake/errors.go +++ b/x/stake/errors.go @@ -73,10 +73,10 @@ func ErrBadDelegatorAddr(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Delegator does not exist for that address") } func ErrValidatorExistsAddr(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Validator already exist, cannot re-declare candidacy") + return newError(codespace, CodeInvalidValidator, "Validator already exist, cannot re-create validator") } func ErrValidatorRevoked(codespace sdk.CodespaceType) sdk.Error { - return newError(codespace, CodeInvalidValidator, "Candidacy for this address is currently revoked") + return newError(codespace, CodeInvalidValidator, "Validator for this address is currently revoked") } func ErrMissingSignature(codespace sdk.CodespaceType) sdk.Error { return newError(codespace, CodeInvalidValidator, "Missing signature") diff --git a/x/stake/handler.go b/x/stake/handler.go index 6f2360adf7..b1c6a95b59 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -11,10 +11,10 @@ func NewHandler(k Keeper) sdk.Handler { return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { // NOTE msg already has validate basic run switch msg := msg.(type) { - case MsgDeclareCandidacy: - return handleMsgDeclareCandidacy(ctx, msg, k) - case MsgEditCandidacy: - return handleMsgEditCandidacy(ctx, msg, k) + case MsgCreateValidator: + return handleMsgCreateValidator(ctx, msg, k) + case MsgEditValidator: + return handleMsgEditValidator(ctx, msg, k) case MsgDelegate: return handleMsgDelegate(ctx, msg, k) case MsgUnbond: @@ -39,7 +39,7 @@ func NewEndBlocker(k Keeper) sdk.EndBlocker { // These functions assume everything has been authenticated, // now we just perform action and save -func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keeper) sdk.Result { +func handleMsgCreateValidator(ctx sdk.Context, msg MsgCreateValidator, k Keeper) sdk.Result { // check to see if the pubkey or sender has been registered before _, found := k.GetValidator(ctx, msg.ValidatorAddr) @@ -57,7 +57,7 @@ func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keepe k.setValidator(ctx, validator) k.setValidatorByPubKeyIndex(ctx, validator) tags := sdk.NewTags( - "action", []byte("declareCandidacy"), + "action", []byte("createValidator"), "validator", msg.ValidatorAddr.Bytes(), "moniker", []byte(msg.Description.Moniker), "identity", []byte(msg.Description.Identity), @@ -75,7 +75,7 @@ func handleMsgDeclareCandidacy(ctx sdk.Context, msg MsgDeclareCandidacy, k Keepe } } -func handleMsgEditCandidacy(ctx sdk.Context, msg MsgEditCandidacy, k Keeper) sdk.Result { +func handleMsgEditValidator(ctx sdk.Context, msg MsgEditValidator, k Keeper) sdk.Result { // validator must already be registered validator, found := k.GetValidator(ctx, msg.ValidatorAddr) @@ -95,7 +95,7 @@ func handleMsgEditCandidacy(ctx sdk.Context, msg MsgEditCandidacy, k Keeper) sdk k.updateValidator(ctx, validator) tags := sdk.NewTags( - "action", []byte("editCandidacy"), + "action", []byte("editValidator"), "validator", msg.ValidatorAddr.Bytes(), "moniker", []byte(msg.Description.Moniker), "identity", []byte(msg.Description.Identity), @@ -207,14 +207,14 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { bond.Shares = bond.Shares.Sub(delShares) // remove the bond - revokeCandidacy := false + revokeValidator := false if bond.Shares.IsZero() { // if the bond is the owner of the validator then - // trigger a revoke candidacy + // trigger a revoke validator if bytes.Equal(bond.DelegatorAddr, validator.Owner) && validator.Revoked == false { - revokeCandidacy = true + revokeValidator = true } k.removeDelegation(ctx, bond) @@ -233,7 +233,7 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result { ///////////////////////////////////// // revoke validator if necessary - if revokeCandidacy { + if revokeValidator { validator.Revoked = true } diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index 19848e8e6d..0c086f06db 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -14,8 +14,8 @@ import ( //______________________________________________________________________ -func newTestMsgDeclareCandidacy(address sdk.Address, pubKey crypto.PubKey, amt int64) MsgDeclareCandidacy { - return MsgDeclareCandidacy{ +func newTestMsgCreateValidator(address sdk.Address, pubKey crypto.PubKey, amt int64) MsgCreateValidator { + return MsgCreateValidator{ Description: Description{}, ValidatorAddr: address, PubKey: pubKey, @@ -33,13 +33,13 @@ func newTestMsgDelegate(delegatorAddr, validatorAddr sdk.Address, amt int64) Msg //______________________________________________________________________ -func TestDuplicatesMsgDeclareCandidacy(t *testing.T) { +func TestDuplicatesMsgCreateValidator(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 1000) validatorAddr := addrs[0] pk := pks[0] - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pk, 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pk, 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "%v", got) validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) @@ -51,8 +51,8 @@ func TestDuplicatesMsgDeclareCandidacy(t *testing.T) { assert.Equal(t, Description{}, validator.Description) // one validator cannot bond twice - msgDeclareCandidacy.PubKey = pks[1] - got = handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator.PubKey = pks[1] + got = handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.False(t, got.IsOK(), "%v", got) } @@ -64,10 +64,10 @@ func TestIncrementsMsgDelegate(t *testing.T) { bondAmount := int64(10) validatorAddr, delegatorAddr := addrs[0], addrs[1] - // first declare candidacy - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], bondAmount) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) - assert.True(t, got.IsOK(), "expected declare candidacy msg to be ok, got %v", got) + // first create validator + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], bondAmount) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + assert.True(t, got.IsOK(), "expected create validator msg to be ok, got %v", got) validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) @@ -134,12 +134,12 @@ func TestIncrementsMsgUnbond(t *testing.T) { ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) - // declare candidacy, delegate + // create validator, delegate validatorAddr, delegatorAddr := addrs[0], addrs[1] - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], initBond) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) - assert.True(t, got.IsOK(), "expected declare-candidacy to be ok, got %v", got) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], initBond) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + assert.True(t, got.IsOK(), "expected create-validator to be ok, got %v", got) msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, initBond) got = handleMsgDelegate(ctx, msgDelegate, keeper) @@ -216,7 +216,7 @@ func TestIncrementsMsgUnbond(t *testing.T) { "got: %v\nmsgUnbond: %v\nshares: %v\nleftBonded: %v\n", got, msgUnbond, unbondSharesStr, leftBonded) } -func TestMultipleMsgDeclareCandidacy(t *testing.T) { +func TestMultipleMsgCreateValidator(t *testing.T) { initBond := int64(1000) ctx, accMapper, keeper := createTestInput(t, false, initBond) params := keeper.GetParams(ctx) @@ -224,8 +224,8 @@ func TestMultipleMsgDeclareCandidacy(t *testing.T) { // bond them all for i, validatorAddr := range validatorAddrs { - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[i], 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[i], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected msg %d to be ok, got %v", i, got) //Check that the account is bonded @@ -266,8 +266,8 @@ func TestMultipleMsgDelegate(t *testing.T) { validatorAddr, delegatorAddrs := addrs[0], addrs[1:] //first make a validator - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) require.True(t, got.IsOK(), "expected msg to be ok, got %v", got) // delegate multiple parties @@ -294,14 +294,14 @@ func TestMultipleMsgDelegate(t *testing.T) { } } -func TestVoidCandidacy(t *testing.T) { +func TestRevokeValidator(t *testing.T) { ctx, _, keeper := createTestInput(t, false, 1000) validatorAddr, delegatorAddr := addrs[0], addrs[1] // create the validator - msgDeclareCandidacy := newTestMsgDeclareCandidacy(validatorAddr, pks[0], 10) - got := handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) - require.True(t, got.IsOK(), "expected no error on runMsgDeclareCandidacy") + msgCreateValidator := newTestMsgCreateValidator(validatorAddr, pks[0], 10) + got := handleMsgCreateValidator(ctx, msgCreateValidator, keeper) + require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") // bond a delegator msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, 10) @@ -311,7 +311,7 @@ func TestVoidCandidacy(t *testing.T) { // unbond the validators bond portion msgUnbondValidator := NewMsgUnbond(validatorAddr, validatorAddr, "10") got = handleMsgUnbond(ctx, msgUnbondValidator, keeper) - require.True(t, got.IsOK(), "expected no error on runMsgDeclareCandidacy") + require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") validator, found := keeper.GetValidator(ctx, validatorAddr) require.True(t, found) require.True(t, validator.Revoked) @@ -323,9 +323,9 @@ func TestVoidCandidacy(t *testing.T) { // test that the delegator can still withdraw their bonds msgUnbondDelegator := NewMsgUnbond(delegatorAddr, validatorAddr, "10") got = handleMsgUnbond(ctx, msgUnbondDelegator, keeper) - require.True(t, got.IsOK(), "expected no error on runMsgDeclareCandidacy") + require.True(t, got.IsOK(), "expected no error on runMsgCreateValidator") // verify that the pubkey can now be reused - got = handleMsgDeclareCandidacy(ctx, msgDeclareCandidacy, keeper) + got = handleMsgCreateValidator(ctx, msgCreateValidator, keeper) assert.True(t, got.IsOK(), "expected ok, got %v", got) } diff --git a/x/stake/msg.go b/x/stake/msg.go index 67d9597cac..40bf609eec 100644 --- a/x/stake/msg.go +++ b/x/stake/msg.go @@ -15,21 +15,21 @@ const MsgType = "stake" const StakingToken = "steak" //Verify interface at compile time -var _, _, _, _ sdk.Msg = &MsgDeclareCandidacy{}, &MsgEditCandidacy{}, &MsgDelegate{}, &MsgUnbond{} +var _, _, _, _ sdk.Msg = &MsgCreateValidator{}, &MsgEditValidator{}, &MsgDelegate{}, &MsgUnbond{} //______________________________________________________________________ -// MsgDeclareCandidacy - struct for unbonding transactions -type MsgDeclareCandidacy struct { +// MsgCreateValidator - struct for unbonding transactions +type MsgCreateValidator struct { Description ValidatorAddr sdk.Address `json:"address"` PubKey crypto.PubKey `json:"pubkey"` Bond sdk.Coin `json:"bond"` } -func NewMsgDeclareCandidacy(validatorAddr sdk.Address, pubkey crypto.PubKey, - bond sdk.Coin, description Description) MsgDeclareCandidacy { - return MsgDeclareCandidacy{ +func NewMsgCreateValidator(validatorAddr sdk.Address, pubkey crypto.PubKey, + bond sdk.Coin, description Description) MsgCreateValidator { + return MsgCreateValidator{ Description: description, ValidatorAddr: validatorAddr, PubKey: pubkey, @@ -38,18 +38,18 @@ func NewMsgDeclareCandidacy(validatorAddr sdk.Address, pubkey crypto.PubKey, } //nolint -func (msg MsgDeclareCandidacy) Type() string { return MsgType } //TODO update "stake/declarecandidacy" -func (msg MsgDeclareCandidacy) GetSigners() []sdk.Address { +func (msg MsgCreateValidator) Type() string { return MsgType } +func (msg MsgCreateValidator) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } // get the bytes for the message signer to sign on -func (msg MsgDeclareCandidacy) GetSignBytes() []byte { +func (msg MsgCreateValidator) GetSignBytes() []byte { return msgCdc.MustMarshalBinary(msg) } // quick validity check -func (msg MsgDeclareCandidacy) ValidateBasic() sdk.Error { +func (msg MsgCreateValidator) ValidateBasic() sdk.Error { if msg.ValidatorAddr == nil { return ErrValidatorEmpty(DefaultCodespace) } @@ -68,27 +68,27 @@ func (msg MsgDeclareCandidacy) ValidateBasic() sdk.Error { //______________________________________________________________________ -// MsgEditCandidacy - struct for editing a validator -type MsgEditCandidacy struct { +// MsgEditValidator - struct for editing a validator +type MsgEditValidator struct { Description ValidatorAddr sdk.Address `json:"address"` } -func NewMsgEditCandidacy(validatorAddr sdk.Address, description Description) MsgEditCandidacy { - return MsgEditCandidacy{ +func NewMsgEditValidator(validatorAddr sdk.Address, description Description) MsgEditValidator { + return MsgEditValidator{ Description: description, ValidatorAddr: validatorAddr, } } //nolint -func (msg MsgEditCandidacy) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" -func (msg MsgEditCandidacy) GetSigners() []sdk.Address { +func (msg MsgEditValidator) Type() string { return MsgType } +func (msg MsgEditValidator) GetSigners() []sdk.Address { return []sdk.Address{msg.ValidatorAddr} } // get the bytes for the message signer to sign on -func (msg MsgEditCandidacy) GetSignBytes() []byte { +func (msg MsgEditValidator) GetSignBytes() []byte { b, err := msgCdc.MarshalJSON(msg) if err != nil { panic(err) @@ -97,7 +97,7 @@ func (msg MsgEditCandidacy) GetSignBytes() []byte { } // quick validity check -func (msg MsgEditCandidacy) ValidateBasic() sdk.Error { +func (msg MsgEditValidator) ValidateBasic() sdk.Error { if msg.ValidatorAddr == nil { return ErrValidatorEmpty(DefaultCodespace) } @@ -126,7 +126,7 @@ func NewMsgDelegate(delegatorAddr, validatorAddr sdk.Address, bond sdk.Coin) Msg } //nolint -func (msg MsgDelegate) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" +func (msg MsgDelegate) Type() string { return MsgType } func (msg MsgDelegate) GetSigners() []sdk.Address { return []sdk.Address{msg.DelegatorAddr} } @@ -175,7 +175,7 @@ func NewMsgUnbond(delegatorAddr, validatorAddr sdk.Address, shares string) MsgUn } //nolint -func (msg MsgUnbond) Type() string { return MsgType } //TODO update "stake/msgeditcandidacy" +func (msg MsgUnbond) Type() string { return MsgType } func (msg MsgUnbond) GetSigners() []sdk.Address { return []sdk.Address{msg.DelegatorAddr} } // get the bytes for the message signer to sign on diff --git a/x/stake/msg_test.go b/x/stake/msg_test.go index 03a5fbf62f..863613a039 100644 --- a/x/stake/msg_test.go +++ b/x/stake/msg_test.go @@ -18,8 +18,8 @@ var ( coinNegNotAtoms = sdk.Coin{"foo", -10000} ) -// test ValidateBasic for MsgDeclareCandidacy -func TestMsgDeclareCandidacy(t *testing.T) { +// test ValidateBasic for MsgCreateValidator +func TestMsgCreateValidator(t *testing.T) { tests := []struct { name, moniker, identity, website, details string validatorAddr sdk.Address @@ -40,7 +40,7 @@ func TestMsgDeclareCandidacy(t *testing.T) { for _, tc := range tests { description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) - msg := NewMsgDeclareCandidacy(tc.validatorAddr, tc.pubkey, tc.bond, description) + msg := NewMsgCreateValidator(tc.validatorAddr, tc.pubkey, tc.bond, description) if tc.expectPass { assert.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) } else { @@ -49,8 +49,8 @@ func TestMsgDeclareCandidacy(t *testing.T) { } } -// test ValidateBasic for MsgEditCandidacy -func TestMsgEditCandidacy(t *testing.T) { +// test ValidateBasic for MsgEditValidator +func TestMsgEditValidator(t *testing.T) { tests := []struct { name, moniker, identity, website, details string validatorAddr sdk.Address @@ -64,7 +64,7 @@ func TestMsgEditCandidacy(t *testing.T) { for _, tc := range tests { description := NewDescription(tc.moniker, tc.identity, tc.website, tc.details) - msg := NewMsgEditCandidacy(tc.validatorAddr, description) + msg := NewMsgEditValidator(tc.validatorAddr, description) if tc.expectPass { assert.Nil(t, msg.ValidateBasic(), "test: %v", tc.name) } else { @@ -139,8 +139,8 @@ func TestMsgUnbond(t *testing.T) { //tests := []struct { //tx sdk.Msg //}{ -//{NewMsgDeclareCandidacy(addrs[0], pks[0], bond, Description{})}, -//{NewMsgEditCandidacy(addrs[0], Description{})}, +//{NewMsgCreateValidator(addrs[0], pks[0], bond, Description{})}, +//{NewMsgEditValidator(addrs[0], Description{})}, //{NewMsgDelegate(addrs[0], addrs[1], bond)}, //{NewMsgUnbond(addrs[0], addrs[1], strconv.Itoa(bondAmt))}, //} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 9f52ad8de9..ae4adf4d8f 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -68,8 +68,8 @@ func makeTestCodec() *wire.Codec { cdc.RegisterInterface((*sdk.Msg)(nil), nil) cdc.RegisterConcrete(bank.MsgSend{}, "test/stake/Send", nil) cdc.RegisterConcrete(bank.MsgIssue{}, "test/stake/Issue", nil) - cdc.RegisterConcrete(MsgDeclareCandidacy{}, "test/stake/DeclareCandidacy", nil) - cdc.RegisterConcrete(MsgEditCandidacy{}, "test/stake/EditCandidacy", nil) + cdc.RegisterConcrete(MsgCreateValidator{}, "test/stake/CreateValidator", nil) + cdc.RegisterConcrete(MsgEditValidator{}, "test/stake/EditValidator", nil) cdc.RegisterConcrete(MsgUnbond{}, "test/stake/Unbond", nil) // Register AppAccount diff --git a/x/stake/wire.go b/x/stake/wire.go index fb1a1c8867..c0b0be71fa 100644 --- a/x/stake/wire.go +++ b/x/stake/wire.go @@ -6,8 +6,8 @@ import ( // Register concrete types on wire codec func RegisterWire(cdc *wire.Codec) { - cdc.RegisterConcrete(MsgDeclareCandidacy{}, "cosmos-sdk/MsgDeclareCandidacy", nil) - cdc.RegisterConcrete(MsgEditCandidacy{}, "cosmos-sdk/MsgEditCandidacy", nil) + cdc.RegisterConcrete(MsgCreateValidator{}, "cosmos-sdk/MsgCreateValidator", nil) + cdc.RegisterConcrete(MsgEditValidator{}, "cosmos-sdk/MsgEditValidator", nil) cdc.RegisterConcrete(MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil) } From 17a861da43a0c2b06271bd936d494a55226098ea Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 12:29:39 -0700 Subject: [PATCH 05/14] key utils output with cdc --- client/keys/utils.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index 7224294290..3d6d9807ba 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -1,7 +1,6 @@ package keys import ( - "encoding/json" "fmt" "path/filepath" @@ -77,6 +76,7 @@ func printInfo(info keys.Info) { printKeyOutput(ko) case "json": out, err := MarshalJSON(ko) + //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } @@ -93,7 +93,8 @@ func printInfos(infos []keys.Info) { printKeyOutput(ko) } case "json": - out, err := json.MarshalIndent(kos, "", "\t") + out, err := MarshalJSON(ko) + //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } From 1f1097c4d3fa33d17b0eececd81ac9e06203929b Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 13:33:52 -0700 Subject: [PATCH 06/14] cli test bugs --- client/keys/utils.go | 2 +- cmd/gaia/cli_test/cli_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index 3d6d9807ba..f9990bf16d 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -93,7 +93,7 @@ func printInfos(infos []keys.Info) { printKeyOutput(ko) } case "json": - out, err := MarshalJSON(ko) + out, err := MarshalJSON(kos) //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 79deaeb983..17d14d053b 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -108,7 +108,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { // create validator cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") - cvStr += fmt.Sprintf(" --validator-address=%v", barCech) + cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) cvStr += fmt.Sprintf(" --amount=%v", "3steak") cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") @@ -117,7 +117,7 @@ func TestGaiaCLICreateValidator(t *testing.T) { time.Sleep(time.Second * 5) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - assert.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak")) + require.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v %v", barCech, flags)) assert.Equal(t, validator.Owner.String(), barCech) From 0b6aa3c047b5d88d580831e6f6845dbbee0c63c5 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 14:45:07 -0700 Subject: [PATCH 07/14] add test_cli to ci --- .circleci/config.yml | 19 +++++++++++++++++++ cmd/gaia/cli_test/cli_test.go | 14 +++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cd930d52ba..c8dc0b20ba 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -85,6 +85,22 @@ jobs: export PATH="$GOBIN:$PATH" make test_unit + test_cli: + <<: *defaults + parallelism: 1 + steps: + - attach_workspace: + at: /tmp/workspace + - restore_cache: + key: v1-pkg-cache + - restore_cache: + key: v1-tree-{{ .Environment.CIRCLE_SHA1 }} + - run: + name: Test cli + command: | + export PATH="$GOBIN:$PATH" + make test_cli + test_cover: <<: *defaults parallelism: 4 @@ -141,6 +157,9 @@ workflows: - test_unit: requires: - setup_dependencies + - test_cli: + requires: + - setup_dependencies - test_cover: requires: - setup_dependencies diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 17d14d053b..1e47572b14 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -110,18 +110,18 @@ func TestGaiaCLICreateValidator(t *testing.T) { cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) - cvStr += fmt.Sprintf(" --amount=%v", "3steak") + cvStr += fmt.Sprintf(" --amount=%v", "1steak") cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") executeWrite(t, cvStr, pass) - time.Sleep(time.Second * 5) // waiting for some blocks to pass + time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - require.Equal(t, int64(7), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) - validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v %v", barCech, flags)) - assert.Equal(t, validator.Owner.String(), barCech) - assert.Equal(t, int64(3), validator.PoolShares) + validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator --output=json %v %v", barCech, flags)) + assert.Equal(t, validator.Owner, barAddr) + assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) // TODO timeout issues if not connected to the internet // unbond a single share @@ -193,6 +193,6 @@ func executeGetValidator(t *testing.T, cmdStr string) stake.Validator { var validator stake.Validator cdc := app.MakeCodec() err := cdc.UnmarshalJSON([]byte(out), &validator) - require.NoError(t, err, "out %v, err %v", out, err) + require.NoError(t, err, "out %v\n, err %v", out, err) return validator } From 6f7cabf779152ab452bec3e7d10291383b6437e5 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 14:59:03 -0700 Subject: [PATCH 08/14] fix tests/process.go lint --- tests/process.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/process.go b/tests/process.go index fcc6e3e0ea..d2459a0b5b 100644 --- a/tests/process.go +++ b/tests/process.go @@ -8,6 +8,7 @@ import ( "time" ) +// execution process type Process struct { ExecPath string Args []string @@ -94,16 +95,16 @@ func StartProcess(dir string, name string, args []string, outFile, errFile io.Wr return proc, nil } +// stop the process func (proc *Process) Stop(kill bool) error { if kill { // fmt.Printf("Killing process %v\n", proc.Cmd.Process) return proc.Cmd.Process.Kill() - } else { - // fmt.Printf("Stopping process %v\n", proc.Cmd.Process) - return proc.Cmd.Process.Signal(os.Interrupt) } + return proc.Cmd.Process.Signal(os.Interrupt) } +// wait for the process func (proc *Process) Wait() { <-proc.WaitCh } From 4150fe5ec955da3d7eeb0fe46ee31ab01de281de Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 15:02:24 -0700 Subject: [PATCH 09/14] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a0bed5b18..037cf63078 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ IMPROVEMENTS * auth module uses go-wire codec instead of 'encoding/json' FIXES +* [cli] fixed cli-bash tests +* [ci] added cli-bash tests ## 0.18.1 From 89df36e1d4d30813c3f7f9808c3be4a628b182dd Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 15:39:42 -0700 Subject: [PATCH 10/14] ... --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c8dc0b20ba..5545ae4d3f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +tersion: 2 defaults: &defaults working_directory: /go/src/github.com/cosmos/cosmos-sdk @@ -154,10 +154,10 @@ workflows: - lint: requires: - setup_dependencies - - test_unit: + - test_cli: requires: - setup_dependencies - - test_cli: + - test_unit: requires: - setup_dependencies - test_cover: From a4e1e497cd6e30117182768a0f05701cb24e9a33 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 15:49:18 -0700 Subject: [PATCH 11/14] cwgoes comments --- client/keys/utils.go | 2 -- cmd/gaia/cli_test/cli_test.go | 41 ++++++++++++++++------------------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/client/keys/utils.go b/client/keys/utils.go index f9990bf16d..34e2ebcf37 100644 --- a/client/keys/utils.go +++ b/client/keys/utils.go @@ -76,7 +76,6 @@ func printInfo(info keys.Info) { printKeyOutput(ko) case "json": out, err := MarshalJSON(ko) - //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } @@ -94,7 +93,6 @@ func printInfos(infos []keys.Info) { } case "json": out, err := MarshalJSON(kos) - //out, err := json.MarshalIndent(kos, "", "\t") if err != nil { panic(err) } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 1e47572b14..f506a0d870 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -101,43 +101,40 @@ func TestGaiaCLICreateValidator(t *testing.T) { fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", fooCech, flags)) assert.Equal(t, int64(40), fooAcc.GetCoins().AmountOf("steak")) - //valPrivkey := crypto.GenPrivKeyEd25519() - //valAddr := sdk.Address((valPrivkey.PubKey().Address())) - //bechVal, err := sdk.Bech32CosmosifyVal(valAddr) - // create validator cvStr := fmt.Sprintf("gaiacli create-validator %v", flags) cvStr += fmt.Sprintf(" --name=%v", "bar") cvStr += fmt.Sprintf(" --address-validator=%v", barCech) cvStr += fmt.Sprintf(" --pubkey=%v", barCeshPubKey) - cvStr += fmt.Sprintf(" --amount=%v", "1steak") + cvStr += fmt.Sprintf(" --amount=%v", "2steak") cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") executeWrite(t, cvStr, pass) time.Sleep(time.Second * 3) // waiting for some blocks to pass barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + require.Equal(t, int64(8), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) - validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator --output=json %v %v", barCech, flags)) + validator := executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --output=json %v", barCech, flags)) assert.Equal(t, validator.Owner, barAddr) - assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) + assert.Equal(t, "2/1", validator.PoolShares.Amount.String()) - // TODO timeout issues if not connected to the internet // unbond a single share - //unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) - //unbondStr += fmt.Sprintf(" --name=%v", "bar") - //unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) - //unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) - //unbondStr += fmt.Sprintf(" --shares=%v", "1") - //unbondStr += fmt.Sprintf(" --sequence=%v", "1") - //t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) - //executeWrite(t, unbondStr, pass) - //time.Sleep(time.Second * 3) // waiting for some blocks to pass - //barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) - //assert.Equal(t, int64(99998), barAcc.GetCoins().AmountOf("steak")) - //validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --address-validator=%v", flags, barCech)) - //assert.Equal(t, int64(2), validator.BondedShares.Evaluate()) + unbondStr := fmt.Sprintf("gaiacli unbond %v", flags) + unbondStr += fmt.Sprintf(" --name=%v", "bar") + unbondStr += fmt.Sprintf(" --address-validator=%v", barCech) + unbondStr += fmt.Sprintf(" --address-delegator=%v", barCech) + unbondStr += fmt.Sprintf(" --shares=%v", "1") + unbondStr += fmt.Sprintf(" --sequence=%v", "1") + t.Log(fmt.Sprintf("debug unbondStr: %v\n", unbondStr)) + + executeWrite(t, unbondStr, pass) + time.Sleep(time.Second * 3) // waiting for some blocks to pass + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf("steak"), "%v", barAcc) + validator = executeGetValidator(t, fmt.Sprintf("gaiacli validator %v --output=json %v", barCech, flags)) + assert.Equal(t, "1/1", validator.PoolShares.Amount.String()) } //___________________________________________________________________________________ From 5515b60b0a1f64fc8fd414d2366a45c159353442 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 18:46:25 -0700 Subject: [PATCH 12/14] better tooling for cli, couple lsd fixes --- client/lcd/lcd_test.go | 10 ++++-- cmd/gaia/cli_test/cli_test.go | 13 +++++--- server/start_test.go | 8 +++-- server/test_helpers.go | 13 +++++--- tests/tests.go | 7 ++-- tests/util.go | 61 +++++++++++++++++------------------ 6 files changed, 63 insertions(+), 49 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 8c6530dec2..7a9cdbc254 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -34,6 +34,7 @@ import ( client "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" gapp "github.com/cosmos/cosmos-sdk/cmd/gaia/app" + "github.com/cosmos/cosmos-sdk/server" tests "github.com/cosmos/cosmos-sdk/tests" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" @@ -51,7 +52,7 @@ var ( // XXX bad globals name = "test" password = "0123456789" - port string // XXX: but it's the int ... + port string seed string sendAddr string ) @@ -456,8 +457,11 @@ func startTMAndLCD() (*nm.Node, net.Listener, error) { genDoc.AppStateJSON = appState // LCD listen address - port = fmt.Sprintf("%d", 17377) // XXX - listenAddr := fmt.Sprintf("tcp://localhost:%s", port) // XXX + var listenAddr string + listenAddr, port, err = server.FreeTCPAddr() + if err != nil { + return nil, nil, err + } // XXX: need to set this so LCD knows the tendermint node address! viper.Set(client.FlagNode, config.RPC.ListenAddress) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index f506a0d870..9c42d5cf2f 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -21,6 +21,7 @@ import ( ) func TestGaiaCLISend(t *testing.T) { + fmt.Println("wackydebugoutput TestGaiaCLISend 0") tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" @@ -30,13 +31,14 @@ func TestGaiaCLISend(t *testing.T) { executeWrite(t, "gaiacli keys add bar", pass) // get a free port, also setup some common flags - servAddr := server.FreeTCPAddr(t) + servAddr, port, err := server.FreeTCPAddr() + require.NoError(t, err) flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) - time.Sleep(time.Second * 5) // Wait for RPC server to start. + tests.WaitForStart(port) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) @@ -49,6 +51,8 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) + fmt.Println("wackydebugoutput TestGaiaCLISend 1") + fmt.Println("wackydebugoutput TestGaiaCLISend 2") time.Sleep(time.Second * 2) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) @@ -76,13 +80,14 @@ func TestGaiaCLICreateValidator(t *testing.T) { executeWrite(t, "gaiacli keys add bar", pass) // get a free port, also setup some common flags - servAddr := server.FreeTCPAddr(t) + servAddr, port, err := server.FreeTCPAddr() + require.NoError(t, err) flags := fmt.Sprintf("--node=%v --chain-id=%v", servAddr, chainID) // start gaiad server proc := tests.GoExecuteT(t, fmt.Sprintf("gaiad start --rpc.laddr=%v", servAddr)) defer proc.Stop(false) - time.Sleep(time.Second * 5) // Wait for RPC server to start. + tests.WaitForStart(port) fooAddr, _ := executeGetAddrPK(t, "gaiacli keys show foo --output=json") fooCech, err := sdk.Bech32CosmosifyAcc(fooAddr) diff --git a/server/start_test.go b/server/start_test.go index 3bf2eac7e4..454f2d4922 100644 --- a/server/start_test.go +++ b/server/start_test.go @@ -37,7 +37,9 @@ func TestStartStandAlone(t *testing.T) { app, err := mock.NewApp(home, logger) require.Nil(t, err) - svr, err := server.NewServer(FreeTCPAddr(t), "socket", app) + svrAddr, _, err := FreeTCPAddr() + require.Nil(t, err) + svr, err := server.NewServer(svrAddr, "socket", app) require.Nil(t, err, "Error creating listener") svr.SetLogger(logger.With("module", "abci-server")) svr.Start() @@ -69,7 +71,9 @@ func TestStartWithTendermint(t *testing.T) { // set up app and start up viper.Set(flagWithTendermint, true) startCmd := StartCmd(ctx, mock.NewApp) - startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address + svrAddr, _, err := FreeTCPAddr() + require.NoError(t, err) + startCmd.Flags().Set(flagAddress, svrAddr) // set to a new free address timeout := time.Duration(5) * time.Second close(RunOrTimeout(startCmd, timeout, t)) diff --git a/server/test_helpers.go b/server/test_helpers.go index 382c778787..b1050bc6f3 100644 --- a/server/test_helpers.go +++ b/server/test_helpers.go @@ -16,14 +16,17 @@ import ( // Get a free address for a test tendermint server // protocol is either tcp, http, etc -func FreeTCPAddr(t *testing.T) string { +func FreeTCPAddr() (addr, port string, err error) { l, err := net.Listen("tcp", "0.0.0.0:0") defer l.Close() - require.Nil(t, err) + if err != nil { + return "", "", err + } - port := l.Addr().(*net.TCPAddr).Port - addr := fmt.Sprintf("tcp://0.0.0.0:%d", port) - return addr + portI := l.Addr().(*net.TCPAddr).Port + port = fmt.Sprintf("%d", portI) + addr = fmt.Sprintf("tcp://0.0.0.0:%s", port) + return } // setupViper creates a homedir to run inside, diff --git a/tests/tests.go b/tests/tests.go index 845ac69259..b4435659b3 100644 --- a/tests/tests.go +++ b/tests/tests.go @@ -9,7 +9,6 @@ import ( "path" "path/filepath" "strings" - //"strings" "testing" "time" @@ -239,7 +238,9 @@ func StartNodeServerForTest(t *testing.T, home string) *exec.Cmd { // expects TestInitBaseCoin to have been run func StartLCDServerForTest(t *testing.T, home, chainID string) (cmd *exec.Cmd, port string) { cmdName := whereIsBasecli() - port = strings.Split(server.FreeTCPAddr(t), ":")[2] + var err error + _, port, err = server.FreeTCPAddr() + require.NoError(t, err) cmdArgs := []string{ "rest-server", "--home", @@ -252,7 +253,7 @@ func StartLCDServerForTest(t *testing.T, home, chainID string) (cmd *exec.Cmd, p cmd = exec.Command(cmdName, cmdArgs...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - err := cmd.Start() + err = cmd.Start() require.Nil(t, err) time.Sleep(time.Second * 2) // TODO: LOL return cmd, port diff --git a/tests/util.go b/tests/util.go index a6f026f242..292cbab060 100644 --- a/tests/util.go +++ b/tests/util.go @@ -11,16 +11,22 @@ import ( rpcclient "github.com/tendermint/tendermint/rpc/lib/client" ) -// TODO: these functions just print to Stdout. -// consider using the logger. - // Uses localhost func WaitForHeight(height int64, port string) { for { - var resultBlock ctypes.ResultBlock - url := fmt.Sprintf("http://localhost:%v%v", port, "/blocks/latest") - res, err := http.Get(url) + url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) + + // get url, try a few times + var res *http.Response + var err error + for i := 0; i < 5; i++ { + res, err = http.Get(url) + if err == nil { + break + } + time.Sleep(time.Second) + } if err != nil { panic(err) } @@ -31,6 +37,7 @@ func WaitForHeight(height int64, port string) { } res.Body.Close() + var resultBlock ctypes.ResultBlock err = cdc.UnmarshalJSON([]byte(body), &resultBlock) if err != nil { fmt.Println("RES", res) @@ -45,45 +52,35 @@ func WaitForHeight(height int64, port string) { } } -// wait for 2 blocks. -// uses localhost +// wait for tendermint to start func WaitForStart(port string) { - waitHeight := int64(2) - for { + var err error + for i := 0; i < 5; i++ { time.Sleep(time.Second) - url := fmt.Sprintf("http://localhost:%v%v", port, "/blocks/latest") - res, err := http.Get(url) - if err != nil { - panic(err) + url := fmt.Sprintf("http://localhost:%v/blocks/latest", port) + + // get url, try a few times + var res *http.Response + res, err = http.Get(url) + if err == nil || res == nil { + continue } // waiting for server to start ... if res.StatusCode != http.StatusOK { res.Body.Close() - continue - } - - body, err := ioutil.ReadAll(res.Body) - if err != nil { - panic(err) - } - res.Body.Close() - - resultBlock := new(ctypes.ResultBlock) - err = cdc.UnmarshalJSON([]byte(body), &resultBlock) - if err != nil { - fmt.Println("RES", res) - fmt.Println("BODY", string(body)) - panic(err) - } - - if resultBlock.Block.Height >= waitHeight { return } } + if err != nil { + panic(err) + } } +// TODO: these functions just print to Stdout. +// consider using the logger. + // Wait for the RPC server to respond to /status func WaitForRPC(laddr string) { fmt.Println("LADDR", laddr) From ba44bf7c81c1988cdaab10f7cae73758d7d1ef7e Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Thu, 31 May 2018 18:54:14 -0700 Subject: [PATCH 13/14] rm debug output --- cmd/gaia/cli_test/cli_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index 9c42d5cf2f..8fa0ad71ec 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -21,7 +21,6 @@ import ( ) func TestGaiaCLISend(t *testing.T) { - fmt.Println("wackydebugoutput TestGaiaCLISend 0") tests.ExecuteT(t, "gaiad unsafe_reset_all") pass := "1234567890" @@ -51,8 +50,6 @@ func TestGaiaCLISend(t *testing.T) { assert.Equal(t, int64(50), fooAcc.GetCoins().AmountOf("steak")) executeWrite(t, fmt.Sprintf("gaiacli send %v --amount=10steak --to=%v --name=foo", flags, barCech), pass) - fmt.Println("wackydebugoutput TestGaiaCLISend 1") - fmt.Println("wackydebugoutput TestGaiaCLISend 2") time.Sleep(time.Second * 2) // waiting for some blocks to pass barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli account %v %v", barCech, flags)) From 7de746127e024433d8d9b4d836201ed6b36ea78c Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Fri, 1 Jun 2018 04:03:40 +0200 Subject: [PATCH 14/14] Fix minor typo --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5545ae4d3f..ceb9e78a8d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -tersion: 2 +version: 2 defaults: &defaults working_directory: /go/src/github.com/cosmos/cosmos-sdk