github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/registry/memory/memory_test.go (about) 1 // Licensed under the Apache License, Version 2.0 (the "License"); 2 // you may not use this file except in compliance with the License. 3 // You may obtain a copy of the License at 4 // 5 // https://www.apache.org/licenses/LICENSE-2.0 6 // 7 // Unless required by applicable law or agreed to in writing, software 8 // distributed under the License is distributed on an "AS IS" BASIS, 9 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 // See the License for the specific language governing permissions and 11 // limitations under the License. 12 // 13 // Original source: github.com/micro/go-micro/v3/registry/memory/memory_test.go 14 15 package memory 16 17 import ( 18 "fmt" 19 "os" 20 "testing" 21 "time" 22 23 "github.com/tickoalcantara12/micro/v3/service/registry" 24 ) 25 26 var ( 27 testData = map[string][]*registry.Service{ 28 "foo": { 29 { 30 Name: "foo", 31 Version: "1.0.0", 32 Nodes: []*registry.Node{ 33 { 34 Id: "foo-1.0.0-123", 35 Address: "localhost:9999", 36 }, 37 { 38 Id: "foo-1.0.0-321", 39 Address: "localhost:9999", 40 }, 41 }, 42 }, 43 { 44 Name: "foo", 45 Version: "1.0.1", 46 Nodes: []*registry.Node{ 47 { 48 Id: "foo-1.0.1-321", 49 Address: "localhost:6666", 50 }, 51 }, 52 }, 53 { 54 Name: "foo", 55 Version: "1.0.3", 56 Nodes: []*registry.Node{ 57 { 58 Id: "foo-1.0.3-345", 59 Address: "localhost:8888", 60 }, 61 }, 62 }, 63 }, 64 "bar": { 65 { 66 Name: "bar", 67 Version: "default", 68 Nodes: []*registry.Node{ 69 { 70 Id: "bar-1.0.0-123", 71 Address: "localhost:9999", 72 }, 73 { 74 Id: "bar-1.0.0-321", 75 Address: "localhost:9999", 76 }, 77 }, 78 }, 79 { 80 Name: "bar", 81 Version: "latest", 82 Nodes: []*registry.Node{ 83 { 84 Id: "bar-1.0.1-321", 85 Address: "localhost:6666", 86 }, 87 }, 88 }, 89 }, 90 } 91 ) 92 93 func TestMemoryRegistry(t *testing.T) { 94 m := NewRegistry() 95 96 fn := func(k string, v []*registry.Service) { 97 services, err := m.GetService(k) 98 if err != nil { 99 t.Errorf("Unexpected error getting service %s: %v", k, err) 100 } 101 102 if len(services) != len(v) { 103 t.Errorf("Expected %d services for %s, got %d", len(v), k, len(services)) 104 } 105 106 for _, service := range v { 107 var seen bool 108 for _, s := range services { 109 if s.Version == service.Version { 110 seen = true 111 break 112 } 113 } 114 if !seen { 115 t.Errorf("expected to find version %s", service.Version) 116 } 117 } 118 } 119 120 // register data 121 for _, v := range testData { 122 serviceCount := 0 123 for _, service := range v { 124 if err := m.Register(service); err != nil { 125 t.Errorf("Unexpected register error: %v", err) 126 } 127 serviceCount++ 128 // after the service has been registered we should be able to query it 129 services, err := m.GetService(service.Name) 130 if err != nil { 131 t.Errorf("Unexpected error getting service %s: %v", service.Name, err) 132 } 133 if len(services) != serviceCount { 134 t.Errorf("Expected %d services for %s, got %d", serviceCount, service.Name, len(services)) 135 } 136 } 137 } 138 139 // using test data 140 for k, v := range testData { 141 fn(k, v) 142 } 143 144 services, err := m.ListServices() 145 if err != nil { 146 t.Errorf("Unexpected error when listing services: %v", err) 147 } 148 149 totalServiceCount := 0 150 for _, testSvc := range testData { 151 for range testSvc { 152 totalServiceCount++ 153 } 154 } 155 156 if len(services) != totalServiceCount { 157 t.Errorf("Expected total service count: %d, got: %d", totalServiceCount, len(services)) 158 } 159 160 // deregister 161 for _, v := range testData { 162 for _, service := range v { 163 if err := m.Deregister(service); err != nil { 164 t.Errorf("Unexpected deregister error: %v", err) 165 } 166 } 167 } 168 169 // after all the service nodes have been deregistered we should not get any results 170 for _, v := range testData { 171 for _, service := range v { 172 services, err := m.GetService(service.Name) 173 if err != registry.ErrNotFound { 174 t.Errorf("Expected error: %v, got: %v", registry.ErrNotFound, err) 175 } 176 if len(services) != 0 { 177 t.Errorf("Expected %d services for %s, got %d", 0, service.Name, len(services)) 178 } 179 } 180 } 181 } 182 183 func TestMemoryRegistryTTL(t *testing.T) { 184 m := NewRegistry() 185 186 for _, v := range testData { 187 for _, service := range v { 188 if err := m.Register(service, registry.RegisterTTL(time.Millisecond)); err != nil { 189 t.Fatal(err) 190 } 191 } 192 } 193 194 time.Sleep(ttlPruneTime * 2) 195 196 for name := range testData { 197 svcs, err := m.GetService(name) 198 if err != registry.ErrNotFound { 199 t.Fatal(err) 200 } 201 202 for _, svc := range svcs { 203 if len(svc.Nodes) > 0 { 204 t.Fatalf("Service %q still has nodes registered", name) 205 } 206 } 207 } 208 } 209 210 func TestMemoryRegistryTTLConcurrent(t *testing.T) { 211 concurrency := 1000 212 waitTime := ttlPruneTime * 2 213 m := NewRegistry() 214 215 for _, v := range testData { 216 for _, service := range v { 217 if err := m.Register(service, registry.RegisterTTL(waitTime/2)); err != nil { 218 t.Fatal(err) 219 } 220 } 221 } 222 223 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 224 t.Logf("test will wait %v, then check TTL timeouts", waitTime) 225 } 226 227 errChan := make(chan error, concurrency) 228 syncChan := make(chan struct{}) 229 230 for i := 0; i < concurrency; i++ { 231 go func() { 232 <-syncChan 233 for name := range testData { 234 svcs, err := m.GetService(name) 235 if err != registry.ErrNotFound { 236 errChan <- err 237 return 238 } 239 240 for _, svc := range svcs { 241 if len(svc.Nodes) > 0 { 242 errChan <- fmt.Errorf("Service %q still has nodes registered", name) 243 return 244 } 245 } 246 } 247 248 errChan <- nil 249 }() 250 } 251 252 time.Sleep(waitTime) 253 close(syncChan) 254 255 for i := 0; i < concurrency; i++ { 256 if err := <-errChan; err != nil { 257 t.Fatal(err) 258 } 259 } 260 } 261 262 func TestMemoryWildcard(t *testing.T) { 263 m := NewRegistry() 264 testSrv := ®istry.Service{Name: "foo", Version: "1.0.0"} 265 266 if err := m.Register(testSrv, registry.RegisterDomain("one")); err != nil { 267 t.Fatalf("Register err: %v", err) 268 } 269 if err := m.Register(testSrv, registry.RegisterDomain("two")); err != nil { 270 t.Fatalf("Register err: %v", err) 271 } 272 273 if recs, err := m.ListServices(registry.ListDomain("one")); err != nil { 274 t.Errorf("List err: %v", err) 275 } else if len(recs) != 1 { 276 t.Errorf("Expected 1 record, got %v", len(recs)) 277 } 278 279 if recs, err := m.ListServices(registry.ListDomain("*")); err != nil { 280 t.Errorf("List err: %v", err) 281 } else if len(recs) != 2 { 282 t.Errorf("Expected 2 records, got %v", len(recs)) 283 } 284 285 if recs, err := m.GetService(testSrv.Name, registry.GetDomain("one")); err != nil { 286 t.Errorf("Get err: %v", err) 287 } else if len(recs) != 1 { 288 t.Errorf("Expected 1 record, got %v", len(recs)) 289 } 290 291 if recs, err := m.GetService(testSrv.Name, registry.GetDomain("*")); err != nil { 292 t.Errorf("Get err: %v", err) 293 } else if len(recs) != 2 { 294 t.Errorf("Expected 2 records, got %v", len(recs)) 295 } 296 }