215 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package gossip
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"sync"
 | 
						|
	"testing"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/google/uuid"
 | 
						|
	"github.com/hashicorp/memberlist"
 | 
						|
	"github.com/micro/go-micro/registry"
 | 
						|
)
 | 
						|
 | 
						|
func newMemberlistConfig() *memberlist.Config {
 | 
						|
	mc := memberlist.DefaultLANConfig()
 | 
						|
	mc.DisableTcpPings = false
 | 
						|
	mc.GossipVerifyIncoming = false
 | 
						|
	mc.GossipVerifyOutgoing = false
 | 
						|
	mc.EnableCompression = false
 | 
						|
	mc.PushPullInterval = 3 * time.Second
 | 
						|
	mc.LogOutput = os.Stderr
 | 
						|
	mc.ProtocolVersion = 4
 | 
						|
	mc.Name = uuid.New().String()
 | 
						|
	return mc
 | 
						|
}
 | 
						|
 | 
						|
func newRegistry(opts ...registry.Option) registry.Registry {
 | 
						|
	options := []registry.Option{
 | 
						|
		ConnectRetry(true),
 | 
						|
		ConnectTimeout(60 * time.Second),
 | 
						|
	}
 | 
						|
 | 
						|
	options = append(options, opts...)
 | 
						|
	r := NewRegistry(options...)
 | 
						|
	return r
 | 
						|
}
 | 
						|
 | 
						|
func TestGossipRegistryBroadcast(t *testing.T) {
 | 
						|
	mc1 := newMemberlistConfig()
 | 
						|
	r1 := newRegistry(Config(mc1), Address("127.0.0.1:54321"))
 | 
						|
 | 
						|
	mc2 := newMemberlistConfig()
 | 
						|
	r2 := newRegistry(Config(mc2), Address("127.0.0.2:54321"), registry.Addrs("127.0.0.1:54321"))
 | 
						|
 | 
						|
	defer r1.(*gossipRegistry).Stop()
 | 
						|
	defer r2.(*gossipRegistry).Stop()
 | 
						|
 | 
						|
	svc1 := ®istry.Service{Name: "service.1", Version: "0.0.0.1"}
 | 
						|
	svc2 := ®istry.Service{Name: "service.2", Version: "0.0.0.2"}
 | 
						|
 | 
						|
	if err := r1.Register(svc1, registry.RegisterTTL(10*time.Second)); err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	if err := r2.Register(svc2, registry.RegisterTTL(10*time.Second)); err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	var found bool
 | 
						|
	svcs, err := r1.ListServices()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, svc := range svcs {
 | 
						|
		if svc.Name == "service.2" {
 | 
						|
			found = true
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if !found {
 | 
						|
		t.Fatalf("[gossip registry] service.2 not found in r1, broadcast not work")
 | 
						|
	}
 | 
						|
 | 
						|
	found = false
 | 
						|
 | 
						|
	svcs, err = r2.ListServices()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, svc := range svcs {
 | 
						|
		if svc.Name == "service.1" {
 | 
						|
			found = true
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if !found {
 | 
						|
		t.Fatalf("[gossip registry] broadcast failed: service.1 not found in r2")
 | 
						|
	}
 | 
						|
 | 
						|
	if err := r1.Deregister(svc1); err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	if err := r2.Deregister(svc2); err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
func TestGossipRegistryRetry(t *testing.T) {
 | 
						|
	mc1 := newMemberlistConfig()
 | 
						|
	r1 := newRegistry(Config(mc1), Address("127.0.0.1:54321"))
 | 
						|
 | 
						|
	mc2 := newMemberlistConfig()
 | 
						|
	r2 := newRegistry(Config(mc2), Address("127.0.0.2:54321"), registry.Addrs("127.0.0.1:54321"))
 | 
						|
 | 
						|
	defer r1.(*gossipRegistry).Stop()
 | 
						|
	defer r2.(*gossipRegistry).Stop()
 | 
						|
 | 
						|
	svc1 := ®istry.Service{Name: "service.1", Version: "0.0.0.1"}
 | 
						|
	svc2 := ®istry.Service{Name: "service.2", Version: "0.0.0.2"}
 | 
						|
 | 
						|
	var mu sync.Mutex
 | 
						|
	ch := make(chan struct{})
 | 
						|
	ticker := time.NewTicker(1 * time.Second)
 | 
						|
	defer ticker.Stop()
 | 
						|
 | 
						|
	go func() {
 | 
						|
		for {
 | 
						|
			select {
 | 
						|
			case <-ticker.C:
 | 
						|
				mu.Lock()
 | 
						|
				if r1 != nil {
 | 
						|
					r1.Register(svc1, registry.RegisterTTL(2*time.Second))
 | 
						|
				}
 | 
						|
				if r2 != nil {
 | 
						|
					r2.Register(svc2, registry.RegisterTTL(2*time.Second))
 | 
						|
				}
 | 
						|
				if ch != nil {
 | 
						|
					close(ch)
 | 
						|
					ch = nil
 | 
						|
				}
 | 
						|
				mu.Unlock()
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}()
 | 
						|
 | 
						|
	<-ch
 | 
						|
	var found bool
 | 
						|
 | 
						|
	svcs, err := r2.ListServices()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, svc := range svcs {
 | 
						|
		if svc.Name == "service.1" {
 | 
						|
			found = true
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if !found {
 | 
						|
		t.Fatalf("[gossip registry] broadcast failed: service.1 not found in r2")
 | 
						|
	}
 | 
						|
 | 
						|
	if err = r1.(*gossipRegistry).Stop(); err != nil {
 | 
						|
		t.Fatalf("[gossip registry] failed to stop registry: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	mu.Lock()
 | 
						|
	r1 = nil
 | 
						|
	mu.Unlock()
 | 
						|
 | 
						|
	<-time.After(3 * time.Second)
 | 
						|
 | 
						|
	found = false
 | 
						|
	svcs, err = r2.ListServices()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, svc := range svcs {
 | 
						|
		if svc.Name == "service.1" {
 | 
						|
			found = true
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if found {
 | 
						|
		t.Fatalf("[gossip registry] service.1 found in r2")
 | 
						|
	}
 | 
						|
 | 
						|
	if tr := os.Getenv("TRAVIS"); len(tr) > 0 {
 | 
						|
		t.Logf("[gossip registry] skip test on travis")
 | 
						|
		t.Skip()
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	r1 = newRegistry(Config(mc1), Address("127.0.0.1:54321"))
 | 
						|
	<-time.After(2 * time.Second)
 | 
						|
 | 
						|
	found = false
 | 
						|
	svcs, err = r2.ListServices()
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	for _, svc := range svcs {
 | 
						|
		if svc.Name == "service.1" {
 | 
						|
			found = true
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if !found {
 | 
						|
		t.Fatalf("[gossip registry] connect retry failed: service.1 not found in r2")
 | 
						|
	}
 | 
						|
 | 
						|
	if err := r1.Deregister(svc1); err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	if err := r2.Deregister(svc2); err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	r1.(*gossipRegistry).Stop()
 | 
						|
	r2.(*gossipRegistry).Stop()
 | 
						|
}
 |