github.com/MetalBlockchain/metalgo@v1.11.9/snow/uptime/locked_calculator_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package uptime 5 6 import ( 7 "sync" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/require" 12 "go.uber.org/mock/gomock" 13 14 "github.com/MetalBlockchain/metalgo/ids" 15 "github.com/MetalBlockchain/metalgo/utils" 16 ) 17 18 func TestLockedCalculator(t *testing.T) { 19 require := require.New(t) 20 ctrl := gomock.NewController(t) 21 22 lc := NewLockedCalculator() 23 require.NotNil(lc) 24 25 // Should still error because ctx is nil 26 nodeID := ids.GenerateTestNodeID() 27 subnetID := ids.GenerateTestID() 28 _, _, err := lc.CalculateUptime(nodeID, subnetID) 29 require.ErrorIs(err, errStillBootstrapping) 30 31 _, err = lc.CalculateUptimePercent(nodeID, subnetID) 32 require.ErrorIs(err, errStillBootstrapping) 33 34 _, err = lc.CalculateUptimePercentFrom(nodeID, subnetID, time.Now()) 35 require.ErrorIs(err, errStillBootstrapping) 36 37 var isBootstrapped utils.Atomic[bool] 38 mockCalc := NewMockCalculator(ctrl) 39 40 // Should still error because ctx is not bootstrapped 41 lc.SetCalculator(&isBootstrapped, &sync.Mutex{}, mockCalc) 42 _, _, err = lc.CalculateUptime(nodeID, subnetID) 43 require.ErrorIs(err, errStillBootstrapping) 44 45 _, err = lc.CalculateUptimePercent(nodeID, subnetID) 46 require.ErrorIs(err, errStillBootstrapping) 47 48 _, err = lc.CalculateUptimePercentFrom(nodeID, subnetID, time.Now()) 49 require.ErrorIs(err, errStillBootstrapping) 50 51 isBootstrapped.Set(true) 52 53 // Should return the value from the mocked inner calculator 54 mockCalc.EXPECT().CalculateUptime(gomock.Any(), gomock.Any()).AnyTimes().Return(time.Duration(0), time.Time{}, errTest) 55 _, _, err = lc.CalculateUptime(nodeID, subnetID) 56 require.ErrorIs(err, errTest) 57 58 mockCalc.EXPECT().CalculateUptimePercent(gomock.Any(), gomock.Any()).AnyTimes().Return(float64(0), errTest) 59 _, err = lc.CalculateUptimePercent(nodeID, subnetID) 60 require.ErrorIs(err, errTest) 61 62 mockCalc.EXPECT().CalculateUptimePercentFrom(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(float64(0), errTest) 63 _, err = lc.CalculateUptimePercentFrom(nodeID, subnetID, time.Now()) 64 require.ErrorIs(err, errTest) 65 }