package redis import ( "context" "fmt" "testing" "time" "github.com/alicebob/miniredis/v2" "go.unistack.org/micro/v3/register" ) func TestRegister(t *testing.T) { ctx := context.Background() s := miniredis.RunT(t) r := NewRegister(register.Addrs(s.Addr())) if err := r.Init(); err != nil { t.Fatal(err) } if err := r.Connect(ctx); err != nil { t.Fatal(err) } defer func() { if err := r.Disconnect(ctx); err != nil { t.Fatal(err) } }() nodes := []*register.Node{ {ID: "1", Address: "11.22.33.44"}, } svc := ®ister.Service{Name: "test", Version: "1.2.0", Nodes: nodes} if err := r.Register(ctx, svc, register.RegisterTTL(100*time.Millisecond)); err != nil { t.Fatal(err) } svcs, err := r.ListServices(ctx) if err != nil { t.Fatal(err) } else if len(svcs) == 0 { t.Fatalf("no services registered") } if svcs[0].Name != "test" || svcs[0].Version != "1.2.0" { t.Fatalf("invalid service %#+v", svcs[0]) } svcs, err = r.LookupService(ctx, "test") if err != nil { t.Fatal(err) } else if len(svcs) == 0 { t.Fatalf("no services registered") } if svcs[0].Name != "test" || svcs[0].Version != "1.2.0" { t.Fatalf("invalid service %d %#+v", len(svcs), svcs[0]) } s.FastForward(200 * time.Millisecond) svcs, err = r.ListServices(ctx) if err != nil { t.Fatal(err) } else if len(svcs) != 0 { t.Fatalf("have registered services") } } func TestDeregister(t *testing.T) { ctx := context.Background() s := miniredis.RunT(t) r := NewRegister(register.Addrs(s.Addr())) if err := r.Init(); err != nil { t.Fatal(err) } if err := r.Connect(ctx); err != nil { t.Fatal(err) } defer func() { if err := r.Disconnect(ctx); err != nil { t.Fatal(err) } }() nodes := []*register.Node{ {ID: "1", Address: "11.22.33.44"}, } svc := ®ister.Service{Name: "test", Version: "1.2.0", Nodes: nodes} if err := r.Register(ctx, svc, register.RegisterTTL(500*time.Millisecond)); err != nil { t.Fatal(err) } svcs, err := r.LookupService(ctx, "test") if err != nil { t.Fatal(err) } else if len(svcs) == 0 { t.Fatalf("no services registered") } if svcs[0].Name != "test" || svcs[0].Version != "1.2.0" { t.Fatalf("invalid service %#+v", svcs[0]) } if err := r.Deregister(ctx, svc); err != nil { t.Fatal(err) } svcs, err = r.LookupService(ctx, "test") if err == nil { t.Fatalf("service not deregistered") } else if len(svcs) != 0 { t.Fatalf("service not deregistered") } } func TestWatch(t *testing.T) { ctx := context.Background() s := miniredis.RunT(t) r := NewRegister(register.Addrs(s.Addr())) if err := r.Init(); err != nil { t.Fatal(err) } if err := r.Connect(ctx); err != nil { t.Fatal(err) } defer func() { if err := r.Disconnect(ctx); err != nil { t.Fatal(err) } }() w, err := r.Watch(ctx) if err != nil { t.Fatal(err) } defer w.Stop() cherr := make(chan error) go func() { for { res, err := w.Next() if err != nil { cherr <- err } if res.Action != register.EventCreate { cherr <- fmt.Errorf("invalid event %#+v", res) } if res.Service.Name != "test" { cherr <- fmt.Errorf("invalid event %#+v", res) } if res.Service.Version != "1.2.0" { cherr <- fmt.Errorf("invalid event %#+v", res) } if len(res.Service.Nodes) != 1 { cherr <- fmt.Errorf("invalid event %#+v", res) } if res.Service.Nodes[0].ID != "1" { cherr <- fmt.Errorf("invalid event %#+v", res) } if res.Service.Nodes[0].Address != "11.22.33.44" { cherr <- fmt.Errorf("invalid event %#+v", res) } cherr <- nil break } }() nodes := []*register.Node{ {ID: "1", Address: "11.22.33.44"}, } go func() { for { svc := ®ister.Service{Name: "test", Version: "1.2.0", Nodes: nodes} if err := r.Register(ctx, svc, register.RegisterTTL(500*time.Millisecond)); err != nil { cherr <- err } time.Sleep(300 * time.Millisecond) } }() if err = <-cherr; err != nil { t.Fatal(err) } }