168 lines
5.9 KiB
Go
168 lines
5.9 KiB
Go
|
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++
|
||
|
}
|