aboutsummaryrefslogtreecommitdiff
path: root/src/time/time_test.go
diff options
context:
space:
mode:
authorMartin Möhrmann <martisch@uos.de>2015-01-07 19:56:06 +0100
committerRobert Griesemer <gri@golang.org>2015-01-15 00:15:58 +0000
commitd1210acffd19482a0471f68d62baf10695fee8b9 (patch)
tree745f4c7b2010764fba640d69299df8c173639387 /src/time/time_test.go
parent3b63b69d2f16be676d4fdc4f4ac697ed92abf523 (diff)
downloadgo-d1210acffd19482a0471f68d62baf10695fee8b9.tar.gz
go-d1210acffd19482a0471f68d62baf10695fee8b9.zip
time: correctly parse large input durations and avoid precision loss
Do not lose precision for durations specified without fractions that can be represented by an int64 such as 1<<53+1 nanoseconds. Previously there was some precision lost in floating point conversion. Handle overflow for durations above 1<<63-1 nanoseconds but not earlier. Add tests to cover the above cases. Change-Id: I4bcda93cee1673e501ecb6a9eef3914ee29aecd2 Reviewed-on: https://go-review.googlesource.com/2461 Reviewed-by: Russ Cox <rsc@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'src/time/time_test.go')
-rw-r--r--src/time/time_test.go23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/time/time_test.go b/src/time/time_test.go
index 7e31dd78a9..757474a30b 100644
--- a/src/time/time_test.go
+++ b/src/time/time_test.go
@@ -832,6 +832,14 @@ var parseDurationTests = []struct {
{"52763797000ns", true, 52763797000 * Nanosecond},
// more than 9 digits after decimal point, see http://golang.org/issue/6617
{"0.3333333333333333333h", true, 20 * Minute},
+ // 9007199254740993 = 1<<53+1 cannot be stored precisely in a float64
+ {"9007199254740993ns", true, (1<<53 + 1) * Nanosecond},
+ // largest duration that can be represented by int64 in nanoseconds
+ {"9223372036854775807ns", true, (1<<63 - 1) * Nanosecond},
+ {"9223372036854775.807us", true, (1<<63 - 1) * Nanosecond},
+ {"9223372036s854ms775us807ns", true, (1<<63 - 1) * Nanosecond},
+ // large negative value
+ {"-9223372036854775807ns", true, -1<<63 + 1*Nanosecond},
// errors
{"", false, 0},
@@ -842,7 +850,13 @@ var parseDurationTests = []struct {
{"-.", false, 0},
{".s", false, 0},
{"+.s", false, 0},
- {"3000000h", false, 0}, // overflow
+ {"3000000h", false, 0}, // overflow
+ {"9223372036854775808ns", false, 0}, // overflow
+ {"9223372036854775.808us", false, 0}, // overflow
+ {"9223372036854ms775us808ns", false, 0}, // overflow
+ // largest negative value of type int64 in nanoseconds should fail
+ // see https://go-review.googlesource.com/#/c/2461/
+ {"-9223372036854775808ns", false, 0},
}
func TestParseDuration(t *testing.T) {
@@ -1052,6 +1066,13 @@ func BenchmarkParse(b *testing.B) {
}
}
+func BenchmarkParseDuration(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ ParseDuration("9007199254.740993ms")
+ ParseDuration("9007199254740993ns")
+ }
+}
+
func BenchmarkHour(b *testing.B) {
t := Now()
for i := 0; i < b.N; i++ {