gitee.com/sasukebo/go-micro/v4@v4.7.1/registry/mdns_test.go (about) 1 package registry 2 3 import ( 4 "os" 5 "testing" 6 "time" 7 ) 8 9 func TestMDNS(t *testing.T) { 10 // skip test in travis because of sendto: operation not permitted error 11 if travis := os.Getenv("TRAVIS"); travis == "true" { 12 t.Skip() 13 } 14 15 testData := []*Service{ 16 { 17 Name: "test1", 18 Version: "1.0.1", 19 Nodes: []*Node{ 20 { 21 Id: "test1-1", 22 Address: "10.0.0.1:10001", 23 Metadata: map[string]string{ 24 "foo": "bar", 25 }, 26 }, 27 }, 28 }, 29 { 30 Name: "test2", 31 Version: "1.0.2", 32 Nodes: []*Node{ 33 { 34 Id: "test2-1", 35 Address: "10.0.0.2:10002", 36 Metadata: map[string]string{ 37 "foo2": "bar2", 38 }, 39 }, 40 }, 41 }, 42 { 43 Name: "test3", 44 Version: "1.0.3", 45 Nodes: []*Node{ 46 { 47 Id: "test3-1", 48 Address: "10.0.0.3:10003", 49 Metadata: map[string]string{ 50 "foo3": "bar3", 51 }, 52 }, 53 }, 54 }, 55 { 56 Name: "test4", 57 Version: "1.0.4", 58 Nodes: []*Node{ 59 { 60 Id: "test4-1", 61 Address: "[::]:10004", 62 Metadata: map[string]string{ 63 "foo4": "bar4", 64 }, 65 }, 66 }, 67 }, 68 } 69 70 travis := os.Getenv("TRAVIS") 71 72 var opts []Option 73 74 if travis == "true" { 75 opts = append(opts, Timeout(time.Millisecond*100)) 76 } 77 78 // new registry 79 r := NewRegistry(opts...) 80 81 for _, service := range testData { 82 // register service 83 if err := r.Register(service); err != nil { 84 t.Fatal(err) 85 } 86 87 // get registered service 88 s, err := r.GetService(service.Name) 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 if len(s) != 1 { 94 t.Fatalf("Expected one result for %s got %d", service.Name, len(s)) 95 96 } 97 98 if s[0].Name != service.Name { 99 t.Fatalf("Expected name %s got %s", service.Name, s[0].Name) 100 } 101 102 if s[0].Version != service.Version { 103 t.Fatalf("Expected version %s got %s", service.Version, s[0].Version) 104 } 105 106 if len(s[0].Nodes) != 1 { 107 t.Fatalf("Expected 1 node, got %d", len(s[0].Nodes)) 108 } 109 110 node := s[0].Nodes[0] 111 112 if node.Id != service.Nodes[0].Id { 113 t.Fatalf("Expected node id %s got %s", service.Nodes[0].Id, node.Id) 114 } 115 116 if node.Address != service.Nodes[0].Address { 117 t.Fatalf("Expected node address %s got %s", service.Nodes[0].Address, node.Address) 118 } 119 } 120 121 services, err := r.ListServices() 122 if err != nil { 123 t.Fatal(err) 124 } 125 126 for _, service := range testData { 127 var seen bool 128 for _, s := range services { 129 if s.Name == service.Name { 130 seen = true 131 break 132 } 133 } 134 if !seen { 135 t.Fatalf("Expected service %s got nothing", service.Name) 136 } 137 138 // deregister 139 if err := r.Deregister(service); err != nil { 140 t.Fatal(err) 141 } 142 143 time.Sleep(time.Millisecond * 5) 144 145 // check its gone 146 s, _ := r.GetService(service.Name) 147 if len(s) > 0 { 148 t.Fatalf("Expected nothing got %+v", s[0]) 149 } 150 } 151 152 } 153 154 func TestEncoding(t *testing.T) { 155 testData := []*mdnsTxt{ 156 { 157 Version: "1.0.0", 158 Metadata: map[string]string{ 159 "foo": "bar", 160 }, 161 Endpoints: []*Endpoint{ 162 { 163 Name: "endpoint1", 164 Request: &Value{ 165 Name: "request", 166 Type: "request", 167 }, 168 Response: &Value{ 169 Name: "response", 170 Type: "response", 171 }, 172 Metadata: map[string]string{ 173 "foo1": "bar1", 174 }, 175 }, 176 }, 177 }, 178 } 179 180 for _, d := range testData { 181 encoded, err := encode(d) 182 if err != nil { 183 t.Fatal(err) 184 } 185 186 for _, txt := range encoded { 187 if len(txt) > 255 { 188 t.Fatalf("One of parts for txt is %d characters", len(txt)) 189 } 190 } 191 192 decoded, err := decode(encoded) 193 if err != nil { 194 t.Fatal(err) 195 } 196 197 if decoded.Version != d.Version { 198 t.Fatalf("Expected version %s got %s", d.Version, decoded.Version) 199 } 200 201 if len(decoded.Endpoints) != len(d.Endpoints) { 202 t.Fatalf("Expected %d endpoints, got %d", len(d.Endpoints), len(decoded.Endpoints)) 203 } 204 205 for k, v := range d.Metadata { 206 if val := decoded.Metadata[k]; val != v { 207 t.Fatalf("Expected %s=%s got %s=%s", k, v, k, val) 208 } 209 } 210 } 211 212 } 213 214 func TestWatcher(t *testing.T) { 215 if travis := os.Getenv("TRAVIS"); travis == "true" { 216 t.Skip() 217 } 218 219 testData := []*Service{ 220 { 221 Name: "test1", 222 Version: "1.0.1", 223 Nodes: []*Node{ 224 { 225 Id: "test1-1", 226 Address: "10.0.0.1:10001", 227 Metadata: map[string]string{ 228 "foo": "bar", 229 }, 230 }, 231 }, 232 }, 233 { 234 Name: "test2", 235 Version: "1.0.2", 236 Nodes: []*Node{ 237 { 238 Id: "test2-1", 239 Address: "10.0.0.2:10002", 240 Metadata: map[string]string{ 241 "foo2": "bar2", 242 }, 243 }, 244 }, 245 }, 246 { 247 Name: "test3", 248 Version: "1.0.3", 249 Nodes: []*Node{ 250 { 251 Id: "test3-1", 252 Address: "10.0.0.3:10003", 253 Metadata: map[string]string{ 254 "foo3": "bar3", 255 }, 256 }, 257 }, 258 }, 259 { 260 Name: "test4", 261 Version: "1.0.4", 262 Nodes: []*Node{ 263 { 264 Id: "test4-1", 265 Address: "[::]:10004", 266 Metadata: map[string]string{ 267 "foo4": "bar4", 268 }, 269 }, 270 }, 271 }, 272 } 273 274 testFn := func(service, s *Service) { 275 if s == nil { 276 t.Fatalf("Expected one result for %s got nil", service.Name) 277 278 } 279 280 if s.Name != service.Name { 281 t.Fatalf("Expected name %s got %s", service.Name, s.Name) 282 } 283 284 if s.Version != service.Version { 285 t.Fatalf("Expected version %s got %s", service.Version, s.Version) 286 } 287 288 if len(s.Nodes) != 1 { 289 t.Fatalf("Expected 1 node, got %d", len(s.Nodes)) 290 } 291 292 node := s.Nodes[0] 293 294 if node.Id != service.Nodes[0].Id { 295 t.Fatalf("Expected node id %s got %s", service.Nodes[0].Id, node.Id) 296 } 297 298 if node.Address != service.Nodes[0].Address { 299 t.Fatalf("Expected node address %s got %s", service.Nodes[0].Address, node.Address) 300 } 301 } 302 303 travis := os.Getenv("TRAVIS") 304 305 var opts []Option 306 307 if travis == "true" { 308 opts = append(opts, Timeout(time.Millisecond*100)) 309 } 310 311 // new registry 312 r := NewRegistry(opts...) 313 314 w, err := r.Watch() 315 if err != nil { 316 t.Fatal(err) 317 } 318 defer w.Stop() 319 320 for _, service := range testData { 321 // register service 322 if err := r.Register(service); err != nil { 323 t.Fatal(err) 324 } 325 326 for { 327 res, err := w.Next() 328 if err != nil { 329 t.Fatal(err) 330 } 331 332 if res.Service.Name != service.Name { 333 continue 334 } 335 336 if res.Action != "create" { 337 t.Fatalf("Expected create event got %s for %s", res.Action, res.Service.Name) 338 } 339 340 testFn(service, res.Service) 341 break 342 } 343 344 // deregister 345 if err := r.Deregister(service); err != nil { 346 t.Fatal(err) 347 } 348 349 for { 350 res, err := w.Next() 351 if err != nil { 352 t.Fatal(err) 353 } 354 355 if res.Service.Name != service.Name { 356 continue 357 } 358 359 if res.Action != "delete" { 360 continue 361 } 362 363 testFn(service, res.Service) 364 break 365 } 366 } 367 }