package consul import ( "context" "fmt" "net" "reflect" "strconv" "testing" "time" "github.com/go-kratos/kratos/v2/registry" "github.com/hashicorp/consul/api" ) func tcpServer(t *testing.T, lis net.Listener) { for { conn, err := lis.Accept() if err != nil { return } fmt.Println("get tcp") conn.Close() } } func TestRegister(t *testing.T) { addr := fmt.Sprintf("%s:9091", getIntranetIP()) lis, err := net.Listen("tcp", addr) if err != nil { t.Errorf("listen tcp %s failed!", addr) t.Fail() } defer lis.Close() go tcpServer(t, lis) time.Sleep(time.Millisecond * 100) cli, err := api.NewClient(&api.Config{Address: "127.0.0.1:8500"}) if err != nil { t.Fatalf("create consul client failed: %v", err) } opts := []Option{ WithHeartbeat(true), WithHealthCheck(true), WithHealthCheckInterval(5), } r := New(cli, opts...) if err != nil { t.Errorf("new consul registry failed: %v", err) } version := strconv.FormatInt(time.Now().Unix(), 10) svc := ®istry.ServiceInstance{ ID: "test2233", Name: "test-provider", Version: version, Metadata: map[string]string{"app": "kratos"}, Endpoints: []string{fmt.Sprintf("tcp://%s?isSecure=false", addr)}, } ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() err = r.Deregister(ctx, svc) if err != nil { t.Errorf("Deregister failed: %v", err) } err = r.Register(ctx, svc) if err != nil { t.Errorf("Register failed: %v", err) } w, err := r.Watch(ctx, "test-provider") if err != nil { t.Errorf("Watchfailed: %v", err) } services, err := w.Next() if err != nil { t.Errorf("Next failed: %v", err) } if !reflect.DeepEqual(1, len(services)) { t.Errorf("no expect float_key value: %v, but got: %v", len(services), 1) } if !reflect.DeepEqual("test2233", services[0].ID) { t.Errorf("no expect float_key value: %v, but got: %v", services[0].ID, "test2233") } if !reflect.DeepEqual("test-provider", services[0].Name) { t.Errorf("no expect float_key value: %v, but got: %v", services[0].Name, "test-provider") } if !reflect.DeepEqual(version, services[0].Version) { t.Errorf("no expect float_key value: %v, but got: %v", services[0].Version, version) } } func getIntranetIP() string { addrs, err := net.InterfaceAddrs() if err != nil { return "127.0.0.1" } for _, address := range addrs { if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { return ipnet.IP.String() } } } return "127.0.0.1" }