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