Codebase list golang-github-go-kit-kit / 0ad6191 loadbalancer / etcd / publisher_test.go
0ad6191

Tree @0ad6191 (Download .tar.gz)

publisher_test.go @0ad6191raw · history · blame

package etcd_test

import (
	"errors"
	"io"
	"testing"

	stdetcd "github.com/coreos/go-etcd/etcd"
	"golang.org/x/net/context"

	"github.com/go-kit/kit/endpoint"
	kitetcd "github.com/go-kit/kit/loadbalancer/etcd"
	"github.com/go-kit/kit/log"
)

var (
	node = &stdetcd.Node{
		Key: "/foo",
		Nodes: []*stdetcd.Node{
			{Key: "/foo/1", Value: "1:1"},
			{Key: "/foo/2", Value: "1:2"},
		},
	}
	fakeResponse = &stdetcd.Response{
		Node: node,
	}
)

func TestPublisher(t *testing.T) {
	var (
		logger = log.NewNopLogger()
		e      = func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil }
	)

	factory := func(string) (endpoint.Endpoint, io.Closer, error) {
		return e, nil, nil
	}

	client := &fakeClient{
		responses: map[string]*stdetcd.Response{"/foo": fakeResponse},
	}

	p, err := kitetcd.NewPublisher(client, "/foo", factory, logger)
	if err != nil {
		t.Fatalf("failed to create new publisher: %v", err)
	}
	defer p.Stop()

	if _, err := p.Endpoints(); err != nil {
		t.Fatal(err)
	}
}

func TestBadFactory(t *testing.T) {
	logger := log.NewNopLogger()

	factory := func(string) (endpoint.Endpoint, io.Closer, error) {
		return nil, nil, errors.New("kaboom")
	}

	client := &fakeClient{
		responses: map[string]*stdetcd.Response{"/foo": fakeResponse},
	}

	p, err := kitetcd.NewPublisher(client, "/foo", factory, logger)
	if err != nil {
		t.Fatalf("failed to create new publisher: %v", err)
	}
	defer p.Stop()

	endpoints, err := p.Endpoints()
	if err != nil {
		t.Fatal(err)
	}

	if want, have := 0, len(endpoints); want != have {
		t.Errorf("want %q, have %q", want, have)
	}
}

type fakeClient struct {
	responses map[string]*stdetcd.Response
}

func (c *fakeClient) GetEntries(prefix string) ([]string, error) {
	response, ok := c.responses[prefix]
	if !ok {
		return nil, errors.New("key not exist")
	}

	entries := make([]string, len(response.Node.Nodes))
	for i, node := range response.Node.Nodes {
		entries[i] = node.Value
	}
	return entries, nil
}

func (c *fakeClient) WatchPrefix(prefix string, responseChan chan *stdetcd.Response) {}