zeroconf
zeroconf copied to clipboard
resolve failure
I have below test cases (based on gopkg.in/check.v1 framework), which 1st resolve happened before publish, and 2nd resolve after publish. If using same resolver instance, it will fail
// by default mdns is not enabled
mdnsName := "test--xxxxxxxxxxxx"
mdnsService := "test--xxxx.tcp"
mdnsDomain := "local."
resolver, err := zeroconf.NewResolver(nil)
c.Assert(err, IsNil)
entries1 := make(chan *zeroconf.ServiceEntry)
go func(results <-chan *zeroconf.ServiceEntry) {
s := <-results
c.Assert(s, IsNil)
}(entries1)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
c.Assert(resolver.Browse(ctx, mdnsService, mdnsDomain, entries1), IsNil)
<-ctx.Done()
cancel()
go startMDNS(context.Background(), mdnsName, mdnsService, mdnsDomain)
time.Sleep(time.Second)
entries2 := make(chan *zeroconf.ServiceEntry)
expectedResult := []*zeroconf.ServiceEntry{}
go func(results <-chan *zeroconf.ServiceEntry) {
s := <-results
expectedResult = append(expectedResult, s)
}(entries2)
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
c.Assert(resolver.Browse(ctx, mdnsService, mdnsDomain, entries2), IsNil)
<-ctx.Done()
cancel()
c.Assert(len(expectedResult), Equals, 1)
c.Assert(expectedResult[0].Domain, Equals, mdnsDomain)
c.Assert(expectedResult[0].Service, Equals, mdnsService)
c.Assert(expectedResult[0].Instance, Equals, mdnsName)
but if 2nd resolve uses new resolver instance like below, it will success. Not sure if it is an issue, or it is designed like this way.
func (ts *mainSuite) TestMDNS(c *C) {
// by default mdns is not enabled
mdnsName := "test--xxxxxxxxxxxx"
mdnsService := "test--xxxx.tcp"
mdnsDomain := "local."
resolver, err := zeroconf.NewResolver(nil)
c.Assert(err, IsNil)
entries1 := make(chan *zeroconf.ServiceEntry)
go func(results <-chan *zeroconf.ServiceEntry) {
s := <-results
c.Assert(s, IsNil)
}(entries1)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
c.Assert(resolver.Browse(ctx, mdnsService, mdnsDomain, entries1), IsNil)
<-ctx.Done()
cancel()
go startMDNS(context.Background(), mdnsName, mdnsService, mdnsDomain)
time.Sleep(time.Second)
resolver2, err := zeroconf.NewResolver(nil)
c.Assert(err, IsNil)
entries2 := make(chan *zeroconf.ServiceEntry)
expectedResult := []*zeroconf.ServiceEntry{}
go func(results <-chan *zeroconf.ServiceEntry) {
s := <-results
expectedResult = append(expectedResult, s)
}(entries2)
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
c.Assert(resolver2.Browse(ctx, mdnsService, mdnsDomain, entries2), IsNil)
<-ctx.Done()
cancel()
c.Assert(len(expectedResult), Equals, 1)
c.Assert(expectedResult[0].Domain, Equals, mdnsDomain)
c.Assert(expectedResult[0].Service, Equals, mdnsService)
c.Assert(expectedResult[0].Instance, Equals, mdnsName)
}
Also, function startMDNS like below
func startMDNS(ctx context.Context, name, service, domain string) {
// 5353 is default mdns port
server, err := zeroconf.Register(name, service, domain, 5353, []string{"txtv=0", "lo=1", "la=2"}, nil)
if err != nil {
panic(errors.Wrap(err, "while registering mdns service"))
}
defer server.Shutdown()
logrus.Infof("Published service: %s, type: %s, domain: %s", name, service, domain)
<-ctx.Done()
logrus.Info("Shutting down.")
}