10 stdconsul "github.com/hashicorp/consul/api"
12 "github.com/go-kit/kit/endpoint"
15 func TestClientRegistration(t *testing.T) {
16 c := newTestClient(nil)
18 services, _, err := c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{})
22 if want, have := 0, len(services); want != have {
23 t.Errorf("want %d, have %d", want, have)
26 if err := c.Register(testRegistration); err != nil {
30 if err := c.Register(testRegistration); err == nil {
31 t.Errorf("want error, have %v", err)
34 services, _, err = c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{})
38 if want, have := 1, len(services); want != have {
39 t.Errorf("want %d, have %d", want, have)
42 if err := c.Deregister(testRegistration); err != nil {
46 if err := c.Deregister(testRegistration); err == nil {
47 t.Errorf("want error, have %v", err)
50 services, _, err = c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{})
54 if want, have := 0, len(services); want != have {
55 t.Errorf("want %d, have %d", want, have)
59 type testClient struct {
60 entries []*stdconsul.ServiceEntry
63 func newTestClient(entries []*stdconsul.ServiceEntry) *testClient {
69 var _ Client = &testClient{}
71 func (c *testClient) Service(service, tag string, _ bool, opts *stdconsul.QueryOptions) ([]*stdconsul.ServiceEntry, *stdconsul.QueryMeta, error) {
72 var results []*stdconsul.ServiceEntry
74 for _, entry := range c.entries {
75 if entry.Service.Service != service {
79 tagMap := map[string]struct{}{}
81 for _, t := range entry.Service.Tags {
82 tagMap[t] = struct{}{}
85 if _, ok := tagMap[tag]; !ok {
90 results = append(results, entry)
93 return results, &stdconsul.QueryMeta{}, nil
96 func (c *testClient) Register(r *stdconsul.AgentServiceRegistration) error {
97 toAdd := registration2entry(r)
99 for _, entry := range c.entries {
100 if reflect.DeepEqual(*entry, *toAdd) {
101 return errors.New("duplicate")
105 c.entries = append(c.entries, toAdd)
109 func (c *testClient) Deregister(r *stdconsul.AgentServiceRegistration) error {
110 toDelete := registration2entry(r)
112 var newEntries []*stdconsul.ServiceEntry
113 for _, entry := range c.entries {
114 if reflect.DeepEqual(*entry, *toDelete) {
117 newEntries = append(newEntries, entry)
119 if len(newEntries) == len(c.entries) {
120 return errors.New("not found")
123 c.entries = newEntries
127 func registration2entry(r *stdconsul.AgentServiceRegistration) *stdconsul.ServiceEntry {
128 return &stdconsul.ServiceEntry{
129 Node: &stdconsul.Node{
133 Service: &stdconsul.AgentService{
144 func testFactory(instance string) (endpoint.Endpoint, io.Closer, error) {
145 return func(context.Context, interface{}) (interface{}, error) {
150 var testRegistration = &stdconsul.AgentServiceRegistration{
153 Tags: []string{"my-tag-1", "my-tag-2"},
155 Address: "my-address",