more of the go-bash stuff for REST

This commit is contained in:
rigelrozanski 2018-03-12 16:31:27 +01:00 committed by Ethan Buchman
parent fdb9d5f580
commit 1778a27082
4 changed files with 104 additions and 51 deletions

View File

@ -7,7 +7,6 @@ import (
"io/ioutil"
"net/http"
"os"
"os/exec"
"regexp"
"testing"
@ -29,16 +28,16 @@ import (
)
func TestKeys(t *testing.T) {
cmd := junkInit(t)
defer cmd.Process.Kill()
kill, port := junkInit(t)
defer kill()
// empty keys
res, body := request(t, "GET", "/keys", nil)
res, body := request(t, port, "GET", "/keys", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
assert.Equal(t, body, "[]", "Expected an empty array")
// get seed
res, body = request(t, "GET", "/keys/seed", nil)
res, body = request(t, port, "GET", "/keys/seed", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
seed := body
reg, err := regexp.Compile(`([a-z]+ ){12}`)
@ -48,30 +47,30 @@ func TestKeys(t *testing.T) {
// add key
var jsonStr = []byte(`{"name":"test_fail", "password":"1234567890"}`)
res, body = request(t, "POST", "/keys", jsonStr)
res, body = request(t, port, "POST", "/keys", jsonStr)
assert.Equal(t, http.StatusBadRequest, res.StatusCode, "Account creation should require a seed")
jsonStr = []byte(fmt.Sprintf(`{"name":"test", "password":"1234567890", "seed": "%s"}`, seed))
res, body = request(t, "POST", "/keys", jsonStr)
res, body = request(t, port, "POST", "/keys", jsonStr)
assert.Equal(t, http.StatusOK, res.StatusCode, body)
addr := body
assert.Len(t, addr, 40, "Returned address has wrong format", addr)
// existing keys
res, body = request(t, "GET", "/keys", nil)
res, body = request(t, port, "GET", "/keys", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
var m [1]keys.KeyOutput
decoder := json.NewDecoder(res.Body)
err = decoder.Decode(&m)
require.NoError(t, err)
require.Nil(t, err)
assert.Equal(t, m[0].Name, "test", "Did not serve keys name correctly")
assert.Equal(t, m[0].Address, addr, "Did not serve keys Address correctly")
// select key
res, body = request(t, "GET", "/keys/test", nil)
res, body = request(t, port, "GET", "/keys/test", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
var m2 keys.KeyOutput
decoder = json.NewDecoder(res.Body)
@ -82,31 +81,37 @@ func TestKeys(t *testing.T) {
// update key
jsonStr = []byte(`{"old_password":"1234567890", "new_password":"12345678901"}`)
res, body = request(t, "PUT", "/keys/test", jsonStr)
res, body = request(t, port, "PUT", "/keys/test", jsonStr)
require.Equal(t, http.StatusOK, res.StatusCode, body)
// here it should say unauthorized as we changed the password before
res, body = request(t, "PUT", "/keys/test", jsonStr)
res, body = request(t, port, "PUT", "/keys/test", jsonStr)
require.Equal(t, http.StatusUnauthorized, res.StatusCode, body)
// delete key
jsonStr = []byte(`{"password":"12345678901"}`)
res, body = request(t, "DELETE", "/keys/test", jsonStr)
res, body = request(t, port, "DELETE", "/keys/test", jsonStr)
require.Equal(t, http.StatusOK, res.StatusCode, body)
}
//XXX
func junkInit(t *testing.T) *exec.Cmd {
func junkInit(t *testing.T) (kill func(), port string) {
tests.TestInitBasecoin(t)
return tests.StartServerForTest(t)
cmdStart := tests.StartNodeServerForTest(t)
cmdLCD, port := tests.StartLCDServerForTest(t)
kill = func() {
cmdLCD.Process.Kill()
cmdStart.Process.Kill()
}
return kill, port
}
func TestVersion(t *testing.T) {
cmd := junkInit(t)
defer cmd.Process.Kill()
kill, port := junkInit(t)
defer kill()
// node info
res, body := request(t, "GET", "/version", nil)
res, body := request(t, port, "GET", "/version", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
reg, err := regexp.Compile(`\d+\.\d+\.\d+(-dev)?`)
@ -116,11 +121,11 @@ func TestVersion(t *testing.T) {
}
func TestNodeStatus(t *testing.T) {
cmd := junkInit(t)
defer cmd.Process.Kill()
kill, port := junkInit(t)
defer kill()
// node info
res, body := request(t, "GET", "/node_info", nil)
res, body := request(t, port, "GET", "/node_info", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
var m p2p.NodeInfo
@ -131,17 +136,17 @@ func TestNodeStatus(t *testing.T) {
assert.NotEqual(t, p2p.NodeInfo{}, m, "res: %v", res)
// syncing
res, body = request(t, "GET", "/syncing", nil)
res, body = request(t, port, "GET", "/syncing", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
assert.Equal(t, "true", body)
}
func TestBlock(t *testing.T) {
cmd := junkInit(t)
defer cmd.Process.Kill()
kill, port := junkInit(t)
defer kill()
// res, body := request(t, "GET", "/blocks/latest", nil)
// res, body := request(t, port, "GET", "/blocks/latest", nil)
// require.Equal(t, http.StatusOK, res.StatusCode, body)
// var m ctypes.ResultBlock
@ -153,7 +158,7 @@ func TestBlock(t *testing.T) {
// --
res, body := request(t, "GET", "/blocks/1", nil)
res, body := request(t, port, "GET", "/blocks/1", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
var m ctypes.ResultBlock
@ -165,15 +170,15 @@ func TestBlock(t *testing.T) {
// --
res, body = request(t, "GET", "/blocks/2", nil)
res, body = request(t, port, "GET", "/blocks/2", nil)
require.Equal(t, http.StatusNotFound, res.StatusCode, body)
}
func TestValidators(t *testing.T) {
cmd := junkInit(t)
defer cmd.Process.Kill()
kill, port := junkInit(t)
defer kill()
// res, body := request(t, "GET", "/validatorsets/latest", nil)
// res, body := request(t, port, "GET", "/validatorsets/latest", nil)
// require.Equal(t, http.StatusOK, res.StatusCode, body)
// var m ctypes.ResultValidators
@ -185,7 +190,7 @@ func TestValidators(t *testing.T) {
// --
res, body := request(t, "GET", "/validatorsets/1", nil)
res, body := request(t, port, "GET", "/validatorsets/1", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
var m ctypes.ResultValidators
@ -197,26 +202,26 @@ func TestValidators(t *testing.T) {
// --
res, body = request(t, "GET", "/validatorsets/2", nil)
res, body = request(t, port, "GET", "/validatorsets/2", nil)
require.Equal(t, http.StatusNotFound, res.StatusCode)
}
func TestCoinSend(t *testing.T) {
cmd := junkInit(t)
defer cmd.Process.Kill()
kill, port := junkInit(t)
defer kill()
// TODO make that account has coins
kb := client.MockKeyBase()
info, seed, err := kb.Create("account_with_coins", "1234567890", cryptoKeys.CryptoAlgo("ed25519"))
require.NoError(t, err)
require.Nil(t, err)
addr := string(info.Address())
// query empty
res, body := request(t, "GET", "/accounts/1234567890123456789012345678901234567890", nil)
res, body := request(t, port, "GET", "/accounts/1234567890123456789012345678901234567890", nil)
require.Equal(t, http.StatusNoContent, res.StatusCode, body)
// query
res, body = request(t, "GET", "/accounts/"+addr, nil)
res, body = request(t, port, "GET", "/accounts/"+addr, nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
assert.Equal(t, `{
@ -230,12 +235,12 @@ func TestCoinSend(t *testing.T) {
// create account to send in keybase
var jsonStr = []byte(fmt.Sprintf(`{"name":"test", "password":"1234567890", "seed": "%s"}`, seed))
res, body = request(t, "POST", "/keys", jsonStr)
res, body = request(t, port, "POST", "/keys", jsonStr)
require.Equal(t, http.StatusOK, res.StatusCode, body)
// create receive address
receiveInfo, _, err := kb.Create("receive_address", "1234567890", cryptoKeys.CryptoAlgo("ed25519"))
require.NoError(t, err)
require.Nil(t, err)
receiveAddr := string(receiveInfo.Address())
// send
@ -247,11 +252,11 @@ func TestCoinSend(t *testing.T) {
"amount": 1
}]
}`)
res, body = request(t, "POST", "/accounts/"+receiveAddr+"/send", jsonStr)
res, body = request(t, port, "POST", "/accounts/"+receiveAddr+"/send", jsonStr)
require.Equal(t, http.StatusOK, res.StatusCode, body)
// check if received
res, body = request(t, "GET", "/accounts/"+receiveAddr, nil)
res, body = request(t, port, "GET", "/accounts/"+receiveAddr, nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
assert.Equal(t, `{
@ -280,19 +285,20 @@ func prepareClient(t *testing.T) {
app.Commit()
}
func request(t *testing.T, method string, path string, payload []byte) (*http.Response, string) {
func request(t *testing.T, port, method, path string, payload []byte) (*http.Response, string) {
var res *http.Response
var err error
url := fmt.Sprintf("http://localhost:%v%v", port, path)
if method == "GET" {
res, err = http.Get(path)
res, err = http.Get(url)
}
if method == "POST" {
res, err = http.Post(path, "application/json", bytes.NewBuffer(payload))
res, err = http.Post(url, "application/json", bytes.NewBuffer(payload))
}
require.NoError(t, err)
require.Nil(t, err)
output, err := ioutil.ReadAll(res.Body)
require.NoError(t, err)
require.Nil(t, err)
return res, string(output)
}

View File

@ -24,7 +24,7 @@ func TestStartStandAlone(t *testing.T) {
viper.Set(flagWithTendermint, false)
viper.Set(flagAddress, "localhost:11122")
startCmd := StartCmd(mock.NewApp, logger)
startCmd.Flags().Set(flagAddress, FreeAddr(t)) // set to a new free address
startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address
timeout := time.Duration(3) * time.Second
ch := RunOrTimeout(startCmd, timeout, t)
@ -44,7 +44,7 @@ func TestStartWithTendermint(t *testing.T) {
// set up app and start up
viper.Set(flagWithTendermint, true)
startCmd := StartCmd(mock.NewApp, logger)
startCmd.Flags().Set(flagAddress, FreeAddr(t)) // set to a new free address
startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address
timeout := time.Duration(3) * time.Second
//a, _ := startCmd.Flags().GetString(flagAddress)

View File

@ -17,7 +17,8 @@ import (
)
// Get a free address for a test tendermint server
func FreeAddr(t *testing.T) string {
// protocol is either tcp, http, etc
func FreeTCPAddr(t *testing.T) string {
l, err := net.Listen("tcp", "0.0.0.0:0")
defer l.Close()
require.Nil(t, err)
@ -51,7 +52,7 @@ func StartServer(t *testing.T) chan error {
// start server
viper.Set(flagWithTendermint, true)
startCmd := StartCmd(mock.NewApp, log.NewNopLogger())
startCmd.Flags().Set(flagAddress, FreeAddr(t)) // set to a new free address
startCmd.Flags().Set(flagAddress, FreeTCPAddr(t)) // set to a new free address
timeout := time.Duration(3) * time.Second
return RunOrTimeout(startCmd, timeout, t)

View File

@ -6,10 +6,12 @@ import (
"os"
"os/exec"
"path/filepath"
"strings"
//"strings"
"testing"
"time"
"github.com/cosmos/cosmos-sdk/server"
"github.com/stretchr/testify/require"
)
@ -163,8 +165,35 @@ func StartServer() error {
// see: https://stackoverflow.com/questions/11886531/terminating-a-process-started-with-os-exec-in-golang
}
// Init Basecoin Test
func InitServerForTest(t *testing.T) {
Clean()
var err error
password := "some-random-password"
usePassword := exec.Command("echo", password)
initBasecoind := exec.Command(whereIsBasecoind(), "init", "--home", basecoindDir)
initBasecoind.Stdin, err = usePassword.StdoutPipe()
require.Nil(t, err)
initBasecoind.Stdout = os.Stdout
err = initBasecoind.Start()
require.Nil(t, err)
err = usePassword.Run()
require.Nil(t, err)
err = initBasecoind.Wait()
require.Nil(t, err)
err = makeKeys()
require.Nil(t, err)
}
// expects TestInitBaseCoin to have been run
func StartServerForTest(t *testing.T) *exec.Cmd {
func StartNodeServerForTest(t *testing.T) *exec.Cmd {
cmdName := whereIsBasecoind()
cmdArgs := []string{"start", "--home", basecoindDir}
cmd := exec.Command(cmdName, cmdArgs...)
@ -173,6 +202,23 @@ func StartServerForTest(t *testing.T) *exec.Cmd {
return cmd
}
// expects TestInitBaseCoin to have been run
func StartLCDServerForTest(t *testing.T) (cmd *exec.Cmd, port string) {
cmdName := whereIsBasecli()
port = strings.Split(server.FreeTCPAddr(t), ":")[2]
cmdArgs := []string{
"rest-server",
"--home",
basecoindDir,
"--port",
port,
}
cmd = exec.Command(cmdName, cmdArgs...)
err := cmd.Start()
require.Nil(t, err)
return cmd, port
}
// clean the directories
func Clean() {
// ignore errors b/c the dirs may not yet exist