cli-utils/pkg/object/objmetadata_set_test.go

223 lines
5.5 KiB
Go

// Copyright 2020 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package object
import (
"testing"
"github.com/stretchr/testify/assert"
"k8s.io/apimachinery/pkg/runtime/schema"
)
var objMeta1 = ObjMetadata{
GroupKind: schema.GroupKind{
Group: "apps",
Kind: "Deployment",
},
Name: "dep",
Namespace: "default",
}
var objMeta2 = ObjMetadata{
GroupKind: schema.GroupKind{
Group: "apps",
Kind: "StatefulSet",
},
Name: "dep",
Namespace: "default",
}
var objMeta3 = ObjMetadata{
GroupKind: schema.GroupKind{
Group: "",
Kind: "Pod",
},
Name: "pod-a",
Namespace: "default",
}
var objMeta4 = ObjMetadata{
GroupKind: schema.GroupKind{
Group: "",
Kind: "Pod",
},
Name: "pod-b",
Namespace: "default",
}
func TestObjMetadataSetEquals(t *testing.T) {
testCases := map[string]struct {
setA ObjMetadataSet
setB ObjMetadataSet
isEqual bool
}{
"Empty sets results in empty union": {
setA: ObjMetadataSet{},
setB: ObjMetadataSet{},
isEqual: true,
},
"Empty second set results in same set": {
setA: ObjMetadataSet{objMeta1, objMeta3},
setB: ObjMetadataSet{},
isEqual: false,
},
"Empty initial set results in empty diff": {
setA: ObjMetadataSet{},
setB: ObjMetadataSet{objMeta1, objMeta3},
isEqual: false,
},
"Different ordering are equal sets": {
setA: ObjMetadataSet{objMeta2, objMeta1},
setB: ObjMetadataSet{objMeta1, objMeta2},
isEqual: true,
},
"One item overlap": {
setA: ObjMetadataSet{objMeta2, objMeta1},
setB: ObjMetadataSet{objMeta1, objMeta3},
isEqual: false,
},
"Disjoint sets results in larger set": {
setA: ObjMetadataSet{objMeta1, objMeta2},
setB: ObjMetadataSet{objMeta3, objMeta4},
isEqual: false,
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
actual := tc.setA.Equal(tc.setB)
if tc.isEqual != actual {
t.Errorf("Equal expected (%t), got (%t)", tc.isEqual, actual)
}
})
}
}
func TestObjMetadataSetUnion(t *testing.T) {
testCases := map[string]struct {
setA ObjMetadataSet
setB ObjMetadataSet
expected ObjMetadataSet
}{
"Empty sets results in empty union": {
setA: ObjMetadataSet{},
setB: ObjMetadataSet{},
expected: ObjMetadataSet{},
},
"Empty second set results in same set": {
setA: ObjMetadataSet{objMeta1, objMeta3},
setB: ObjMetadataSet{},
expected: ObjMetadataSet{objMeta1, objMeta3},
},
"Empty initial set results in empty diff": {
setA: ObjMetadataSet{},
setB: ObjMetadataSet{objMeta1, objMeta3},
expected: ObjMetadataSet{objMeta1, objMeta3},
},
"Same sets in different order results in same set": {
setA: ObjMetadataSet{objMeta2, objMeta1},
setB: ObjMetadataSet{objMeta1, objMeta2},
expected: ObjMetadataSet{objMeta1, objMeta2},
},
"One item overlap": {
setA: ObjMetadataSet{objMeta2, objMeta1},
setB: ObjMetadataSet{objMeta1, objMeta3},
expected: ObjMetadataSet{objMeta1, objMeta2, objMeta3},
},
"Disjoint sets results in larger set": {
setA: ObjMetadataSet{objMeta1, objMeta2},
setB: ObjMetadataSet{objMeta3, objMeta4},
expected: ObjMetadataSet{objMeta1, objMeta2, objMeta3, objMeta4},
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
actual := tc.setA.Union(tc.setB)
if !tc.expected.Equal(actual) {
t.Errorf("Union expected set (%s), got (%s)", tc.expected, actual)
}
})
}
}
func TestObjMetadataSetDiff(t *testing.T) {
testCases := map[string]struct {
setA ObjMetadataSet
setB ObjMetadataSet
expected ObjMetadataSet
}{
"Empty sets results in empty diff": {
setA: ObjMetadataSet{},
setB: ObjMetadataSet{},
expected: ObjMetadataSet{},
},
"Empty subtraction set results in same set": {
setA: ObjMetadataSet{objMeta1, objMeta3},
setB: ObjMetadataSet{},
expected: ObjMetadataSet{objMeta1, objMeta3},
},
"Empty initial set results in empty diff": {
setA: ObjMetadataSet{},
setB: ObjMetadataSet{objMeta1, objMeta3},
expected: ObjMetadataSet{},
},
"Sets equal results in empty diff": {
setA: ObjMetadataSet{objMeta2, objMeta1},
setB: ObjMetadataSet{objMeta1, objMeta2},
expected: ObjMetadataSet{},
},
"Basic diff": {
setA: ObjMetadataSet{objMeta2, objMeta1},
setB: ObjMetadataSet{objMeta1},
expected: ObjMetadataSet{objMeta2},
},
"Subtract non-elements results in no change": {
setA: ObjMetadataSet{objMeta1},
setB: ObjMetadataSet{objMeta3, objMeta4},
expected: ObjMetadataSet{objMeta1},
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
actual := tc.setA.Diff(tc.setB)
if !tc.expected.Equal(actual) {
t.Errorf("Diff expected set (%s), got (%s)", tc.expected, actual)
}
})
}
}
func TestObjMetadataSetHash(t *testing.T) {
tests := map[string]struct {
objs ObjMetadataSet
expected string
}{
"No objects gives valid hash": {
objs: ObjMetadataSet{},
expected: "811c9dc5",
},
"Single object gives valid hash": {
objs: ObjMetadataSet{objMeta1},
expected: "3715cd95",
},
"Multiple objects gives valid hash": {
objs: ObjMetadataSet{objMeta1, objMeta2, objMeta3},
expected: "d69d726a",
},
"Different ordering gives same hash": {
objs: ObjMetadataSet{objMeta2, objMeta3, objMeta1},
expected: "d69d726a",
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
actual := tc.objs.Hash()
assert.Equal(t, tc.expected, actual)
})
}
}