From b6c094f1ad8ded7a93b6f4c74ca8879cc62f654b Mon Sep 17 00:00:00 2001 From: Fabian Weber Date: Fri, 9 Mar 2018 11:03:15 +0100 Subject: [PATCH] improved node status tests --- client/lcd/lcd_test.go | 83 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index e04c54bbe9..f4aff252c3 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -3,15 +3,23 @@ package lcd import ( "bytes" "encoding/json" + "fmt" + "io/ioutil" "net/http" "net/http/httptest" "os" "testing" + "time" + + "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" keys "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/examples/basecoin/app" + "github.com/cosmos/cosmos-sdk/mock" + "github.com/cosmos/cosmos-sdk/server" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" @@ -97,13 +105,15 @@ func TestKeys(t *testing.T) { db.Close() } -func TestNodeInfo(t *testing.T) { - prepareApp(t) +func TestNodeStatus(t *testing.T) { + startServer(t) + prepareClient(t) _, db, err := initKeybase(t) require.Nil(t, err, "Couldn't init Keybase") cdc := app.MakeCodec() r := initRouter(cdc) + // node info req, err := http.NewRequest("GET", "/node_info", nil) require.Nil(t, err) res := httptest.NewRecorder() @@ -116,6 +126,18 @@ func TestNodeInfo(t *testing.T) { err = decoder.Decode(&m) require.Nil(t, err, "Couldn't parse node info") + 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()) + db.Close() } @@ -126,17 +148,66 @@ func defaultLogger() log.Logger { return log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") } -func prepareApp(t *testing.T) { - logger := defaultLogger() +func prepareClient(t *testing.T) { db := dbm.NewMemDB() - name := t.Name() - app := baseapp.NewBaseApp(name, logger, db) + app := baseapp.NewBaseApp(t.Name(), defaultLogger(), db) + viper.Set(client.FlagNode, "localhost:46657") header := abci.Header{Height: 1} app.BeginBlock(abci.RequestBeginBlock{Header: header}) app.Commit() } +// 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 + } +} + func initKeybase(t *testing.T) (cryptoKeys.Keybase, *dbm.GoLevelDB, error) { os.RemoveAll("./testKeybase") db, err := dbm.NewGoLevelDB("keys", "./testKeybase")