service/library/consul/client_test.go

147 lines
3.1 KiB
Go
Raw Permalink Normal View History

2024-05-09 19:06:37 +08:00
package consul
import (
"errors"
"reflect"
"testing"
stdconsul "github.com/hashicorp/consul/api"
)
func TestClientRegistration(t *testing.T) {
c := newTestClient(nil)
services, _, err := c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{})
if err != nil {
t.Error(err)
}
if want, have := 0, len(services); want != have {
t.Errorf("want %d, have %d", want, have)
}
if err := c.Register(testRegistration); err != nil {
t.Error(err)
}
if err := c.Register(testRegistration); err == nil {
t.Errorf("want error, have %v", err)
}
services, _, err = c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{})
if err != nil {
t.Error(err)
}
if want, have := 1, len(services); want != have {
t.Errorf("want %d, have %d", want, have)
}
if err := c.Deregister(testRegistration); err != nil {
t.Error(err)
}
if err := c.Deregister(testRegistration); err == nil {
t.Errorf("want error, have %v", err)
}
services, _, err = c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{})
if err != nil {
t.Error(err)
}
if want, have := 0, len(services); want != have {
t.Errorf("want %d, have %d", want, have)
}
}
type testClient struct {
entries []*stdconsul.ServiceEntry
}
func newTestClient(entries []*stdconsul.ServiceEntry) *testClient {
return &testClient{
entries: entries,
}
}
var _ Client = &testClient{}
func (c *testClient) Service(service, tag string, _ bool, opts *stdconsul.QueryOptions) ([]*stdconsul.ServiceEntry, *stdconsul.QueryMeta, error) {
var results []*stdconsul.ServiceEntry
for _, entry := range c.entries {
if entry.Service.Service != service {
continue
}
if tag != "" {
tagMap := map[string]struct{}{}
for _, t := range entry.Service.Tags {
tagMap[t] = struct{}{}
}
if _, ok := tagMap[tag]; !ok {
continue
}
}
results = append(results, entry)
}
return results, &stdconsul.QueryMeta{LastIndex: opts.WaitIndex}, nil
}
func (c *testClient) Register(r *stdconsul.AgentServiceRegistration) error {
toAdd := registration2entry(r)
for _, entry := range c.entries {
if reflect.DeepEqual(*entry, *toAdd) {
return errors.New("duplicate")
}
}
c.entries = append(c.entries, toAdd)
return nil
}
func (c *testClient) Deregister(r *stdconsul.AgentServiceRegistration) error {
toDelete := registration2entry(r)
var newEntries []*stdconsul.ServiceEntry
for _, entry := range c.entries {
if reflect.DeepEqual(*entry, *toDelete) {
continue
}
newEntries = append(newEntries, entry)
}
if len(newEntries) == len(c.entries) {
return errors.New("not found")
}
c.entries = newEntries
return nil
}
func registration2entry(r *stdconsul.AgentServiceRegistration) *stdconsul.ServiceEntry {
return &stdconsul.ServiceEntry{
Node: &stdconsul.Node{
Node: "some-node",
Address: r.Address,
},
Service: &stdconsul.AgentService{
ID: r.ID,
Service: r.Name,
Tags: r.Tags,
Port: r.Port,
Address: r.Address,
},
// Checks ignored
}
}
var testRegistration = &stdconsul.AgentServiceRegistration{
ID: "my-id",
Name: "my-name",
Tags: []string{"my-tag-1", "my-tag-2"},
Port: 12345,
Address: "my-address",
}