cosmos-sdk/client/lcd/lcd_test.go

219 lines
5.7 KiB
Go
Raw Normal View History

2018-03-05 08:41:50 -08:00
package lcd
import (
"bytes"
"encoding/json"
2018-03-09 02:03:15 -08:00
"fmt"
"io/ioutil"
2018-03-05 08:41:50 -08:00
"net/http"
"net/http/httptest"
"os"
"testing"
2018-03-09 02:03:15 -08:00
"time"
"github.com/spf13/cobra"
"github.com/spf13/viper"
2018-03-05 08:41:50 -08:00
2018-03-08 06:50:12 -08:00
"github.com/cosmos/cosmos-sdk/baseapp"
2018-03-05 08:41:50 -08:00
"github.com/cosmos/cosmos-sdk/client"
keys "github.com/cosmos/cosmos-sdk/client/keys"
"github.com/cosmos/cosmos-sdk/examples/basecoin/app"
2018-03-09 02:03:15 -08:00
"github.com/cosmos/cosmos-sdk/mock"
"github.com/cosmos/cosmos-sdk/server"
2018-03-08 07:06:40 -08:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2018-03-08 06:50:12 -08:00
abci "github.com/tendermint/abci/types"
2018-03-05 08:41:50 -08:00
cryptoKeys "github.com/tendermint/go-crypto/keys"
2018-03-08 06:50:12 -08:00
"github.com/tendermint/tendermint/p2p"
2018-03-05 08:41:50 -08:00
dbm "github.com/tendermint/tmlibs/db"
2018-03-08 06:50:12 -08:00
"github.com/tendermint/tmlibs/log"
2018-03-05 08:41:50 -08:00
)
func TestKeys(t *testing.T) {
2018-03-08 07:06:40 -08:00
kb, db, err := initKeybase(t)
require.Nil(t, err, "Couldn't init Keybase")
2018-03-05 08:41:50 -08:00
cdc := app.MakeCodec()
r := initRouter(cdc)
// empty keys
2018-03-08 07:06:40 -08:00
req, err := http.NewRequest("GET", "/keys", nil)
require.Nil(t, err)
2018-03-05 08:41:50 -08:00
res := httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
assert.Equal(t, http.StatusOK, res.Code, res.Body.String())
2018-03-08 07:06:40 -08:00
body := res.Body.String()
require.Equal(t, body, "[]", "Expected an empty array")
2018-03-05 08:41:50 -08:00
info, _, err := kb.Create("test", "1234567890", cryptoKeys.CryptoAlgo("ed25519"))
2018-03-08 07:06:40 -08:00
require.Nil(t, err, "Couldn't add key")
2018-03-05 08:41:50 -08:00
// existing keys
2018-03-08 07:06:40 -08:00
req, err = http.NewRequest("GET", "/keys", nil)
require.Nil(t, err)
2018-03-05 08:41:50 -08:00
res = httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
assert.Equal(t, http.StatusOK, res.Code, res.Body.String())
2018-03-05 08:41:50 -08:00
var m [1]keys.KeyOutput
decoder := json.NewDecoder(res.Body)
err = decoder.Decode(&m)
2018-03-08 07:06:40 -08:00
assert.Equal(t, m[0].Name, "test", "Did not serve keys name correctly")
assert.Equal(t, m[0].Address, info.PubKey.Address().String(), "Did not serve keys Address correctly")
2018-03-05 08:41:50 -08:00
// select key
req, _ = http.NewRequest("GET", "/keys/test", nil)
res = httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
assert.Equal(t, http.StatusOK, res.Code, res.Body.String())
2018-03-05 08:41:50 -08:00
var m2 keys.KeyOutput
decoder = json.NewDecoder(res.Body)
err = decoder.Decode(&m2)
2018-03-08 07:06:40 -08:00
assert.Equal(t, m2.Name, "test", "Did not serve keys name correctly")
assert.Equal(t, m2.Address, info.PubKey.Address().String(), "Did not serve keys Address correctly")
2018-03-05 08:41:50 -08:00
// update key
var jsonStr = []byte(`{"old_password":"1234567890", "new_password":"12345678901"}`)
2018-03-08 07:06:40 -08:00
req, err = http.NewRequest("PUT", "/keys/test", bytes.NewBuffer(jsonStr))
require.Nil(t, err)
2018-03-05 08:41:50 -08:00
res = httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
assert.Equal(t, http.StatusOK, res.Code, res.Body.String())
2018-03-05 08:41:50 -08:00
// here it should say unauthorized as we changed the password before
2018-03-08 07:06:40 -08:00
req, err = http.NewRequest("PUT", "/keys/test", bytes.NewBuffer(jsonStr))
require.Nil(t, err)
2018-03-05 08:41:50 -08:00
res = httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
assert.Equal(t, http.StatusUnauthorized, res.Code, res.Body.String())
2018-03-05 08:41:50 -08:00
// delete key
jsonStr = []byte(`{"password":"12345678901"}`)
2018-03-08 07:06:40 -08:00
req, err = http.NewRequest("DELETE", "/keys/test", bytes.NewBuffer(jsonStr))
require.Nil(t, err)
2018-03-05 08:41:50 -08:00
res = httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
assert.Equal(t, http.StatusOK, res.Code, res.Body.String())
2018-03-08 06:50:12 -08:00
db.Close()
}
2018-03-09 02:03:15 -08:00
func TestNodeStatus(t *testing.T) {
startServer(t)
prepareClient(t)
2018-03-08 07:06:40 -08:00
_, db, err := initKeybase(t)
require.Nil(t, err, "Couldn't init Keybase")
2018-03-08 06:50:12 -08:00
cdc := app.MakeCodec()
r := initRouter(cdc)
2018-03-09 02:03:15 -08:00
// node info
2018-03-08 07:06:40 -08:00
req, err := http.NewRequest("GET", "/node_info", nil)
require.Nil(t, err)
2018-03-08 06:50:12 -08:00
res := httptest.NewRecorder()
r.ServeHTTP(res, req)
2018-03-09 01:14:44 -08:00
require.Equal(t, http.StatusOK, res.Code, res.Body.String())
2018-03-08 06:50:12 -08:00
var m p2p.NodeInfo
decoder := json.NewDecoder(res.Body)
err = decoder.Decode(&m)
2018-03-08 07:06:40 -08:00
require.Nil(t, err, "Couldn't parse node info")
2018-03-08 06:50:12 -08:00
2018-03-09 02:03:15 -08:00
assert.NotEqual(t, p2p.NodeInfo{}, m)
// syncing
req, err = http.NewRequest("GET", "/syncing", nil)
require.Nil(t, err)
res = httptest.NewRecorder()
r.ServeHTTP(res, req)
require.Equal(t, http.StatusOK, res.Code, res.Body.String())
assert.Equal(t, "true", res.Body.String())
2018-03-08 06:50:12 -08:00
db.Close()
}
2018-03-08 07:06:40 -08:00
//__________________________________________________________
// helpers
2018-03-08 06:50:12 -08:00
func defaultLogger() log.Logger {
return log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app")
}
2018-03-09 02:03:15 -08:00
func prepareClient(t *testing.T) {
2018-03-08 06:50:12 -08:00
db := dbm.NewMemDB()
2018-03-09 02:03:15 -08:00
app := baseapp.NewBaseApp(t.Name(), defaultLogger(), db)
viper.Set(client.FlagNode, "localhost:46657")
2018-03-08 06:50:12 -08:00
header := abci.Header{Height: 1}
app.BeginBlock(abci.RequestBeginBlock{Header: header})
app.Commit()
2018-03-05 08:41:50 -08:00
}
2018-03-09 02:03:15 -08:00
// setupViper creates a homedir to run inside,
// and returns a cleanup function to defer
func setupViper() func() {
rootDir, err := ioutil.TempDir("", "mock-sdk-cmd")
if err != nil {
panic(err) // fuck it!
}
viper.Set("home", rootDir)
return func() {
os.RemoveAll(rootDir)
}
}
func startServer(t *testing.T) {
defer setupViper()()
// init server
initCmd := server.InitCmd(mock.GenInitOptions, log.NewNopLogger())
err := initCmd.RunE(nil, nil)
require.NoError(t, err)
// start server
viper.Set("with-tendermint", true)
startCmd := server.StartCmd(mock.NewApp, log.NewNopLogger())
timeout := time.Duration(3) * time.Second
err = runOrTimeout(startCmd, timeout)
require.NoError(t, err)
}
// copied from server/start_test.go
func runOrTimeout(cmd *cobra.Command, timeout time.Duration) error {
done := make(chan error)
go func(out chan<- error) {
// this should NOT exit
err := cmd.RunE(nil, nil)
if err != nil {
out <- err
}
out <- fmt.Errorf("start died for unknown reasons")
}(done)
timer := time.NewTimer(timeout)
select {
case err := <-done:
return err
case <-timer.C:
return nil
}
}
2018-03-08 07:06:40 -08:00
func initKeybase(t *testing.T) (cryptoKeys.Keybase, *dbm.GoLevelDB, error) {
2018-03-05 08:41:50 -08:00
os.RemoveAll("./testKeybase")
db, err := dbm.NewGoLevelDB("keys", "./testKeybase")
2018-03-08 07:06:40 -08:00
require.Nil(t, err)
2018-03-05 08:41:50 -08:00
kb := client.GetKeyBase(db)
keys.SetKeyBase(kb)
2018-03-08 06:50:12 -08:00
return kb, db, nil
2018-03-05 08:41:50 -08:00
}