1package zk 2 3import ( 4 "bytes" 5 "testing" 6 "time" 7 8 stdzk "github.com/samuel/go-zookeeper/zk" 9 10 "github.com/go-kit/kit/log" 11) 12 13func TestNewClient(t *testing.T) { 14 var ( 15 acl = stdzk.WorldACL(stdzk.PermRead) 16 connectTimeout = 3 * time.Second 17 sessionTimeout = 20 * time.Second 18 payload = [][]byte{[]byte("Payload"), []byte("Test")} 19 ) 20 21 c, err := NewClient( 22 []string{"FailThisInvalidHost!!!"}, 23 log.NewNopLogger(), 24 ) 25 if err == nil { 26 t.Errorf("expected error, got nil") 27 } 28 29 hasFired := false 30 calledEventHandler := make(chan struct{}) 31 eventHandler := func(event stdzk.Event) { 32 if !hasFired { 33 // test is successful if this function has fired at least once 34 hasFired = true 35 close(calledEventHandler) 36 } 37 } 38 39 c, err = NewClient( 40 []string{"localhost"}, 41 log.NewNopLogger(), 42 ACL(acl), 43 ConnectTimeout(connectTimeout), 44 SessionTimeout(sessionTimeout), 45 Payload(payload), 46 EventHandler(eventHandler), 47 ) 48 if err != nil { 49 t.Fatal(err) 50 } 51 defer c.Stop() 52 53 clientImpl, ok := c.(*client) 54 if !ok { 55 t.Fatal("retrieved incorrect Client implementation") 56 } 57 if want, have := acl, clientImpl.acl; want[0] != have[0] { 58 t.Errorf("want %+v, have %+v", want, have) 59 } 60 if want, have := connectTimeout, clientImpl.connectTimeout; want != have { 61 t.Errorf("want %d, have %d", want, have) 62 } 63 if want, have := sessionTimeout, clientImpl.sessionTimeout; want != have { 64 t.Errorf("want %d, have %d", want, have) 65 } 66 if want, have := payload, clientImpl.rootNodePayload; bytes.Compare(want[0], have[0]) != 0 || bytes.Compare(want[1], have[1]) != 0 { 67 t.Errorf("want %s, have %s", want, have) 68 } 69 70 select { 71 case <-calledEventHandler: 72 case <-time.After(100 * time.Millisecond): 73 t.Errorf("event handler never called") 74 } 75} 76 77func TestOptions(t *testing.T) { 78 _, err := NewClient([]string{"localhost"}, log.NewNopLogger(), Credentials("valid", "credentials")) 79 if err != nil && err != stdzk.ErrNoServer { 80 t.Errorf("unexpected error: %v", err) 81 } 82 83 _, err = NewClient([]string{"localhost"}, log.NewNopLogger(), Credentials("nopass", "")) 84 if want, have := err, ErrInvalidCredentials; want != have { 85 t.Errorf("want %v, have %v", want, have) 86 } 87 88 _, err = NewClient([]string{"localhost"}, log.NewNopLogger(), ConnectTimeout(0)) 89 if err == nil { 90 t.Errorf("expected connect timeout error") 91 } 92 93 _, err = NewClient([]string{"localhost"}, log.NewNopLogger(), SessionTimeout(0)) 94 if err == nil { 95 t.Errorf("expected connect timeout error") 96 } 97} 98 99func TestCreateParentNodes(t *testing.T) { 100 payload := [][]byte{[]byte("Payload"), []byte("Test")} 101 102 c, err := NewClient([]string{"localhost:65500"}, log.NewNopLogger()) 103 if err != nil { 104 t.Errorf("unexpected error: %v", err) 105 } 106 if c == nil { 107 t.Fatal("expected new Client, got nil") 108 } 109 110 s, err := NewInstancer(c, "/validpath", log.NewNopLogger()) 111 if err != stdzk.ErrNoServer { 112 t.Errorf("unexpected error: %v", err) 113 } 114 if s != nil { 115 t.Error("expected failed new Instancer") 116 } 117 118 s, err = NewInstancer(c, "invalidpath", log.NewNopLogger()) 119 if err != stdzk.ErrInvalidPath { 120 t.Errorf("unexpected error: %v", err) 121 } 122 _, _, err = c.GetEntries("/validpath") 123 if err != stdzk.ErrNoServer { 124 t.Errorf("unexpected error: %v", err) 125 } 126 127 c.Stop() 128 129 err = c.CreateParentNodes("/validpath") 130 if err != ErrClientClosed { 131 t.Errorf("unexpected error: %v", err) 132 } 133 134 s, err = NewInstancer(c, "/validpath", log.NewNopLogger()) 135 if err != ErrClientClosed { 136 t.Errorf("unexpected error: %v", err) 137 } 138 if s != nil { 139 t.Error("expected failed new Instancer") 140 } 141 142 c, err = NewClient([]string{"localhost:65500"}, log.NewNopLogger(), Payload(payload)) 143 if err != nil { 144 t.Errorf("unexpected error: %v", err) 145 } 146 if c == nil { 147 t.Fatal("expected new Client, got nil") 148 } 149 150 s, err = NewInstancer(c, "/validpath", log.NewNopLogger()) 151 if err != stdzk.ErrNoServer { 152 t.Errorf("unexpected error: %v", err) 153 } 154 if s != nil { 155 t.Error("expected failed new Instancer") 156 } 157} 158