knative.dev/pkg@v0.0.0-20260602142205-ac97e43f6622/reconciler/testing/tracker_test.go (about) 1 /* 2 Copyright 2020 The Knative Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 package testing 17 18 import ( 19 "testing" 20 21 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 22 "k8s.io/apimachinery/pkg/types" 23 . "knative.dev/pkg/testing" 24 "knative.dev/pkg/tracker" 25 ) 26 27 func TestFakeTracker(t *testing.T) { 28 t1 := &Resource{ 29 ObjectMeta: metav1.ObjectMeta{ 30 Namespace: "ns", 31 Name: "foo", 32 }, 33 } 34 t1Name := types.NamespacedName{ 35 Namespace: t1.Namespace, 36 Name: t1.Name, 37 } 38 t2 := &Resource{ 39 ObjectMeta: metav1.ObjectMeta{ 40 Namespace: "default", 41 Name: "bar.baz.this-is-fine", 42 }, 43 } 44 t2Name := types.NamespacedName{ 45 Namespace: t2.Namespace, 46 Name: t2.Name, 47 } 48 49 obj1 := &Resource{ 50 TypeMeta: metav1.TypeMeta{ 51 APIVersion: "fakeapi", 52 Kind: "Fake", 53 }, 54 ObjectMeta: metav1.ObjectMeta{ 55 Namespace: "foo", 56 Name: "bar", 57 }, 58 } 59 ref1 := tracker.Reference{ 60 APIVersion: obj1.APIVersion, 61 Kind: obj1.Kind, 62 Namespace: obj1.Namespace, 63 Name: obj1.Name, 64 } 65 obj2 := &Resource{ 66 TypeMeta: metav1.TypeMeta{ 67 APIVersion: "fakeapi2", 68 Kind: "Fake2", 69 }, 70 ObjectMeta: metav1.ObjectMeta{ 71 Namespace: "foo2", 72 Name: "bar2", 73 }, 74 } 75 ref2 := tracker.Reference{ 76 APIVersion: obj2.APIVersion, 77 Kind: obj2.Kind, 78 Namespace: obj2.Namespace, 79 Name: obj2.Name, 80 } 81 82 trk := &FakeTracker{} 83 84 // Adding t1 to ref1 and then removing it results in ref1 stopping tracking. 85 trk.TrackReference(ref1, t1) 86 if !isTracking(trk, ref1) { 87 t.Fatal("Tracker is not tracking", ref1) 88 } 89 if !hasObserver(trk, obj1, t1Name) { 90 t.Fatalf("Object %v is not being observed by %v", obj1, t1Name) 91 } 92 93 trk.OnDeletedObserver(t1) 94 if isTracking(trk, ref1) { 95 t.Fatal("Tracker is still tracking", ref1) 96 } 97 if hasObserver(trk, obj1, t1Name) { 98 t.Fatalf("Object %v is still being observed by %v", obj1, t1Name) 99 } 100 101 // Adding t1, t2 to ref1 and t2 to ref2, then removing t2 results in ref2 stopping 102 // tracking. 103 trk.TrackReference(ref1, t1) 104 trk.TrackReference(ref1, t2) 105 trk.TrackReference(ref2, t2) 106 if !isTracking(trk, ref1) { 107 t.Fatal("Tracker is not tracking", ref1) 108 } 109 if !isTracking(trk, ref2) { 110 t.Fatal("Tracker is not tracking", ref2) 111 } 112 if !hasObserver(trk, obj1, t1Name) { 113 t.Fatalf("Object %v is not being observed by %v", obj1, t1Name) 114 } 115 if !hasObserver(trk, obj1, t2Name) { 116 t.Fatalf("Object %v is not being observed by %v", obj1, t2Name) 117 } 118 if hasObserver(trk, obj2, t1Name) { 119 t.Fatalf("Object %v wrongly being observed by %v", obj2, t1Name) 120 } 121 if !hasObserver(trk, obj2, t2Name) { 122 t.Fatalf("Object %v is not being observed by %v", obj2, t2Name) 123 } 124 125 trk.OnDeletedObserver(t2) 126 if !isTracking(trk, ref1) { 127 t.Fatal("Tracker is not tracking", ref1) 128 } 129 if !hasObserver(trk, obj1, t1Name) { 130 t.Fatalf("Object %v is not being observed by %v", obj1, t1Name) 131 } 132 if isTracking(trk, ref2) { 133 t.Fatal("Tracker is still tracking", ref2) 134 } 135 if hasObserver(trk, obj1, t2Name) { 136 t.Fatalf("Object %v is still being observed by %v", obj1, t2Name) 137 } 138 if hasObserver(trk, obj2, t2Name) { 139 t.Fatalf("Object %v is still being observed by %v", obj2, t2Name) 140 } 141 142 trk.OnDeletedObserver(t1) 143 if isTracking(trk, ref1) { 144 t.Fatal("Tracker is still tracking", ref1) 145 } 146 if hasObserver(trk, obj1, t1Name) { 147 t.Fatalf("Object %v is still being observed by %v", obj1, t1Name) 148 } 149 } 150 151 func isTracking(tracker *FakeTracker, ref1 tracker.Reference) bool { 152 for _, tracking := range tracker.References() { 153 if tracking == ref1 { 154 return true 155 } 156 } 157 return false 158 } 159 160 func hasObserver(tracker *FakeTracker, obj *Resource, obs types.NamespacedName) bool { 161 observers := tracker.GetObservers(obj) 162 for _, observer := range observers { 163 if observer == obs { 164 return true 165 } 166 } 167 return false 168 }