package rpctest
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/tendermint/tmlibs/log"
|
|
|
|
abci "github.com/tendermint/abci/types"
|
|
cfg "github.com/tendermint/tendermint/config"
|
|
nm "github.com/tendermint/tendermint/node"
|
|
"github.com/tendermint/tendermint/proxy"
|
|
core_grpc "github.com/tendermint/tendermint/rpc/grpc"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
var config *cfg.Config
|
|
|
|
// f**ing long, but unique for each test
|
|
func makePathname() string {
|
|
// get path
|
|
p, err := os.Getwd()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
fmt.Println(p)
|
|
sep := string(filepath.Separator)
|
|
return strings.Replace(p, sep, "_", -1)
|
|
}
|
|
|
|
func randPort() int {
|
|
// returns between base and base + spread
|
|
base, spread := 20000, 20000
|
|
return base + rand.Intn(spread)
|
|
}
|
|
|
|
func makeAddrs() (string, string, string) {
|
|
start := randPort()
|
|
return fmt.Sprintf("tcp://0.0.0.0:%d", start),
|
|
fmt.Sprintf("tcp://0.0.0.0:%d", start+1),
|
|
fmt.Sprintf("tcp://0.0.0.0:%d", start+2)
|
|
}
|
|
|
|
// GetConfig returns a config for the test cases as a singleton
|
|
func GetConfig() *cfg.Config {
|
|
if config == nil {
|
|
pathname := makePathname()
|
|
config = cfg.ResetTestRoot(pathname)
|
|
|
|
// and we use random ports to run in parallel
|
|
tm, rpc, grpc := makeAddrs()
|
|
config.P2P.ListenAddress = tm
|
|
config.RPC.ListenAddress = rpc
|
|
config.RPC.GRPCListenAddress = grpc
|
|
}
|
|
return config
|
|
}
|
|
|
|
func GetGRPCClient() core_grpc.BroadcastAPIClient {
|
|
grpcAddr := config.RPC.GRPCListenAddress
|
|
return core_grpc.StartGRPCClient(grpcAddr)
|
|
}
|
|
|
|
// StartTendermint starts a test tendermint server in a go routine and returns when it is initialized
|
|
func StartTendermint(app abci.Application) *nm.Node {
|
|
node := NewTendermint(app)
|
|
node.Start()
|
|
fmt.Println("Tendermint running!")
|
|
return node
|
|
}
|
|
|
|
// NewTendermint creates a new tendermint server and sleeps forever
|
|
func NewTendermint(app abci.Application) *nm.Node {
|
|
// Create & start node
|
|
config := GetConfig()
|
|
logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout))
|
|
logger = log.NewFilter(logger, log.AllowError())
|
|
privValidatorFile := config.PrivValidatorFile()
|
|
privValidator := types.LoadOrGenPrivValidator(privValidatorFile, logger)
|
|
papp := proxy.NewLocalClientCreator(app)
|
|
node := nm.NewNode(config, privValidator, papp, logger)
|
|
return node
|
|
}
|