15000: Include bad value in error message.
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 13 Jun 2019 13:32:02 +0000 (09:32 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 13 Jun 2019 13:32:02 +0000 (09:32 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/duration.go
sdk/go/arvados/duration_test.go

index 2696fdb051146ca34bd311e7e29e1092b0a3723e..ee482fdf3150f6a2baf126d4d540f2479fe6ba69 100644 (file)
@@ -20,7 +20,9 @@ func (d *Duration) UnmarshalJSON(data []byte) error {
        if data[0] == '"' {
                return d.Set(string(data[1 : len(data)-1]))
        }
-       return fmt.Errorf("duration must be given as a string like \"600s\" or \"1h30m\"")
+       // Mimic error message returned by ParseDuration for a number
+       // without units.
+       return fmt.Errorf("missing unit in duration %s", data)
 }
 
 // MarshalJSON implements json.Marshaler.
index ee787a6a76a2807ebfce6211db28987250bbdd89..257a2b4ef54156d65b22bafb3152cc067de6cd13 100644 (file)
@@ -43,3 +43,20 @@ func (s *DurationSuite) TestMarshalJSON(c *check.C) {
                c.Check(string(buf), check.Equals, `"`+trial.out+`"`)
        }
 }
+
+func (s *DurationSuite) TestUnmarshalJSON(c *check.C) {
+       var d struct {
+               D Duration
+       }
+       err := json.Unmarshal([]byte(`{"D":1.234}`), &d)
+       c.Check(err, check.ErrorMatches, `missing unit in duration 1.234`)
+       err = json.Unmarshal([]byte(`{"D":"1.234"}`), &d)
+       c.Check(err, check.ErrorMatches, `.*missing unit in duration 1.234`)
+       err = json.Unmarshal([]byte(`{"D":"1"}`), &d)
+       c.Check(err, check.ErrorMatches, `.*missing unit in duration 1`)
+       err = json.Unmarshal([]byte(`{"D":"foobar"}`), &d)
+       c.Check(err, check.ErrorMatches, `.*invalid duration foobar`)
+       err = json.Unmarshal([]byte(`{"D":"60s"}`), &d)
+       c.Check(err, check.IsNil)
+       c.Check(d.D.Duration(), check.Equals, time.Minute)
+}