forked from TrueCloudLab/frostfs-node
[#280] ir: Add block timer unit tests
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
parent
e70f808dc3
commit
53693071de
2 changed files with 173 additions and 2 deletions
|
@ -25,6 +25,10 @@ type (
|
||||||
|
|
||||||
newEpochHandler func()
|
newEpochHandler func()
|
||||||
|
|
||||||
|
containerEstimationStopper interface {
|
||||||
|
StopEstimation(p container.StopEstimationPrm) error
|
||||||
|
}
|
||||||
|
|
||||||
epochTimerArgs struct {
|
epochTimerArgs struct {
|
||||||
l *logger.Logger
|
l *logger.Logger
|
||||||
|
|
||||||
|
@ -32,8 +36,8 @@ type (
|
||||||
|
|
||||||
newEpochHandlers []newEpochHandler
|
newEpochHandlers []newEpochHandler
|
||||||
|
|
||||||
cnrWrapper *container.Client // to invoke stop container estimation
|
cnrWrapper containerEstimationStopper // to invoke stop container estimation
|
||||||
epoch epochState // to specify which epoch to stop, and epoch duration
|
epoch epochState // to specify which epoch to stop, and epoch duration
|
||||||
|
|
||||||
stopEstimationDMul uint32 // X: X/Y of epoch in blocks
|
stopEstimationDMul uint32 // X: X/Y of epoch in blocks
|
||||||
stopEstimationDDiv uint32 // Y: X/Y of epoch in blocks
|
stopEstimationDDiv uint32 // Y: X/Y of epoch in blocks
|
||||||
|
|
167
pkg/innerring/blocktimer_test.go
Normal file
167
pkg/innerring/blocktimer_test.go
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
package innerring
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/client/container"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/morph/event"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/logger/test"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEpochTimer(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
alphaState := &testAlphabetState{isAlphabet: true}
|
||||||
|
neh := &testNewEpochHandler{}
|
||||||
|
cnrStopper := &testContainerEstStopper{}
|
||||||
|
epochState := &testEpochState{
|
||||||
|
counter: 99,
|
||||||
|
duration: 10,
|
||||||
|
}
|
||||||
|
collectHandler := &testEventHandler{}
|
||||||
|
distributeHandler := &testEventHandler{}
|
||||||
|
|
||||||
|
args := &epochTimerArgs{
|
||||||
|
l: test.NewLogger(t, true),
|
||||||
|
alphabetState: alphaState,
|
||||||
|
newEpochHandlers: []newEpochHandler{neh.Handle},
|
||||||
|
cnrWrapper: cnrStopper,
|
||||||
|
epoch: epochState,
|
||||||
|
stopEstimationDMul: 2,
|
||||||
|
stopEstimationDDiv: 10,
|
||||||
|
collectBasicIncome: subEpochEventHandler{
|
||||||
|
handler: collectHandler.Handle,
|
||||||
|
durationMul: 3,
|
||||||
|
durationDiv: 10,
|
||||||
|
},
|
||||||
|
distributeBasicIncome: subEpochEventHandler{
|
||||||
|
handler: distributeHandler.Handle,
|
||||||
|
durationMul: 4,
|
||||||
|
durationDiv: 10,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
et := newEpochTimer(args)
|
||||||
|
err := et.Reset()
|
||||||
|
require.NoError(t, err, "failed to reset timer")
|
||||||
|
|
||||||
|
et.Tick(100)
|
||||||
|
require.Equal(t, 0, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 0, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 0, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 0, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(101)
|
||||||
|
require.Equal(t, 0, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 1, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 0, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 0, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(102)
|
||||||
|
require.Equal(t, 0, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 1, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 1, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 0, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(103)
|
||||||
|
require.Equal(t, 0, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 1, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 1, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 1, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
var h uint32
|
||||||
|
for h = 104; h < 109; h++ {
|
||||||
|
et.Tick(h)
|
||||||
|
require.Equal(t, 0, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 1, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 1, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 1, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
}
|
||||||
|
|
||||||
|
et.Tick(109)
|
||||||
|
require.Equal(t, 1, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 1, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 1, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 1, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(110)
|
||||||
|
require.Equal(t, 1, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 1, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 1, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 1, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(111)
|
||||||
|
require.Equal(t, 1, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 2, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 1, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 1, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(112)
|
||||||
|
require.Equal(t, 1, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 2, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 2, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 1, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
et.Tick(113)
|
||||||
|
require.Equal(t, 1, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 2, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 2, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 2, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
|
||||||
|
for h = 114; h < 119; h++ {
|
||||||
|
et.Tick(h)
|
||||||
|
require.Equal(t, 1, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 2, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 2, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 2, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
}
|
||||||
|
et.Tick(120)
|
||||||
|
require.Equal(t, 2, neh.called, "invalid new epoch handler calls")
|
||||||
|
require.Equal(t, 2, cnrStopper.called, "invalid container stop handler calls")
|
||||||
|
require.Equal(t, 2, collectHandler.called, "invalid collect basic income calls")
|
||||||
|
require.Equal(t, 2, distributeHandler.called, "invalid distribute basic income calls")
|
||||||
|
}
|
||||||
|
|
||||||
|
type testAlphabetState struct {
|
||||||
|
isAlphabet bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *testAlphabetState) IsAlphabet() bool {
|
||||||
|
return s.isAlphabet
|
||||||
|
}
|
||||||
|
|
||||||
|
type testNewEpochHandler struct {
|
||||||
|
called int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *testNewEpochHandler) Handle() {
|
||||||
|
h.called++
|
||||||
|
}
|
||||||
|
|
||||||
|
type testContainerEstStopper struct {
|
||||||
|
called int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *testContainerEstStopper) StopEstimation(_ container.StopEstimationPrm) error {
|
||||||
|
s.called++
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type testEpochState struct {
|
||||||
|
counter uint64
|
||||||
|
duration uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *testEpochState) EpochCounter() uint64 {
|
||||||
|
return s.counter
|
||||||
|
}
|
||||||
|
func (s *testEpochState) EpochDuration() uint64 {
|
||||||
|
return s.duration
|
||||||
|
}
|
||||||
|
|
||||||
|
type testEventHandler struct {
|
||||||
|
called int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *testEventHandler) Handle(e event.Event) {
|
||||||
|
h.called++
|
||||||
|
}
|
Loading…
Reference in a new issue