go-micro.dev/v5@v5.12.0/registry/memory_test.go (about) 1 package registry 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 "time" 8 ) 9 10 var ( 11 testData = map[string][]*Service{ 12 "foo": { 13 { 14 Name: "foo", 15 Version: "1.0.0", 16 Nodes: []*Node{ 17 { 18 Id: "foo-1.0.0-123", 19 Address: "localhost:9999", 20 }, 21 { 22 Id: "foo-1.0.0-321", 23 Address: "localhost:9999", 24 }, 25 }, 26 }, 27 { 28 Name: "foo", 29 Version: "1.0.1", 30 Nodes: []*Node{ 31 { 32 Id: "foo-1.0.1-321", 33 Address: "localhost:6666", 34 }, 35 }, 36 }, 37 { 38 Name: "foo", 39 Version: "1.0.3", 40 Nodes: []*Node{ 41 { 42 Id: "foo-1.0.3-345", 43 Address: "localhost:8888", 44 }, 45 }, 46 }, 47 }, 48 "bar": { 49 { 50 Name: "bar", 51 Version: "default", 52 Nodes: []*Node{ 53 { 54 Id: "bar-1.0.0-123", 55 Address: "localhost:9999", 56 }, 57 { 58 Id: "bar-1.0.0-321", 59 Address: "localhost:9999", 60 }, 61 }, 62 }, 63 { 64 Name: "bar", 65 Version: "latest", 66 Nodes: []*Node{ 67 { 68 Id: "bar-1.0.1-321", 69 Address: "localhost:6666", 70 }, 71 }, 72 }, 73 }, 74 } 75 ) 76 77 func TestMemoryRegistry(t *testing.T) { 78 m := NewMemoryRegistry() 79 80 fn := func(k string, v []*Service) { 81 services, err := m.GetService(k) 82 if err != nil { 83 t.Errorf("Unexpected error getting service %s: %v", k, err) 84 } 85 86 if len(services) != len(v) { 87 t.Errorf("Expected %d services for %s, got %d", len(v), k, len(services)) 88 } 89 90 for _, service := range v { 91 var seen bool 92 for _, s := range services { 93 if s.Version == service.Version { 94 seen = true 95 break 96 } 97 } 98 if !seen { 99 t.Errorf("expected to find version %s", service.Version) 100 } 101 } 102 } 103 104 // register data 105 for _, v := range testData { 106 serviceCount := 0 107 for _, service := range v { 108 if err := m.Register(service); err != nil { 109 t.Errorf("Unexpected register error: %v", err) 110 } 111 serviceCount++ 112 // after the service has been registered we should be able to query it 113 services, err := m.GetService(service.Name) 114 if err != nil { 115 t.Errorf("Unexpected error getting service %s: %v", service.Name, err) 116 } 117 if len(services) != serviceCount { 118 t.Errorf("Expected %d services for %s, got %d", serviceCount, service.Name, len(services)) 119 } 120 } 121 } 122 123 // using test data 124 for k, v := range testData { 125 fn(k, v) 126 } 127 128 services, err := m.ListServices() 129 if err != nil { 130 t.Errorf("Unexpected error when listing services: %v", err) 131 } 132 133 totalServiceCount := 0 134 for _, testSvc := range testData { 135 for range testSvc { 136 totalServiceCount++ 137 } 138 } 139 140 if len(services) != totalServiceCount { 141 t.Errorf("Expected total service count: %d, got: %d", totalServiceCount, len(services)) 142 } 143 144 // deregister 145 for _, v := range testData { 146 for _, service := range v { 147 if err := m.Deregister(service); err != nil { 148 t.Errorf("Unexpected deregister error: %v", err) 149 } 150 } 151 } 152 153 // after all the service nodes have been deregistered we should not get any results 154 for _, v := range testData { 155 for _, service := range v { 156 services, err := m.GetService(service.Name) 157 if err != ErrNotFound { 158 t.Errorf("Expected error: %v, got: %v", ErrNotFound, err) 159 } 160 if len(services) != 0 { 161 t.Errorf("Expected %d services for %s, got %d", 0, service.Name, len(services)) 162 } 163 } 164 } 165 } 166 167 func TestMemoryRegistryTTL(t *testing.T) { 168 m := NewMemoryRegistry() 169 170 for _, v := range testData { 171 for _, service := range v { 172 if err := m.Register(service, RegisterTTL(time.Millisecond)); err != nil { 173 t.Fatal(err) 174 } 175 } 176 } 177 178 time.Sleep(ttlPruneTime * 2) 179 180 for name := range testData { 181 svcs, err := m.GetService(name) 182 if err != nil { 183 t.Fatal(err) 184 } 185 186 for _, svc := range svcs { 187 if len(svc.Nodes) > 0 { 188 t.Fatalf("Service %q still has nodes registered", name) 189 } 190 } 191 } 192 } 193 194 func TestMemoryRegistryTTLConcurrent(t *testing.T) { 195 concurrency := 1000 196 waitTime := ttlPruneTime * 2 197 m := NewMemoryRegistry() 198 199 for _, v := range testData { 200 for _, service := range v { 201 if err := m.Register(service, RegisterTTL(waitTime/2)); err != nil { 202 t.Fatal(err) 203 } 204 } 205 } 206 207 if len(os.Getenv("IN_TRAVIS_CI")) == 0 { 208 t.Logf("test will wait %v, then check TTL timeouts", waitTime) 209 } 210 211 errChan := make(chan error, concurrency) 212 syncChan := make(chan struct{}) 213 214 for i := 0; i < concurrency; i++ { 215 go func() { 216 <-syncChan 217 for name := range testData { 218 svcs, err := m.GetService(name) 219 if err != nil { 220 errChan <- err 221 return 222 } 223 224 for _, svc := range svcs { 225 if len(svc.Nodes) > 0 { 226 errChan <- fmt.Errorf("Service %q still has nodes registered", name) 227 return 228 } 229 } 230 } 231 232 errChan <- nil 233 }() 234 } 235 236 time.Sleep(waitTime) 237 close(syncChan) 238 239 for i := 0; i < concurrency; i++ { 240 if err := <-errChan; err != nil { 241 t.Fatal(err) 242 } 243 } 244 }