diff --git a/go.mod b/go.mod index 7e586580e..0ba4deb40 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/go-zookeeper/zk v1.0.3 github.com/gogo/protobuf v1.3.2 github.com/golang/snappy v0.0.4 + github.com/google/go-cmp v0.6.0 github.com/google/pprof v0.0.0-20240117000934-35fc243c5815 github.com/google/uuid v1.5.0 github.com/gophercloud/gophercloud v1.8.0 @@ -135,7 +136,6 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect diff --git a/util/testutil/cmp.go b/util/testutil/cmp.go new file mode 100644 index 000000000..370d191f3 --- /dev/null +++ b/util/testutil/cmp.go @@ -0,0 +1,43 @@ +// Copyright 2023 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 testutil + +import ( + "fmt" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + + "github.com/prometheus/prometheus/model/labels" +) + +// Replacement for require.Equal using go-cmp adapted for Prometheus data structures, instead of DeepEqual. +func RequireEqual(t testing.TB, expected, actual interface{}, msgAndArgs ...interface{}) { + t.Helper() + RequireEqualWithOptions(t, expected, actual, nil, msgAndArgs...) +} + +// As RequireEqual but allows extra cmp.Options. +func RequireEqualWithOptions(t testing.TB, expected, actual interface{}, extra []cmp.Option, msgAndArgs ...interface{}) { + t.Helper() + options := append([]cmp.Option{cmp.Comparer(labels.Equal)}, extra...) + if cmp.Equal(expected, actual, options...) { + return + } + diff := cmp.Diff(expected, actual, options...) + require.Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual : %s%s", expected, actual, diff), msgAndArgs...) +}