diff --git a/internal/serviceconfig/build/build.go b/internal/serviceconfig/build/build.go index 5f036660..e9f5175a 100644 --- a/internal/serviceconfig/build/build.go +++ b/internal/serviceconfig/build/build.go @@ -25,16 +25,16 @@ var startupTime time.Time var startupTimeOnce sync.Once func GetVersionTimestamp() time.Time { - startupTimeOnce.Do(getStartTime(&startupTime, debug.ReadBuildInfo)) + startupTimeOnce.Do(getStartTime(&startupTime, debug.ReadBuildInfo, time.Now)) return startupTime } -func getStartTime(startupTime *time.Time, readBuildInfo func() (info *debug.BuildInfo, ok bool)) func() { +func getStartTime(startupTime *time.Time, readBuildInfo func() (info *debug.BuildInfo, ok bool), clock func() time.Time) func() { return func() { info, ok := readBuildInfo() if !ok { - *startupTime = time.Now().UTC() + *startupTime = clock() return } @@ -52,7 +52,7 @@ func getStartTime(startupTime *time.Time, readBuildInfo func() (info *debug.Buil } // Return current time if no build time found - *startupTime = time.Now().UTC() + *startupTime = clock() } } diff --git a/internal/serviceconfig/build/build_test.go b/internal/serviceconfig/build/build_test.go index 849c6b20..79eccf6b 100644 --- a/internal/serviceconfig/build/build_test.go +++ b/internal/serviceconfig/build/build_test.go @@ -51,27 +51,30 @@ func TestGetVersionTimestamp(t *testing.T) { } func TestGetStartTime(t *testing.T) { + injectedTime := time.Now().UTC() + injectTime := func() time.Time { + return injectedTime + } + vcsTime := time.Now().UTC() t.Run("vcs time", func(t *testing.T) { var tt time.Time - expectedTime := time.Now().UTC() f := getStartTime(&tt, func() (info *debug.BuildInfo, ok bool) { return &debug.BuildInfo{ Settings: []debug.BuildSetting{ { Key: "vcs.time", - Value: expectedTime.Format(time.RFC3339), + Value: vcsTime.Format(time.RFC3339), }, }, }, true - }) + }, injectTime) assert.NotNil(t, f) f() - assert.Equal(t, expectedTime.Truncate(time.Second), tt) + assert.Equal(t, vcsTime.Truncate(time.Second), tt) }) t.Run("vcs time - invalid format", func(t *testing.T) { var tt time.Time // to make the test less likely to fail due to non deterministic temporal issues. - expectedTime := time.Now().UTC().Add(-time.Millisecond) f := getStartTime(&tt, func() (info *debug.BuildInfo, ok bool) { return &debug.BuildInfo{ Settings: []debug.BuildSetting{ @@ -81,10 +84,27 @@ func TestGetStartTime(t *testing.T) { }, }, }, true - }) + }, injectTime) assert.NotNil(t, f) f() - assert.True(t, expectedTime.Before(tt)) + assert.Equal(t, injectedTime, tt) + }) + t.Run("vcs time - not available", func(t *testing.T) { + var tt time.Time + // to make the test less likely to fail due to non deterministic temporal issues. + f := getStartTime(&tt, func() (info *debug.BuildInfo, ok bool) { + return &debug.BuildInfo{ + Settings: []debug.BuildSetting{ + { + Key: "vcs.time", + Value: "invalid", + }, + }, + }, true + }, injectTime) + assert.NotNil(t, f) + f() + assert.Equal(t, injectedTime, tt) }) }