Files
nezha_domains/service/rpc/state_metrics_test.go
2026-07-20 04:26:19 +00:00

43 lines
1.2 KiB
Go

package rpc
import (
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/nezhahq/nezha/model"
"github.com/nezhahq/nezha/pkg/tsdb"
)
func TestStateMetricsWriterRunsOnlyForCurrentGeneration(t *testing.T) {
// Given
server := &model.Server{}
model.InitServer(server)
oldLease := server.AttachStateStream(stateGenerationStream{})
newLease := server.AttachStateStream(stateGenerationStream{})
oldCalls := 0
newCalls := 0
oldWriter := writeServerMetrics
writeServerMetrics = func(*tsdb.ServerMetrics) error {
newCalls++
return nil
}
t.Cleanup(func() { writeServerMetrics = oldWriter })
// When
oldAccepted := server.UpdateStateIfCurrentWithSideEffect(oldLease, &model.HostState{Uptime: 11}, time.Unix(100, 0), func() error {
oldCalls++
return writeServerMetrics(&tsdb.ServerMetrics{ServerID: 7, Timestamp: time.Unix(100, 0)})
})
newAccepted := server.UpdateStateIfCurrentWithSideEffect(newLease, &model.HostState{Uptime: 22}, time.Unix(200, 0), func() error {
return writeServerMetrics(&tsdb.ServerMetrics{ServerID: 7, Timestamp: time.Unix(200, 0)})
})
// Then
require.False(t, oldAccepted)
require.True(t, newAccepted)
require.Zero(t, oldCalls)
require.Equal(t, 1, newCalls)
}