diff --git a/mfer/builder_test.go b/mfer/builder_test.go index a92994f..761b2d5 100644 --- a/mfer/builder_test.go +++ b/mfer/builder_test.go @@ -92,6 +92,29 @@ func TestBuilderBuild(t *testing.T) { assert.True(t, strings.HasPrefix(buf.String(), MAGIC)) } +func TestNewTimestampFromTimeExtremeDate(t *testing.T) { + // Regression test: newTimestampFromTime used UnixNano() which panics + // for dates outside ~1678-2262. Now uses Nanosecond() which is safe. + tests := []struct { + name string + time time.Time + }{ + {"zero time", time.Time{}}, + {"year 1000", time.Date(1000, 1, 1, 0, 0, 0, 0, time.UTC)}, + {"year 3000", time.Date(3000, 1, 1, 0, 0, 0, 123456789, time.UTC)}, + {"unix epoch", time.Unix(0, 0)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Should not panic + ts := newTimestampFromTime(tt.time) + assert.Equal(t, tt.time.Unix(), ts.Seconds) + assert.Equal(t, int32(tt.time.Nanosecond()), ts.Nanos) + }) + } +} + func TestBuilderBuildEmpty(t *testing.T) { b := NewBuilder() diff --git a/mfer/serialize.go b/mfer/serialize.go index 0a2898c..4804901 100644 --- a/mfer/serialize.go +++ b/mfer/serialize.go @@ -16,11 +16,10 @@ import ( const MAGIC string = "ZNAVSRFG" func newTimestampFromTime(t time.Time) *Timestamp { - out := &Timestamp{ + return &Timestamp{ Seconds: t.Unix(), - Nanos: int32(t.UnixNano() - (t.Unix() * 1000000000)), + Nanos: int32(t.Nanosecond()), } - return out } func (m *manifest) generate() error {