github.com/evdatsion/aphelion-dpos-bft@v0.32.1/tools/tm-monitor/monitor/monitor_test.go (about) 1 package monitor_test 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/stretchr/testify/assert" 8 "github.com/stretchr/testify/require" 9 10 amino "github.com/evdatsion/go-amino" 11 "github.com/evdatsion/aphelion-dpos-bft/crypto/ed25519" 12 ctypes "github.com/evdatsion/aphelion-dpos-bft/rpc/core/types" 13 mock "github.com/evdatsion/aphelion-dpos-bft/tools/tm-monitor/mock" 14 monitor "github.com/evdatsion/aphelion-dpos-bft/tools/tm-monitor/monitor" 15 tmtypes "github.com/evdatsion/aphelion-dpos-bft/types" 16 ) 17 18 func TestMonitorUpdatesNumberOfValidators(t *testing.T) { 19 m := startMonitor(t) 20 defer m.Stop() 21 22 n, _ := createValidatorNode(t) 23 m.Monitor(n) 24 assert.Equal(t, 1, m.Network.NumNodesMonitored) 25 assert.Equal(t, 1, m.Network.NumNodesMonitoredOnline) 26 27 time.Sleep(1 * time.Second) 28 29 // DATA RACE 30 // assert.Equal(t, 1, m.Network.NumValidators()) 31 } 32 33 func TestMonitorRecalculatesNetworkUptime(t *testing.T) { 34 m := startMonitor(t) 35 defer m.Stop() 36 assert.Equal(t, 100.0, m.Network.Uptime()) 37 38 n, _ := createValidatorNode(t) 39 m.Monitor(n) 40 41 m.Network.NodeIsDown(n.Name) // simulate node failure 42 time.Sleep(200 * time.Millisecond) 43 m.Network.NodeIsOnline(n.Name) 44 time.Sleep(1 * time.Second) 45 46 assert.True(t, m.Network.Uptime() < 100.0, "Uptime should be less than 100%") 47 } 48 49 func startMonitor(t *testing.T) *monitor.Monitor { 50 m := monitor.NewMonitor( 51 monitor.SetNumValidatorsUpdateInterval(200*time.Millisecond), 52 monitor.RecalculateNetworkUptimeEvery(200*time.Millisecond), 53 ) 54 err := m.Start() 55 require.Nil(t, err) 56 return m 57 } 58 59 func createValidatorNode(t *testing.T) (n *monitor.Node, emMock *mock.EventMeter) { 60 emMock = &mock.EventMeter{} 61 62 stubs := make(map[string]interface{}) 63 pubKey := ed25519.GenPrivKey().PubKey() 64 stubs["validators"] = ctypes.ResultValidators{BlockHeight: blockHeight, Validators: []*tmtypes.Validator{tmtypes.NewValidator(pubKey, 0)}} 65 stubs["status"] = ctypes.ResultStatus{ValidatorInfo: ctypes.ValidatorInfo{PubKey: pubKey}} 66 cdc := amino.NewCodec() 67 rpcClientMock := &mock.RpcClient{Stubs: stubs} 68 rpcClientMock.SetCodec(cdc) 69 70 n = monitor.NewNodeWithEventMeterAndRpcClient("tcp://127.0.0.1:26657", emMock, rpcClientMock) 71 return 72 }