diff --git a/template/template_amd64_test.go b/template/template_amd64_test.go new file mode 100644 index 000000000..913a7e2b8 --- /dev/null +++ b/template/template_amd64_test.go @@ -0,0 +1,40 @@ +// Copyright 2021 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package template + +import ( + "math" + "testing" +) + +// Some test cases rely upon architecture-specific behaviors with respect +// to numerical conversions. The logic remains the same across architectures, +// but outputs can vary, so the cases are only run on amd64. +// See https://github.com/prometheus/prometheus/issues/10185 for more details. +func TestTemplateExpansionAMD64(t *testing.T) { + testTemplateExpansion(t, []scenario{ + { + // HumanizeDuration - MaxInt64. + text: "{{ humanizeDuration . }}", + input: math.MaxInt64, + output: "-106751991167300d -15h -30m -8s", + }, + { + // HumanizeDuration - MaxUint64. + text: "{{ humanizeDuration . }}", + input: uint(math.MaxUint64), + output: "-106751991167300d -15h -30m -8s", + }, + }) +} diff --git a/template/template_test.go b/template/template_test.go index ab39502ab..e7201d68d 100644 --- a/template/template_test.go +++ b/template/template_test.go @@ -27,16 +27,7 @@ import ( ) func TestTemplateExpansion(t *testing.T) { - scenarios := []struct { - text string - output string - input interface{} - options []string - queryResult promql.Vector - shouldFail bool - html bool - errorMsg string - }{ + testTemplateExpansion(t, []scenario{ { // No template. text: "plain text", @@ -353,14 +344,14 @@ func TestTemplateExpansion(t *testing.T) { { // HumanizeDuration - int. text: "{{ range . }}{{ humanizeDuration . }}:{{ end }}", - input: []int{0, -1, 1, 1234567, math.MaxInt64}, - output: "0s:-1s:1s:14d 6h 56m 7s:-106751991167300d -15h -30m -8s:", + input: []int{0, -1, 1, 1234567}, + output: "0s:-1s:1s:14d 6h 56m 7s:", }, { // HumanizeDuration - uint. text: "{{ range . }}{{ humanizeDuration . }}:{{ end }}", - input: []uint{0, 1, 1234567, math.MaxUint64}, - output: "0s:1s:14d 6h 56m 7s:-106751991167300d -15h -30m -8s:", + input: []uint{0, 1, 1234567}, + output: "0s:1s:14d 6h 56m 7s:", }, { // Humanize* Inf and NaN - float64. @@ -489,8 +480,21 @@ func TestTemplateExpansion(t *testing.T) { text: "{{ printf \"%0.2f\" (parseDuration \"1h2m10ms\") }}", output: "3720.01", }, - } + }) +} + +type scenario struct { + text string + output string + input interface{} + options []string + queryResult promql.Vector + shouldFail bool + html bool + errorMsg string +} +func testTemplateExpansion(t *testing.T, scenarios []scenario) { extURL, err := url.Parse("http://testhost:9090/path/prefix") if err != nil { panic(err)