Sfoglia il codice sorgente

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 <[email protected]>
Josh Bleecher Snyder 4 anni fa
parent
commit
f013960d87
2 ha cambiato i file con 21 aggiunte e 0 eliminazioni
  1. 4 0
      tstime/mono/mono.go
  2. 17 0
      tstime/mono/mono_test.go

+ 4 - 0
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
 }

+ 17 - 0
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()