package zk
import (
"bytes"
"testing"
"time"
stdzk "github.com/samuel/go-zookeeper/zk"
"github.com/go-kit/kit/log"
)
func TestNewClient(t *testing.T) {
var (
acl = stdzk.WorldACL(stdzk.PermRead)
connectTimeout = 3 * time.Second
sessionTimeout = 20 * time.Second
payload = [][]byte{[]byte("Payload"), []byte("Test")}
)
c, err := NewClient(
[]string{"FailThisInvalidHost!!!"},
log.NewNopLogger(),
)
if err == nil {
t.Errorf("expected error, got nil")
}
hasFired := false
calledEventHandler := make(chan struct{})
eventHandler := func(event stdzk.Event) {
if !hasFired {
// test is successful if this function has fired at least once
hasFired = true
close(calledEventHandler)
}
}
c, err = NewClient(
[]string{"localhost"},
log.NewNopLogger(),
ACL(acl),
ConnectTimeout(connectTimeout),
SessionTimeout(sessionTimeout),
Payload(payload),
EventHandler(eventHandler),
)
if err != nil {
t.Fatal(err)
}
defer c.Stop()
clientImpl, ok := c.(*client)
if !ok {
t.Fatal("retrieved incorrect Client implementation")
}
if want, have := acl, clientImpl.acl; want[0] != have[0] {
t.Errorf("want %+v, have %+v", want, have)
}
if want, have := connectTimeout, clientImpl.connectTimeout; want != have {
t.Errorf("want %d, have %d", want, have)
}
if want, have := sessionTimeout, clientImpl.sessionTimeout; want != have {
t.Errorf("want %d, have %d", want, have)
}
if want, have := payload, clientImpl.rootNodePayload; bytes.Compare(want[0], have[0]) != 0 || bytes.Compare(want[1], have[1]) != 0 {
t.Errorf("want %s, have %s", want, have)
}
select {
case <-calledEventHandler:
case <-time.After(100 * time.Millisecond):
t.Errorf("event handler never called")
}
}
func TestOptions(t *testing.T) {
_, err := NewClient([]string{"localhost"}, log.NewNopLogger(), Credentials("valid", "credentials"))
if err != nil && err != stdzk.ErrNoServer {
t.Errorf("unexpected error: %v", err)
}
_, err = NewClient([]string{"localhost"}, log.NewNopLogger(), Credentials("nopass", ""))
if want, have := err, ErrInvalidCredentials; want != have {
t.Errorf("want %v, have %v", want, have)
}
_, err = NewClient([]string{"localhost"}, log.NewNopLogger(), ConnectTimeout(0))
if err == nil {
t.Errorf("expected connect timeout error")
}
_, err = NewClient([]string{"localhost"}, log.NewNopLogger(), SessionTimeout(0))
if err == nil {
t.Errorf("expected connect timeout error")
}
}
func TestCreateParentNodes(t *testing.T) {
payload := [][]byte{[]byte("Payload"), []byte("Test")}
c, err := NewClient([]string{"localhost:65500"}, log.NewNopLogger())
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if c == nil {
t.Fatal("expected new Client, got nil")
}
s, err := NewInstancer(c, "/validpath", log.NewNopLogger())
if err != stdzk.ErrNoServer {
t.Errorf("unexpected error: %v", err)
}
if s != nil {
t.Error("expected failed new Instancer")
}
s, err = NewInstancer(c, "invalidpath", log.NewNopLogger())
if err != stdzk.ErrInvalidPath {
t.Errorf("unexpected error: %v", err)
}
_, _, err = c.GetEntries("/validpath")
if err != stdzk.ErrNoServer {
t.Errorf("unexpected error: %v", err)
}
c.Stop()
err = c.CreateParentNodes("/validpath")
if err != ErrClientClosed {
t.Errorf("unexpected error: %v", err)
}
s, err = NewInstancer(c, "/validpath", log.NewNopLogger())
if err != ErrClientClosed {
t.Errorf("unexpected error: %v", err)
}
if s != nil {
t.Error("expected failed new Instancer")
}
c, err = NewClient([]string{"localhost:65500"}, log.NewNopLogger(), Payload(payload))
if err != nil {
t.Errorf("unexpected error: %v", err)
}
if c == nil {
t.Fatal("expected new Client, got nil")
}
s, err = NewInstancer(c, "/validpath", log.NewNopLogger())
if err != stdzk.ErrNoServer {
t.Errorf("unexpected error: %v", err)
}
if s != nil {
t.Error("expected failed new Instancer")
}
}