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