package etcdv3
import (
"bytes"
"errors"
"testing"
"github.com/go-kit/kit/log"
)
// testClient is a basic implementation of Client
type testClient struct {
registerRes error // value returned when Register or Deregister is called
}
func (tc *testClient) GetEntries(prefix string) ([]string, error) {
return nil, nil
}
func (tc *testClient) WatchPrefix(prefix string, ch chan struct{}) {
}
func (tc *testClient) Register(s Service) error {
return tc.registerRes
}
func (tc *testClient) Deregister(s Service) error {
return tc.registerRes
}
func (tc *testClient) LeaseID() int64 {
return 0
}
// default service used to build registrar in our tests
var testService = Service{
Key: "testKey",
Value: "testValue",
TTL: nil,
}
// NewRegistar should return a registar with a logger using the service key and value
func TestNewRegistar(t *testing.T) {
c := Client(&testClient{nil})
buf := &bytes.Buffer{}
logger := log.NewLogfmtLogger(buf)
r := NewRegistrar(
c,
testService,
logger,
)
if err := r.logger.Log("msg", "message"); err != nil {
t.Fatal(err)
}
if want, have := "key=testKey value=testValue msg=message\n", buf.String(); want != have {
t.Errorf("\nwant: %shave: %s", want, have)
}
}
func TestRegister(t *testing.T) {
// Register log the error returned by the client or log the successful registration action
// table of test cases for method Register
var registerTestTable = []struct {
registerRes error // value returned by the client on calls to Register
log string // expected log by the registrar
}{
// test case: an error is returned by the client
{errors.New("regError"), "key=testKey value=testValue err=regError\n"},
// test case: registration successful
{nil, "key=testKey value=testValue action=register\n"},
}
for _, tc := range registerTestTable {
c := Client(&testClient{tc.registerRes})
buf := &bytes.Buffer{}
logger := log.NewLogfmtLogger(buf)
r := NewRegistrar(
c,
testService,
logger,
)
r.Register()
if want, have := tc.log, buf.String(); want != have {
t.Fatalf("want %v, have %v", want, have)
}
}
}
func TestDeregister(t *testing.T) {
// Deregister log the error returned by the client or log the successful deregistration action
// table of test cases for method Deregister
var deregisterTestTable = []struct {
deregisterRes error // value returned by the client on calls to Deregister
log string // expected log by the registrar
}{
// test case: an error is returned by the client
{errors.New("deregError"), "key=testKey value=testValue err=deregError\n"},
// test case: deregistration successful
{nil, "key=testKey value=testValue action=deregister\n"},
}
for _, tc := range deregisterTestTable {
c := Client(&testClient{tc.deregisterRes})
buf := &bytes.Buffer{}
logger := log.NewLogfmtLogger(buf)
r := NewRegistrar(
c,
testService,
logger,
)
r.Deregister()
if want, have := tc.log, buf.String(); want != have {
t.Fatalf("want %v, have %v", want, have)
}
}
}