status-go/e2e/api/api_test.go

121 lines
3.0 KiB
Go
Raw Normal View History

package api_test
import (
2017-05-27 20:26:07 +00:00
"io/ioutil"
"math/rand"
2017-05-27 20:26:07 +00:00
"os"
"strconv"
"testing"
2017-05-25 12:34:13 +00:00
"time"
"github.com/status-im/status-go/e2e"
"github.com/status-im/status-go/geth/api"
"github.com/status-im/status-go/geth/log"
"github.com/status-im/status-go/geth/params"
"github.com/stretchr/testify/suite"
)
func TestAPI(t *testing.T) {
suite.Run(t, new(APITestSuite))
}
type APITestSuite struct {
suite.Suite
api *api.StatusAPI
}
func (s *APITestSuite) SetupTest() {
s.api = api.NewStatusAPI()
s.NotNil(s.api)
}
2017-05-27 20:26:07 +00:00
func (s *APITestSuite) TestCHTUpdate() {
tmpDir, err := ioutil.TempDir(os.TempDir(), "cht-updates")
s.NoError(err)
2017-05-27 20:26:07 +00:00
defer os.RemoveAll(tmpDir)
configJSON := `{
"NetworkId": ` + strconv.Itoa(params.RopstenNetworkID) + `,
"DataDir": "` + tmpDir + `",
"LogLevel": "INFO",
"RPCEnabled": true
2017-05-27 20:26:07 +00:00
}`
//nodeConfig, err := params.LoadNodeConfig(configJSON)
_, err = params.LoadNodeConfig(configJSON)
s.NoError(err)
2017-05-27 20:26:07 +00:00
// start node
//nodeConfig.DevMode = true
//s.api.StartNode(nodeConfig)
//s.api.StopNode()
// TODO(tiabc): Test that CHT is really updated.
2017-05-27 20:26:07 +00:00
}
func (s *APITestSuite) TestRaceConditions() {
cnt := 25
progress := make(chan struct{}, cnt)
rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
nodeConfig1, err := e2e.MakeTestNodeConfig(params.RopstenNetworkID)
s.NoError(err)
nodeConfig2, err := e2e.MakeTestNodeConfig(params.RinkebyNetworkID)
s.NoError(err)
nodeConfigs := []*params.NodeConfig{nodeConfig1, nodeConfig2}
var funcsToTest = []func(*params.NodeConfig){
func(config *params.NodeConfig) {
log.Info("StartNodeAsync()")
_, err := s.api.StartNodeAsync(config)
s.T().Logf("StartNodeAsync() for network: %d, error: %v", config.NetworkID, err)
progress <- struct{}{}
},
func(config *params.NodeConfig) {
log.Info("StopNodeAsync()")
_, err := s.api.StopNodeAsync()
s.T().Logf("StopNodeAsync(), error: %v", err)
progress <- struct{}{}
},
func(config *params.NodeConfig) {
log.Info("RestartNodeAsync()")
_, err := s.api.RestartNodeAsync()
s.T().Logf("RestartNodeAsync(), error: %v", err)
progress <- struct{}{}
},
// TODO(adam): quarantined until it uses a different datadir
// as otherwise it wipes out cached blockchain data.
// func(config *params.NodeConfig) {
// log.Info("ResetChainDataAsync()")
// _, err := s.api.ResetChainDataAsync()
// s.T().Logf("ResetChainDataAsync(), error: %v", err)
// progress <- struct{}{}
// },
}
// increase StartNode()/StopNode() population
for i := 0; i < 5; i++ {
funcsToTest = append(funcsToTest, funcsToTest[0], funcsToTest[1])
}
for i := 0; i < cnt; i++ {
randConfig := nodeConfigs[rnd.Intn(len(nodeConfigs))]
randFunc := funcsToTest[rnd.Intn(len(funcsToTest))]
2017-05-25 12:34:13 +00:00
if rnd.Intn(100) > 75 { // introduce random delays
time.Sleep(500 * time.Millisecond)
}
go randFunc(randConfig)
}
for range progress {
cnt -= 1
if cnt <= 0 {
break
}
}
time.Sleep(2 * time.Second) // so that we see some logs
s.api.StopNode() // just in case we have a node running
}