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  }