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  }