go.ligato.io/vpp-agent/v3@v3.5.0/plugins/kvscheduler/internal/registry/registry_test.go (about) 1 // Copyright (c) 2018 Cisco and/or its affiliates. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at: 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package registry 16 17 import ( 18 "fmt" 19 "strings" 20 "testing" 21 22 . "github.com/onsi/gomega" 23 24 . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" 25 . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/internal/test" 26 ) 27 28 const ( 29 descriptor1Name = "descriptor1" 30 descriptor2Name = "descriptor2" 31 descriptor3Name = "descriptor3" 32 descriptor4Name = "descriptor4" 33 34 prefixA = "/prefixA/" 35 prefixB = "/prefixB/" 36 prefixC = "/prefixC/" 37 38 randomKey = "randomKey" 39 randomSuffix = "randomSuffix" 40 ) 41 42 func keySelector(keys ...string) func(key string) bool { 43 return func(key string) bool { 44 for _, k := range keys { 45 if key == k { 46 return true 47 } 48 } 49 return false 50 } 51 } 52 53 func prefixSelector(prefix string) func(key string) bool { 54 return func(key string) bool { 55 return strings.HasPrefix(key, prefix) 56 } 57 } 58 59 func TestRegistry(t *testing.T) { 60 RegisterTestingT(t) 61 62 descriptor1 := NewMockDescriptor( 63 &KVDescriptor{ 64 Name: descriptor1Name, 65 KeySelector: prefixSelector(prefixA), 66 RetrieveDependencies: []string{descriptor2Name}, 67 }, nil, 0) 68 69 descriptor2 := NewMockDescriptor( 70 &KVDescriptor{ 71 Name: descriptor2Name, 72 KeySelector: prefixSelector(prefixB), 73 RetrieveDependencies: []string{descriptor3Name}, 74 }, nil, 0) 75 76 descriptor3 := NewMockDescriptor( 77 &KVDescriptor{ 78 Name: descriptor3Name, 79 KeySelector: prefixSelector(prefixC), 80 RetrieveDependencies: []string{descriptor4Name}, 81 }, nil, 0) 82 83 descriptor4 := NewMockDescriptor( 84 &KVDescriptor{ 85 Name: descriptor4Name, 86 KeySelector: keySelector(randomKey), 87 }, nil, 0) 88 89 registry := NewRegistry() 90 91 registry.RegisterDescriptor(descriptor3) 92 registry.RegisterDescriptor(descriptor2) 93 registry.RegisterDescriptor(descriptor1) 94 registry.RegisterDescriptor(descriptor4) 95 96 // test that descriptors are ordered by dependencies 97 allDescriptors := registry.GetAllDescriptors() 98 Expect(allDescriptors).To(HaveLen(4)) 99 Expect(allDescriptors[0].Name).To(BeEquivalentTo(descriptor4Name)) 100 Expect(allDescriptors[1].Name).To(BeEquivalentTo(descriptor3Name)) 101 Expect(allDescriptors[2].Name).To(BeEquivalentTo(descriptor2Name)) 102 Expect(allDescriptors[3].Name).To(BeEquivalentTo(descriptor1Name)) 103 104 // test GetDescriptor() method 105 descriptor := registry.GetDescriptor(descriptor1Name) 106 Expect(descriptor).ToNot(BeNil()) 107 Expect(descriptor.Name).To(BeEquivalentTo(descriptor1Name)) 108 Expect(descriptor.KeySelector(prefixA + randomSuffix)).To(BeTrue()) 109 Expect(descriptor.KeySelector(prefixB + randomSuffix)).To(BeFalse()) 110 descriptor = registry.GetDescriptor(descriptor2Name) 111 Expect(descriptor).ToNot(BeNil()) 112 Expect(descriptor.Name).To(BeEquivalentTo(descriptor2Name)) 113 Expect(descriptor.KeySelector(prefixA + randomSuffix)).To(BeFalse()) 114 Expect(descriptor.KeySelector(prefixB + randomSuffix)).To(BeTrue()) 115 descriptor = registry.GetDescriptor(descriptor3Name) 116 Expect(descriptor).ToNot(BeNil()) 117 Expect(descriptor.Name).To(BeEquivalentTo(descriptor3Name)) 118 Expect(descriptor.KeySelector(prefixA + randomSuffix)).To(BeFalse()) 119 Expect(descriptor.KeySelector(prefixC + randomSuffix)).To(BeTrue()) 120 descriptor = registry.GetDescriptor(descriptor4Name) 121 Expect(descriptor).ToNot(BeNil()) 122 Expect(descriptor.Name).To(BeEquivalentTo(descriptor4Name)) 123 Expect(descriptor.KeySelector(prefixA + randomSuffix)).To(BeFalse()) 124 Expect(descriptor.KeySelector(randomKey)).To(BeTrue()) 125 126 // basic GetDescriptorForKey tests 127 descriptor = registry.GetDescriptorForKey(prefixA + randomSuffix) 128 Expect(descriptor).ToNot(BeNil()) 129 Expect(descriptor.Name).To(BeEquivalentTo(descriptor1Name)) 130 descriptor = registry.GetDescriptorForKey(prefixB + randomSuffix) 131 Expect(descriptor).ToNot(BeNil()) 132 Expect(descriptor.Name).To(BeEquivalentTo(descriptor2Name)) 133 descriptor = registry.GetDescriptorForKey(prefixC + randomSuffix) 134 Expect(descriptor).ToNot(BeNil()) 135 Expect(descriptor.Name).To(BeEquivalentTo(descriptor3Name)) 136 descriptor = registry.GetDescriptorForKey(randomKey) 137 Expect(descriptor).ToNot(BeNil()) 138 Expect(descriptor.Name).To(BeEquivalentTo(descriptor4Name)) 139 140 // repeated lookups will take result from the cache 141 descriptor = registry.GetDescriptorForKey(prefixA + randomSuffix) 142 Expect(descriptor).ToNot(BeNil()) 143 Expect(descriptor.Name).To(BeEquivalentTo(descriptor1Name)) 144 descriptor = registry.GetDescriptorForKey(prefixB + randomSuffix) 145 Expect(descriptor).ToNot(BeNil()) 146 Expect(descriptor.Name).To(BeEquivalentTo(descriptor2Name)) 147 descriptor = registry.GetDescriptorForKey(prefixC + randomSuffix) 148 Expect(descriptor).ToNot(BeNil()) 149 Expect(descriptor.Name).To(BeEquivalentTo(descriptor3Name)) 150 descriptor = registry.GetDescriptorForKey(randomKey) 151 Expect(descriptor).ToNot(BeNil()) 152 Expect(descriptor.Name).To(BeEquivalentTo(descriptor4Name)) 153 154 // fill up the cache 155 for i := 0; i < maxKeyCacheSize; i++ { 156 if i%2 == 0 { 157 descriptor = registry.GetDescriptorForKey(fmt.Sprintf("%s%d", prefixA, i)) 158 Expect(descriptor).ToNot(BeNil()) 159 Expect(descriptor.Name).To(BeEquivalentTo(descriptor1Name)) 160 } else { 161 descriptor = registry.GetDescriptorForKey(fmt.Sprintf("%s%d", prefixB, i)) 162 Expect(descriptor).ToNot(BeNil()) 163 Expect(descriptor.Name).To(BeEquivalentTo(descriptor2Name)) 164 } 165 } 166 167 // results for these lookups were already removed from the cache and thus will have to be repeated 168 descriptor = registry.GetDescriptorForKey(prefixA + randomSuffix) 169 Expect(descriptor).ToNot(BeNil()) 170 Expect(descriptor.Name).To(BeEquivalentTo(descriptor1Name)) 171 descriptor = registry.GetDescriptorForKey(prefixB + randomSuffix) 172 Expect(descriptor).ToNot(BeNil()) 173 Expect(descriptor.Name).To(BeEquivalentTo(descriptor2Name)) 174 descriptor = registry.GetDescriptorForKey(prefixC + randomSuffix) 175 Expect(descriptor).ToNot(BeNil()) 176 Expect(descriptor.Name).To(BeEquivalentTo(descriptor3Name)) 177 descriptor = registry.GetDescriptorForKey(randomKey) 178 Expect(descriptor).ToNot(BeNil()) 179 Expect(descriptor.Name).To(BeEquivalentTo(descriptor4Name)) 180 }