From f013960d87e05d28cccbb38a7b22f62cbcd4176b Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 4 Aug 2021 10:36:51 -0700 Subject: [PATCH] tstime/mono: make json.Unmarshal of a zero time.Time yield a zero Time This was the proximate cause of #2579. #2582 is a deeper fix, but this will remain as a footgun, so may as well fix it too. Signed-off-by: Josh Bleecher Snyder --- tstime/mono/mono.go | 4 ++++ tstime/mono/mono_test.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/tstime/mono/mono.go b/tstime/mono/mono.go index 3e582f644..c639c47a7 100644 --- a/tstime/mono/mono.go +++ b/tstime/mono/mono.go @@ -121,6 +121,10 @@ func (t *Time) UnmarshalJSON(data []byte) error { if err != nil { return err } + if tt.IsZero() { + *t = 0 + return nil + } *t = Now().Add(-time.Since(tt)) return nil } diff --git a/tstime/mono/mono_test.go b/tstime/mono/mono_test.go index afa05799f..4d678c0bc 100644 --- a/tstime/mono/mono_test.go +++ b/tstime/mono/mono_test.go @@ -5,6 +5,7 @@ package mono import ( + "encoding/json" "testing" "time" ) @@ -17,6 +18,22 @@ func TestNow(t *testing.T) { } } +func TestUnmarshalZero(t *testing.T) { + var tt time.Time + buf, err := json.Marshal(tt) + if err != nil { + t.Fatal(err) + } + var m Time + err = json.Unmarshal(buf, &m) + if err != nil { + t.Fatal(err) + } + if !m.IsZero() { + t.Errorf("expected unmarshal of zero time to be 0, got %d (~=%v)", m, m) + } +} + func BenchmarkMonoNow(b *testing.B) { for i := 0; i < b.N; i++ { Now()