package monitor_test import ( "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/tendermint/go-amino" crypto "github.com/tendermint/tendermint/crypto" ctypes "github.com/tendermint/tendermint/rpc/core/types" mock "github.com/tendermint/tendermint/tools/tm-monitor/mock" monitor "github.com/tendermint/tendermint/tools/tm-monitor/monitor" tmtypes "github.com/tendermint/tendermint/types" ) func TestMonitorUpdatesNumberOfValidators(t *testing.T) { m := startMonitor(t) defer m.Stop() n, _ := createValidatorNode(t) m.Monitor(n) assert.Equal(t, 1, m.Network.NumNodesMonitored) assert.Equal(t, 1, m.Network.NumNodesMonitoredOnline) time.Sleep(1 * time.Second) // DATA RACE // assert.Equal(t, 1, m.Network.NumValidators()) } func TestMonitorRecalculatesNetworkUptime(t *testing.T) { m := startMonitor(t) defer m.Stop() assert.Equal(t, 100.0, m.Network.Uptime()) n, _ := createValidatorNode(t) m.Monitor(n) m.Network.NodeIsDown(n.Name) // simulate node failure time.Sleep(200 * time.Millisecond) m.Network.NodeIsOnline(n.Name) time.Sleep(1 * time.Second) assert.True(t, m.Network.Uptime() < 100.0, "Uptime should be less than 100%") } func startMonitor(t *testing.T) *monitor.Monitor { m := monitor.NewMonitor( monitor.SetNumValidatorsUpdateInterval(200*time.Millisecond), monitor.RecalculateNetworkUptimeEvery(200*time.Millisecond), ) err := m.Start() require.Nil(t, err) return m } func createValidatorNode(t *testing.T) (n *monitor.Node, emMock *mock.EventMeter) { emMock = &mock.EventMeter{} stubs := make(map[string]interface{}) pubKey := crypto.GenPrivKeyEd25519().PubKey() stubs["validators"] = ctypes.ResultValidators{BlockHeight: blockHeight, Validators: []*tmtypes.Validator{tmtypes.NewValidator(pubKey, 0)}} stubs["status"] = ctypes.ResultStatus{ValidatorInfo: ctypes.ValidatorInfo{PubKey: pubKey}} cdc := amino.NewCodec() rpcClientMock := &mock.RpcClient{Stubs: stubs} rpcClientMock.SetCodec(cdc) n = monitor.NewNodeWithEventMeterAndRpcClient("tcp://127.0.0.1:26657", emMock, rpcClientMock) return }