go-micro.dev/v5@v5.12.0/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 := NewMDNSRegistry(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 if s[0].Name != service.Name { 98 t.Fatalf("Expected name %s got %s", service.Name, s[0].Name) 99 } 100 101 if s[0].Version != service.Version { 102 t.Fatalf("Expected version %s got %s", service.Version, s[0].Version) 103 } 104 105 if len(s[0].Nodes) != 1 { 106 t.Fatalf("Expected 1 node, got %d", len(s[0].Nodes)) 107 } 108 109 node := s[0].Nodes[0] 110 111 if node.Id != service.Nodes[0].Id { 112 t.Fatalf("Expected node id %s got %s", service.Nodes[0].Id, node.Id) 113 } 114 115 if node.Address != service.Nodes[0].Address { 116 t.Fatalf("Expected node address %s got %s", service.Nodes[0].Address, node.Address) 117 } 118 } 119 120 services, err := r.ListServices() 121 if err != nil { 122 t.Fatal(err) 123 } 124 125 for _, service := range testData { 126 var seen bool 127 for _, s := range services { 128 if s.Name == service.Name { 129 seen = true 130 break 131 } 132 } 133 if !seen { 134 t.Fatalf("Expected service %s got nothing", service.Name) 135 } 136 137 // deregister 138 if err := r.Deregister(service); err != nil { 139 t.Fatal(err) 140 } 141 142 time.Sleep(time.Millisecond * 5) 143 144 // check its gone 145 s, _ := r.GetService(service.Name) 146 if len(s) > 0 { 147 t.Fatalf("Expected nothing got %+v", s[0]) 148 } 149 } 150 } 151 152 func TestEncoding(t *testing.T) { 153 testData := []*mdnsTxt{ 154 { 155 Version: "1.0.0", 156 Metadata: map[string]string{ 157 "foo": "bar", 158 }, 159 Endpoints: []*Endpoint{ 160 { 161 Name: "endpoint1", 162 Request: &Value{ 163 Name: "request", 164 Type: "request", 165 }, 166 Response: &Value{ 167 Name: "response", 168 Type: "response", 169 }, 170 Metadata: map[string]string{ 171 "foo1": "bar1", 172 }, 173 }, 174 }, 175 }, 176 } 177 178 for _, d := range testData { 179 encoded, err := encode(d) 180 if err != nil { 181 t.Fatal(err) 182 } 183 184 for _, txt := range encoded { 185 if len(txt) > 255 { 186 t.Fatalf("One of parts for txt is %d characters", len(txt)) 187 } 188 } 189 190 decoded, err := decode(encoded) 191 if err != nil { 192 t.Fatal(err) 193 } 194 195 if decoded.Version != d.Version { 196 t.Fatalf("Expected version %s got %s", d.Version, decoded.Version) 197 } 198 199 if len(decoded.Endpoints) != len(d.Endpoints) { 200 t.Fatalf("Expected %d endpoints, got %d", len(d.Endpoints), len(decoded.Endpoints)) 201 } 202 203 for k, v := range d.Metadata { 204 if val := decoded.Metadata[k]; val != v { 205 t.Fatalf("Expected %s=%s got %s=%s", k, v, k, val) 206 } 207 } 208 } 209 } 210 211 func TestWatcher(t *testing.T) { 212 if travis := os.Getenv("TRAVIS"); travis == "true" { 213 t.Skip() 214 } 215 216 testData := []*Service{ 217 { 218 Name: "test1", 219 Version: "1.0.1", 220 Nodes: []*Node{ 221 { 222 Id: "test1-1", 223 Address: "10.0.0.1:10001", 224 Metadata: map[string]string{ 225 "foo": "bar", 226 }, 227 }, 228 }, 229 }, 230 { 231 Name: "test2", 232 Version: "1.0.2", 233 Nodes: []*Node{ 234 { 235 Id: "test2-1", 236 Address: "10.0.0.2:10002", 237 Metadata: map[string]string{ 238 "foo2": "bar2", 239 }, 240 }, 241 }, 242 }, 243 { 244 Name: "test3", 245 Version: "1.0.3", 246 Nodes: []*Node{ 247 { 248 Id: "test3-1", 249 Address: "10.0.0.3:10003", 250 Metadata: map[string]string{ 251 "foo3": "bar3", 252 }, 253 }, 254 }, 255 }, 256 { 257 Name: "test4", 258 Version: "1.0.4", 259 Nodes: []*Node{ 260 { 261 Id: "test4-1", 262 Address: "[::]:10004", 263 Metadata: map[string]string{ 264 "foo4": "bar4", 265 }, 266 }, 267 }, 268 }, 269 } 270 271 testFn := func(service, s *Service) { 272 if s == nil { 273 t.Fatalf("Expected one result for %s got nil", service.Name) 274 } 275 276 if s.Name != service.Name { 277 t.Fatalf("Expected name %s got %s", service.Name, s.Name) 278 } 279 280 if s.Version != service.Version { 281 t.Fatalf("Expected version %s got %s", service.Version, s.Version) 282 } 283 284 if len(s.Nodes) != 1 { 285 t.Fatalf("Expected 1 node, got %d", len(s.Nodes)) 286 } 287 288 node := s.Nodes[0] 289 290 if node.Id != service.Nodes[0].Id { 291 t.Fatalf("Expected node id %s got %s", service.Nodes[0].Id, node.Id) 292 } 293 294 if node.Address != service.Nodes[0].Address { 295 t.Fatalf("Expected node address %s got %s", service.Nodes[0].Address, node.Address) 296 } 297 } 298 299 travis := os.Getenv("TRAVIS") 300 301 var opts []Option 302 303 if travis == "true" { 304 opts = append(opts, Timeout(time.Millisecond*100)) 305 } 306 307 // new registry 308 r := NewMDNSRegistry(opts...) 309 310 w, err := r.Watch() 311 if err != nil { 312 t.Fatal(err) 313 } 314 defer w.Stop() 315 316 for _, service := range testData { 317 // register service 318 if err := r.Register(service); err != nil { 319 t.Fatal(err) 320 } 321 322 for { 323 res, err := w.Next() 324 if err != nil { 325 t.Fatal(err) 326 } 327 328 if res.Service.Name != service.Name { 329 continue 330 } 331 332 if res.Action != "create" { 333 t.Fatalf("Expected create event got %s for %s", res.Action, res.Service.Name) 334 } 335 336 testFn(service, res.Service) 337 break 338 } 339 340 // deregister 341 if err := r.Deregister(service); err != nil { 342 t.Fatal(err) 343 } 344 345 for { 346 res, err := w.Next() 347 if err != nil { 348 t.Fatal(err) 349 } 350 351 if res.Service.Name != service.Name { 352 continue 353 } 354 355 if res.Action != "delete" { 356 continue 357 } 358 359 testFn(service, res.Service) 360 break 361 } 362 } 363 }