zeroconf icon indicating copy to clipboard operation
zeroconf copied to clipboard

resolve failure

Open leslie-wang opened this issue 6 years ago • 1 comments

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)
}

leslie-wang avatar Mar 21 '19 05:03 leslie-wang

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.")
}

leslie-wang avatar Mar 21 '19 05:03 leslie-wang