Prepare migrating testing auxiliary functions from tests to testutil. Remove local duplicates on testutil.WriteToNewTempFile(). Always favor testutil.NewTestCaseDir() over ioutil.TempDir(). Add test cases for the testing auxiliary functions.
121 lines
2.6 KiB
Go
121 lines
2.6 KiB
Go
package tests
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
rpchttp "github.com/tendermint/tendermint/rpc/client/http"
|
|
ctypes "github.com/tendermint/tendermint/rpc/core/types"
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
)
|
|
|
|
// Wait for N tendermint blocks to pass using the Tendermint RPC
|
|
// on localhost
|
|
func WaitForNextNBlocksTM(n int64, port string) {
|
|
// get the latest block and wait for n more
|
|
url := fmt.Sprintf("http://localhost:%v", port)
|
|
cl, err := rpchttp.New(url, "/websocket")
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to create Tendermint HTTP client: %s", err))
|
|
}
|
|
|
|
var height int64
|
|
|
|
resBlock, err := cl.Block(nil)
|
|
if err != nil || resBlock.Block == nil {
|
|
// wait for the first block to exist
|
|
WaitForHeightTM(1, port)
|
|
height = 1 + n
|
|
} else {
|
|
height = resBlock.Block.Height + n
|
|
}
|
|
|
|
waitForHeightTM(height, url)
|
|
}
|
|
|
|
// Wait for the given height from the Tendermint RPC
|
|
// on localhost
|
|
func WaitForHeightTM(height int64, port string) {
|
|
url := fmt.Sprintf("http://localhost:%v", port)
|
|
waitForHeightTM(height, url)
|
|
}
|
|
|
|
func waitForHeightTM(height int64, url string) {
|
|
cl, err := rpchttp.New(url, "/websocket")
|
|
if err != nil {
|
|
panic(fmt.Sprintf("failed to create Tendermint HTTP client: %s", err))
|
|
}
|
|
|
|
for {
|
|
// get url, try a few times
|
|
var resBlock *ctypes.ResultBlock
|
|
var err error
|
|
INNER:
|
|
for i := 0; i < 5; i++ {
|
|
resBlock, err = cl.Block(nil)
|
|
if err == nil {
|
|
break INNER
|
|
}
|
|
time.Sleep(time.Millisecond * 200)
|
|
}
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if resBlock.Block != nil && resBlock.Block.Height >= height {
|
|
return
|
|
}
|
|
|
|
time.Sleep(time.Millisecond * 100)
|
|
}
|
|
}
|
|
|
|
// wait for tendermint to start by querying tendermint
|
|
func WaitForTMStart(port string) {
|
|
url := fmt.Sprintf("http://localhost:%v/block", port)
|
|
WaitForStart(url)
|
|
}
|
|
|
|
// WaitForStart waits for the node to start by pinging the url
|
|
// every 100ms for 10s until it returns 200. If it takes longer than 5s,
|
|
// it panics.
|
|
func WaitForStart(url string) {
|
|
var err error
|
|
|
|
// ping the status endpoint a few times a second
|
|
// for a few seconds until we get a good response.
|
|
// otherwise something probably went wrong
|
|
for i := 0; i < 100; i++ {
|
|
time.Sleep(time.Millisecond * 100)
|
|
|
|
var res *http.Response
|
|
res, err = http.Get(url) // nolint:gosec
|
|
if err != nil || res == nil {
|
|
continue
|
|
}
|
|
// body, _ := ioutil.ReadAll(res.Body)
|
|
// fmt.Println("BODY", string(body))
|
|
err = res.Body.Close()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
if res.StatusCode == http.StatusOK {
|
|
// good!
|
|
return
|
|
}
|
|
}
|
|
// still haven't started up?! panic!
|
|
panic(err)
|
|
}
|
|
|
|
var cdc = codec.New()
|
|
|
|
func init() {
|
|
ctypes.RegisterAmino(cdc.Amino)
|
|
}
|
|
|
|
//DONTCOVER
|