From dfb62926008e85310bc05cbf6b132cfb98662173 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Thu, 28 Sep 2023 09:06:54 +0300 Subject: [PATCH] Compare FloatHistogram.[Zero]Count float values as binary Signed-off-by: Linas Medziunas --- model/histogram/float_histogram.go | 3 ++- model/histogram/float_histogram_test.go | 36 +++++++++++++++++++++++++ model/histogram/histogram_test.go | 19 +++++++++---- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/model/histogram/float_histogram.go b/model/histogram/float_histogram.go index 6272b66831..54ff5d4df0 100644 --- a/model/histogram/float_histogram.go +++ b/model/histogram/float_histogram.go @@ -313,7 +313,8 @@ func (h *FloatHistogram) Equals(h2 *FloatHistogram) bool { } if h.Schema != h2.Schema || h.ZeroThreshold != h2.ZeroThreshold || - h.ZeroCount != h2.ZeroCount || h.Count != h2.Count || + math.Float64bits(h.ZeroCount) != math.Float64bits(h2.ZeroCount) || + math.Float64bits(h.Count) != math.Float64bits(h2.Count) || math.Float64bits(h.Sum) != math.Float64bits(h2.Sum) { return false } diff --git a/model/histogram/float_histogram_test.go b/model/histogram/float_histogram_test.go index 0b712be438..61e8fc515c 100644 --- a/model/histogram/float_histogram_test.go +++ b/model/histogram/float_histogram_test.go @@ -2291,3 +2291,39 @@ func TestFloatBucketIteratorTargetSchema(t *testing.T) { } require.False(t, it.Next(), "negative iterator not exhausted") } + +// TestFloatHistogramEquals tests FloatHistogram with float-specific cases that +// cannot be covered by TestHistogramEquals. +func TestFloatHistogramEquals(t *testing.T) { + h1 := FloatHistogram{ + Schema: 3, + Count: 2.2, + Sum: 9.7, + ZeroThreshold: 0.1, + ZeroCount: 1.1, + } + + equals := func(h1, h2 FloatHistogram) { + require.True(t, h1.Equals(&h2)) + require.True(t, h2.Equals(&h1)) + } + notEquals := func(h1, h2 FloatHistogram) { + require.False(t, h1.Equals(&h2)) + require.False(t, h2.Equals(&h1)) + } + + h2 := h1.Copy() + equals(h1, *h2) + + // Count is NaN (but not a StaleNaN). + hCountNaN := h1.Copy() + hCountNaN.Count = math.NaN() + notEquals(h1, *hCountNaN) + equals(*hCountNaN, *hCountNaN) + + // ZeroCount is NaN (but not a StaleNaN). + hZeroCountNaN := h1.Copy() + hZeroCountNaN.ZeroCount = math.NaN() + notEquals(h1, *hZeroCountNaN) + equals(*hZeroCountNaN, *hZeroCountNaN) +} diff --git a/model/histogram/histogram_test.go b/model/histogram/histogram_test.go index 2af90501e5..23fb1779ea 100644 --- a/model/histogram/histogram_test.go +++ b/model/histogram/histogram_test.go @@ -540,11 +540,20 @@ func TestHistogramEquals(t *testing.T) { h2.NegativeBuckets = append(h2.NegativeBuckets, 1) notEquals(h1, *h2) - // StaleNaN. - h2 = h1.Copy() - h2.Sum = math.Float64frombits(value.StaleNaN) - notEquals(h1, *h2) - equals(*h2, *h2) + // Sum is StaleNaN. + hStale := h1.Copy() + hStale.Sum = math.Float64frombits(value.StaleNaN) + notEquals(h1, *hStale) + equals(*hStale, *hStale) + + // Sum is NaN (but not a StaleNaN). + hNaN := h1.Copy() + hNaN.Sum = math.NaN() + notEquals(h1, *hNaN) + equals(*hNaN, *hNaN) + + // Sum StaleNaN vs regular NaN. + notEquals(*hStale, *hNaN) } func TestHistogramCompact(t *testing.T) {