...
1
16
17 package unstructured_test
18
19 import (
20 "math/rand"
21 "reflect"
22 "testing"
23
24 "github.com/google/go-cmp/cmp"
25 "github.com/stretchr/testify/assert"
26 "k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
27 "k8s.io/apimachinery/pkg/api/equality"
28 metafuzzer "k8s.io/apimachinery/pkg/apis/meta/fuzzer"
29 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
31 "k8s.io/apimachinery/pkg/runtime"
32 "k8s.io/apimachinery/pkg/runtime/serializer"
33 )
34
35 func TestNilUnstructuredContent(t *testing.T) {
36 var u unstructured.Unstructured
37 uCopy := u.DeepCopy()
38 content := u.UnstructuredContent()
39 expContent := make(map[string]interface{})
40 assert.EqualValues(t, expContent, content)
41 assert.Equal(t, uCopy, &u)
42 }
43
44
45
46
47
48
49 func TestUnstructuredMetadataRoundTrip(t *testing.T) {
50 scheme := runtime.NewScheme()
51 codecs := serializer.NewCodecFactory(scheme)
52 seed := rand.Int63()
53 fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(seed), codecs)
54
55 N := 1000
56 for i := 0; i < N; i++ {
57 u := &unstructured.Unstructured{Object: map[string]interface{}{}}
58 uCopy := u.DeepCopy()
59 metadata := &metav1.ObjectMeta{}
60 fuzzer.Fuzz(metadata)
61
62 if err := setObjectMeta(u, metadata); err != nil {
63 t.Fatalf("unexpected error setting fuzzed ObjectMeta: %v", err)
64 }
65 setObjectMetaUsingAccessors(u, uCopy)
66
67 if !equality.Semantic.DeepEqual(u, uCopy) {
68 t.Errorf("diff: %v", cmp.Diff(u, uCopy))
69 }
70 }
71 }
72
73
74
75
76
77
78 func TestUnstructuredMetadataOmitempty(t *testing.T) {
79 scheme := runtime.NewScheme()
80 codecs := serializer.NewCodecFactory(scheme)
81 seed := rand.Int63()
82 fuzzer := fuzzer.FuzzerFor(metafuzzer.Funcs, rand.NewSource(seed), codecs)
83
84
85 u := &unstructured.Unstructured{Object: map[string]interface{}{}}
86 metadata := &metav1.ObjectMeta{}
87 fuzzer.Fuzz(metadata)
88 if err := setObjectMeta(u, metadata); err != nil {
89 t.Fatalf("unexpected error setting fuzzed ObjectMeta: %v", err)
90 }
91
92
93
94 u.SetName("")
95 u.SetGenerateName("")
96 u.SetNamespace("")
97 u.SetSelfLink("")
98 u.SetUID("")
99 u.SetResourceVersion("")
100 u.SetGeneration(0)
101 u.SetCreationTimestamp(metav1.Time{})
102 u.SetDeletionTimestamp(nil)
103 u.SetDeletionGracePeriodSeconds(nil)
104 u.SetLabels(nil)
105 u.SetAnnotations(nil)
106 u.SetOwnerReferences(nil)
107 u.SetFinalizers(nil)
108 u.SetManagedFields(nil)
109
110 gotMetadata, _, err := unstructured.NestedFieldNoCopy(u.UnstructuredContent(), "metadata")
111 if err != nil {
112 t.Error(err)
113 }
114 emptyMetadata := make(map[string]interface{})
115
116 if !reflect.DeepEqual(gotMetadata, emptyMetadata) {
117 t.Errorf("expected %v, got %v", emptyMetadata, gotMetadata)
118 }
119 }
120
121 func setObjectMeta(u *unstructured.Unstructured, objectMeta *metav1.ObjectMeta) error {
122 if objectMeta == nil {
123 unstructured.RemoveNestedField(u.UnstructuredContent(), "metadata")
124 return nil
125 }
126 metadata, err := runtime.DefaultUnstructuredConverter.ToUnstructured(objectMeta)
127 if err != nil {
128 return err
129 }
130 u.UnstructuredContent()["metadata"] = metadata
131 return nil
132 }
133
134 func setObjectMetaUsingAccessors(u, uCopy *unstructured.Unstructured) {
135 uCopy.SetName(u.GetName())
136 uCopy.SetGenerateName(u.GetGenerateName())
137 uCopy.SetNamespace(u.GetNamespace())
138 uCopy.SetSelfLink(u.GetSelfLink())
139 uCopy.SetUID(u.GetUID())
140 uCopy.SetResourceVersion(u.GetResourceVersion())
141 uCopy.SetGeneration(u.GetGeneration())
142 uCopy.SetCreationTimestamp(u.GetCreationTimestamp())
143 uCopy.SetDeletionTimestamp(u.GetDeletionTimestamp())
144 uCopy.SetDeletionGracePeriodSeconds(u.GetDeletionGracePeriodSeconds())
145 uCopy.SetLabels(u.GetLabels())
146 uCopy.SetAnnotations(u.GetAnnotations())
147 uCopy.SetOwnerReferences(u.GetOwnerReferences())
148 uCopy.SetFinalizers(u.GetFinalizers())
149 uCopy.SetManagedFields(u.GetManagedFields())
150 }
151
View as plain text