6c7bf357cd
package in audit This PR implements reputation store and replace overlay in audit service to use such store for storing node's audit stats. In order to keep the changeset smaller, most of the changes in this PR is for copying audit logic in overlay to reputation package. In a following PR, the duplicating code will be removed from overlay. Change-Id: I16c12494a0970f44c422b26cf603c1dc489e5bc1
94 lines
3.7 KiB
Go
94 lines
3.7 KiB
Go
// Copyright (C) 2021 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package reputation_test
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"go.uber.org/zap"
|
|
|
|
"storj.io/common/testcontext"
|
|
"storj.io/storj/private/testplanet"
|
|
"storj.io/storj/satellite"
|
|
)
|
|
|
|
func TestAuditHistoryBasic(t *testing.T) {
|
|
const windowSize = time.Hour
|
|
const trackingPeriod = 2 * time.Hour
|
|
|
|
testplanet.Run(t, testplanet.Config{
|
|
SatelliteCount: 1, StorageNodeCount: 1,
|
|
Reconfigure: testplanet.Reconfigure{
|
|
Satellite: func(log *zap.Logger, index int, config *satellite.Config) {
|
|
config.Reputation.AuditHistory.WindowSize = windowSize
|
|
config.Reputation.AuditHistory.TrackingPeriod = trackingPeriod
|
|
},
|
|
},
|
|
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
|
|
node := planet.StorageNodes[0]
|
|
service := planet.Satellites[0].Reputation.Service
|
|
|
|
startingWindow := time.Now().Truncate(time.Hour)
|
|
windowsInTrackingPeriod := int(trackingPeriod.Seconds() / windowSize.Seconds())
|
|
currentWindow := startingWindow
|
|
|
|
// online score should be 1 until the first window is finished
|
|
res, err := service.UpdateAuditHistory(ctx, node.ID(), currentWindow.Add(2*time.Minute), false)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 1, res.NewScore)
|
|
require.False(t, res.TrackingPeriodFull)
|
|
|
|
res, err = service.UpdateAuditHistory(ctx, node.ID(), currentWindow.Add(20*time.Minute), true)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 1, res.NewScore)
|
|
require.False(t, res.TrackingPeriodFull)
|
|
|
|
// move to next window
|
|
currentWindow = currentWindow.Add(time.Hour)
|
|
|
|
// online score should be now be 0.5 since the first window is complete with one online audit and one offline audit
|
|
res, err = service.UpdateAuditHistory(ctx, node.ID(), currentWindow.Add(2*time.Minute), false)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 0.5, res.NewScore)
|
|
require.False(t, res.TrackingPeriodFull)
|
|
|
|
res, err = service.UpdateAuditHistory(ctx, node.ID(), currentWindow.Add(20*time.Minute), true)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 0.5, res.NewScore)
|
|
require.False(t, res.TrackingPeriodFull)
|
|
|
|
// move to next window
|
|
currentWindow = currentWindow.Add(time.Hour)
|
|
|
|
// try to add an audit for an old window, expect error
|
|
_, err = service.UpdateAuditHistory(ctx, node.ID(), startingWindow, true)
|
|
require.Error(t, err)
|
|
|
|
// add another online audit for the latest window; score should still be 0.5
|
|
res, err = service.UpdateAuditHistory(ctx, node.ID(), currentWindow, true)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 0.5, res.NewScore)
|
|
// now that we have two full windows other than the current one, tracking period should be considered full.
|
|
require.True(t, res.TrackingPeriodFull)
|
|
// add another online audit for the latest window; score should still be 0.5
|
|
res, err = service.UpdateAuditHistory(ctx, node.ID(), currentWindow.Add(45*time.Minute), true)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 0.5, res.NewScore)
|
|
require.True(t, res.TrackingPeriodFull)
|
|
|
|
currentWindow = currentWindow.Add(time.Hour)
|
|
// in the current state, there are windowsInTrackingPeriod windows with a score of 0.5
|
|
// and one window with a score of 1.0. The Math below calculates the new score when the latest
|
|
// window gets included in the tracking period, and the earliest 0.5 window gets dropped.
|
|
expectedScore := (0.5*float64(windowsInTrackingPeriod-1) + 1) / float64(windowsInTrackingPeriod)
|
|
// add online audit for next window; score should now be expectedScore
|
|
res, err = service.UpdateAuditHistory(ctx, node.ID(), currentWindow.Add(time.Minute), true)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, expectedScore, res.NewScore)
|
|
require.True(t, res.TrackingPeriodFull)
|
|
})
|
|
}
|