...

Source file src/sigs.k8s.io/cli-utils/pkg/object/objmetadata_set_test.go

Documentation: sigs.k8s.io/cli-utils/pkg/object

     1  // Copyright 2020 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package object
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"k8s.io/apimachinery/pkg/runtime/schema"
    11  )
    12  
    13  var objMeta1 = ObjMetadata{
    14  	GroupKind: schema.GroupKind{
    15  		Group: "apps",
    16  		Kind:  "Deployment",
    17  	},
    18  	Name:      "dep",
    19  	Namespace: "default",
    20  }
    21  
    22  var objMeta2 = ObjMetadata{
    23  	GroupKind: schema.GroupKind{
    24  		Group: "apps",
    25  		Kind:  "StatefulSet",
    26  	},
    27  	Name:      "dep",
    28  	Namespace: "default",
    29  }
    30  
    31  var objMeta3 = ObjMetadata{
    32  	GroupKind: schema.GroupKind{
    33  		Group: "",
    34  		Kind:  "Pod",
    35  	},
    36  	Name:      "pod-a",
    37  	Namespace: "default",
    38  }
    39  
    40  var objMeta4 = ObjMetadata{
    41  	GroupKind: schema.GroupKind{
    42  		Group: "",
    43  		Kind:  "Pod",
    44  	},
    45  	Name:      "pod-b",
    46  	Namespace: "default",
    47  }
    48  
    49  func TestObjMetadataSetEquals(t *testing.T) {
    50  	testCases := map[string]struct {
    51  		setA    ObjMetadataSet
    52  		setB    ObjMetadataSet
    53  		isEqual bool
    54  	}{
    55  		"Empty sets results in empty union": {
    56  			setA:    ObjMetadataSet{},
    57  			setB:    ObjMetadataSet{},
    58  			isEqual: true,
    59  		},
    60  		"Empty second set results in same set": {
    61  			setA:    ObjMetadataSet{objMeta1, objMeta3},
    62  			setB:    ObjMetadataSet{},
    63  			isEqual: false,
    64  		},
    65  		"Empty initial set results in empty diff": {
    66  			setA:    ObjMetadataSet{},
    67  			setB:    ObjMetadataSet{objMeta1, objMeta3},
    68  			isEqual: false,
    69  		},
    70  		"Different ordering are equal sets": {
    71  			setA:    ObjMetadataSet{objMeta2, objMeta1},
    72  			setB:    ObjMetadataSet{objMeta1, objMeta2},
    73  			isEqual: true,
    74  		},
    75  		"One item overlap": {
    76  			setA:    ObjMetadataSet{objMeta2, objMeta1},
    77  			setB:    ObjMetadataSet{objMeta1, objMeta3},
    78  			isEqual: false,
    79  		},
    80  		"Disjoint sets results in larger set": {
    81  			setA:    ObjMetadataSet{objMeta1, objMeta2},
    82  			setB:    ObjMetadataSet{objMeta3, objMeta4},
    83  			isEqual: false,
    84  		},
    85  	}
    86  
    87  	for name, tc := range testCases {
    88  		t.Run(name, func(t *testing.T) {
    89  			actual := tc.setA.Equal(tc.setB)
    90  			if tc.isEqual != actual {
    91  				t.Errorf("Equal expected (%t), got (%t)", tc.isEqual, actual)
    92  			}
    93  		})
    94  	}
    95  }
    96  
    97  func TestObjMetadataSetUnion(t *testing.T) {
    98  	testCases := map[string]struct {
    99  		setA     ObjMetadataSet
   100  		setB     ObjMetadataSet
   101  		expected ObjMetadataSet
   102  	}{
   103  		"Empty sets results in empty union": {
   104  			setA:     ObjMetadataSet{},
   105  			setB:     ObjMetadataSet{},
   106  			expected: ObjMetadataSet{},
   107  		},
   108  		"Empty second set results in same set": {
   109  			setA:     ObjMetadataSet{objMeta1, objMeta3},
   110  			setB:     ObjMetadataSet{},
   111  			expected: ObjMetadataSet{objMeta1, objMeta3},
   112  		},
   113  		"Empty initial set results in empty diff": {
   114  			setA:     ObjMetadataSet{},
   115  			setB:     ObjMetadataSet{objMeta1, objMeta3},
   116  			expected: ObjMetadataSet{objMeta1, objMeta3},
   117  		},
   118  		"Same sets in different order results in same set": {
   119  			setA:     ObjMetadataSet{objMeta2, objMeta1},
   120  			setB:     ObjMetadataSet{objMeta1, objMeta2},
   121  			expected: ObjMetadataSet{objMeta1, objMeta2},
   122  		},
   123  		"One item overlap": {
   124  			setA:     ObjMetadataSet{objMeta2, objMeta1},
   125  			setB:     ObjMetadataSet{objMeta1, objMeta3},
   126  			expected: ObjMetadataSet{objMeta1, objMeta2, objMeta3},
   127  		},
   128  		"Disjoint sets results in larger set": {
   129  			setA:     ObjMetadataSet{objMeta1, objMeta2},
   130  			setB:     ObjMetadataSet{objMeta3, objMeta4},
   131  			expected: ObjMetadataSet{objMeta1, objMeta2, objMeta3, objMeta4},
   132  		},
   133  	}
   134  
   135  	for name, tc := range testCases {
   136  		t.Run(name, func(t *testing.T) {
   137  			actual := tc.setA.Union(tc.setB)
   138  			if !tc.expected.Equal(actual) {
   139  				t.Errorf("Union expected set (%s), got (%s)", tc.expected, actual)
   140  			}
   141  		})
   142  	}
   143  }
   144  
   145  func TestObjMetadataSetDiff(t *testing.T) {
   146  	testCases := map[string]struct {
   147  		setA     ObjMetadataSet
   148  		setB     ObjMetadataSet
   149  		expected ObjMetadataSet
   150  	}{
   151  		"Empty sets results in empty diff": {
   152  			setA:     ObjMetadataSet{},
   153  			setB:     ObjMetadataSet{},
   154  			expected: ObjMetadataSet{},
   155  		},
   156  		"Empty subtraction set results in same set": {
   157  			setA:     ObjMetadataSet{objMeta1, objMeta3},
   158  			setB:     ObjMetadataSet{},
   159  			expected: ObjMetadataSet{objMeta1, objMeta3},
   160  		},
   161  		"Empty initial set results in empty diff": {
   162  			setA:     ObjMetadataSet{},
   163  			setB:     ObjMetadataSet{objMeta1, objMeta3},
   164  			expected: ObjMetadataSet{},
   165  		},
   166  		"Sets equal results in empty diff": {
   167  			setA:     ObjMetadataSet{objMeta2, objMeta1},
   168  			setB:     ObjMetadataSet{objMeta1, objMeta2},
   169  			expected: ObjMetadataSet{},
   170  		},
   171  		"Basic diff": {
   172  			setA:     ObjMetadataSet{objMeta2, objMeta1},
   173  			setB:     ObjMetadataSet{objMeta1},
   174  			expected: ObjMetadataSet{objMeta2},
   175  		},
   176  		"Subtract non-elements results in no change": {
   177  			setA:     ObjMetadataSet{objMeta1},
   178  			setB:     ObjMetadataSet{objMeta3, objMeta4},
   179  			expected: ObjMetadataSet{objMeta1},
   180  		},
   181  	}
   182  
   183  	for name, tc := range testCases {
   184  		t.Run(name, func(t *testing.T) {
   185  			actual := tc.setA.Diff(tc.setB)
   186  			if !tc.expected.Equal(actual) {
   187  				t.Errorf("Diff expected set (%s), got (%s)", tc.expected, actual)
   188  			}
   189  		})
   190  	}
   191  }
   192  
   193  func TestObjMetadataSetHash(t *testing.T) {
   194  	tests := map[string]struct {
   195  		objs     ObjMetadataSet
   196  		expected string
   197  	}{
   198  		"No objects gives valid hash": {
   199  			objs:     ObjMetadataSet{},
   200  			expected: "811c9dc5",
   201  		},
   202  		"Single object gives valid hash": {
   203  			objs:     ObjMetadataSet{objMeta1},
   204  			expected: "3715cd95",
   205  		},
   206  		"Multiple objects gives valid hash": {
   207  			objs:     ObjMetadataSet{objMeta1, objMeta2, objMeta3},
   208  			expected: "d69d726a",
   209  		},
   210  		"Different ordering gives same hash": {
   211  			objs:     ObjMetadataSet{objMeta2, objMeta3, objMeta1},
   212  			expected: "d69d726a",
   213  		},
   214  	}
   215  
   216  	for name, tc := range tests {
   217  		t.Run(name, func(t *testing.T) {
   218  			actual := tc.objs.Hash()
   219  			assert.Equal(t, tc.expected, actual)
   220  		})
   221  	}
   222  }
   223  

View as plain text