github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/ngaut/go-zookeeper/zk/zk_test.go (about) 1 package zk 2 3 import ( 4 "testing" 5 "time" 6 ) 7 8 func TestCreate(t *testing.T) { 9 ts, err := StartTestCluster(1) 10 if err != nil { 11 t.Fatal(err) 12 } 13 defer ts.Stop() 14 zk, err := ts.ConnectAll() 15 if err != nil { 16 t.Fatalf("Connect returned error: %+v", err) 17 } 18 defer zk.Close() 19 20 path := "/gozk-test" 21 22 if err := zk.Delete(path, -1); err != nil && err != ErrNoNode { 23 t.Fatalf("Delete returned error: %+v", err) 24 } 25 if p, err := zk.Create(path, []byte{1, 2, 3, 4}, 0, WorldACL(PermAll)); err != nil { 26 t.Fatalf("Create returned error: %+v", err) 27 } else if p != path { 28 t.Fatalf("Create returned different path '%s' != '%s'", p, path) 29 } 30 if data, stat, err := zk.Get(path); err != nil { 31 t.Fatalf("Get returned error: %+v", err) 32 } else if stat == nil { 33 t.Fatal("Get returned nil stat") 34 } else if len(data) < 4 { 35 t.Fatal("Get returned wrong size data") 36 } 37 } 38 39 func TestMulti(t *testing.T) { 40 ts, err := StartTestCluster(1) 41 if err != nil { 42 t.Fatal(err) 43 } 44 defer ts.Stop() 45 zk, err := ts.ConnectAll() 46 if err != nil { 47 t.Fatalf("Connect returned error: %+v", err) 48 } 49 defer zk.Close() 50 51 path := "/gozk-test" 52 53 if err := zk.Delete(path, -1); err != nil && err != ErrNoNode { 54 t.Fatalf("Delete returned error: %+v", err) 55 } 56 ops := MultiOps{ 57 Create: []CreateRequest{ 58 {Path: path, Data: []byte{1, 2, 3, 4}, Acl: WorldACL(PermAll)}, 59 }, 60 SetData: []SetDataRequest{ 61 {Path: path, Data: []byte{1, 2, 3, 4}, Version: -1}, 62 }, 63 // Delete: []DeleteRequest{ 64 // {Path: path, Version: -1}, 65 // }, 66 } 67 if err := zk.Multi(ops); err != nil { 68 t.Fatalf("Multi returned error: %+v", err) 69 } 70 if data, stat, err := zk.Get(path); err != nil { 71 t.Fatalf("Get returned error: %+v", err) 72 } else if stat == nil { 73 t.Fatal("Get returned nil stat") 74 } else if len(data) < 4 { 75 t.Fatal("Get returned wrong size data") 76 } 77 } 78 79 func TestGetSetACL(t *testing.T) { 80 ts, err := StartTestCluster(1) 81 if err != nil { 82 t.Fatal(err) 83 } 84 defer ts.Stop() 85 zk, err := ts.ConnectAll() 86 if err != nil { 87 t.Fatalf("Connect returned error: %+v", err) 88 } 89 defer zk.Close() 90 91 if err := zk.AddAuth("digest", []byte("blah")); err != nil { 92 t.Fatalf("AddAuth returned error %+v", err) 93 } 94 95 path := "/gozk-test" 96 97 if err := zk.Delete(path, -1); err != nil && err != ErrNoNode { 98 t.Fatalf("Delete returned error: %+v", err) 99 } 100 if path, err := zk.Create(path, []byte{1, 2, 3, 4}, 0, WorldACL(PermAll)); err != nil { 101 t.Fatalf("Create returned error: %+v", err) 102 } else if path != "/gozk-test" { 103 t.Fatalf("Create returned different path '%s' != '/gozk-test'", path) 104 } 105 106 expected := WorldACL(PermAll) 107 108 if acl, stat, err := zk.GetACL(path); err != nil { 109 t.Fatalf("GetACL returned error %+v", err) 110 } else if stat == nil { 111 t.Fatalf("GetACL returned nil Stat") 112 } else if len(acl) != 1 || expected[0] != acl[0] { 113 t.Fatalf("GetACL mismatch expected %+v instead of %+v", expected, acl) 114 } 115 116 expected = []ACL{{PermAll, "ip", "127.0.0.1"}} 117 118 if stat, err := zk.SetACL(path, expected, -1); err != nil { 119 t.Fatalf("SetACL returned error %+v", err) 120 } else if stat == nil { 121 t.Fatalf("SetACL returned nil Stat") 122 } 123 124 if acl, stat, err := zk.GetACL(path); err != nil { 125 t.Fatalf("GetACL returned error %+v", err) 126 } else if stat == nil { 127 t.Fatalf("GetACL returned nil Stat") 128 } else if len(acl) != 1 || expected[0] != acl[0] { 129 t.Fatalf("GetACL mismatch expected %+v instead of %+v", expected, acl) 130 } 131 } 132 133 func TestAuth(t *testing.T) { 134 ts, err := StartTestCluster(1) 135 if err != nil { 136 t.Fatal(err) 137 } 138 defer ts.Stop() 139 zk, err := ts.ConnectAll() 140 if err != nil { 141 t.Fatalf("Connect returned error: %+v", err) 142 } 143 defer zk.Close() 144 145 path := "/gozk-digest-test" 146 if err := zk.Delete(path, -1); err != nil && err != ErrNoNode { 147 t.Fatalf("Delete returned error: %+v", err) 148 } 149 150 acl := DigestACL(PermAll, "user", "password") 151 152 if p, err := zk.Create(path, []byte{1, 2, 3, 4}, 0, acl); err != nil { 153 t.Fatalf("Create returned error: %+v", err) 154 } else if p != path { 155 t.Fatalf("Create returned different path '%s' != '%s'", p, path) 156 } 157 158 if a, stat, err := zk.GetACL(path); err != nil { 159 t.Fatalf("GetACL returned error %+v", err) 160 } else if stat == nil { 161 t.Fatalf("GetACL returned nil Stat") 162 } else if len(a) != 1 || acl[0] != a[0] { 163 t.Fatalf("GetACL mismatch expected %+v instead of %+v", acl, a) 164 } 165 166 if _, _, err := zk.Get(path); err != ErrNoAuth { 167 t.Fatalf("Get returned error %+v instead of ErrNoAuth", err) 168 } 169 170 if err := zk.AddAuth("digest", []byte("user:password")); err != nil { 171 t.Fatalf("AddAuth returned error %+v", err) 172 } 173 174 if data, stat, err := zk.Get(path); err != nil { 175 t.Fatalf("Get returned error %+v", err) 176 } else if stat == nil { 177 t.Fatalf("Get returned nil Stat") 178 } else if len(data) != 4 { 179 t.Fatalf("Get returned wrong data length") 180 } 181 } 182 183 func TestChildWatch(t *testing.T) { 184 ts, err := StartTestCluster(1) 185 if err != nil { 186 t.Fatal(err) 187 } 188 defer ts.Stop() 189 zk, err := ts.ConnectAll() 190 if err != nil { 191 t.Fatalf("Connect returned error: %+v", err) 192 } 193 defer zk.Close() 194 195 if err := zk.Delete("/gozk-test", -1); err != nil && err != ErrNoNode { 196 t.Fatalf("Delete returned error: %+v", err) 197 } 198 199 children, stat, childCh, err := zk.ChildrenW("/") 200 if err != nil { 201 t.Fatalf("Children returned error: %+v", err) 202 } else if stat == nil { 203 t.Fatal("Children returned nil stat") 204 } else if len(children) < 1 { 205 t.Fatal("Children should return at least 1 child") 206 } 207 208 if path, err := zk.Create("/gozk-test", []byte{1, 2, 3, 4}, 0, WorldACL(PermAll)); err != nil { 209 t.Fatalf("Create returned error: %+v", err) 210 } else if path != "/gozk-test" { 211 t.Fatalf("Create returned different path '%s' != '/gozk-test'", path) 212 } 213 214 select { 215 case ev := <-childCh: 216 if ev.Err != nil { 217 t.Fatalf("Child watcher error %+v", ev.Err) 218 } 219 if ev.Path != "/" { 220 t.Fatalf("Child watcher wrong path %s instead of %s", ev.Path, "/") 221 } 222 case _ = <-time.After(time.Second * 2): 223 t.Fatal("Child watcher timed out") 224 } 225 226 // Delete of the watched node should trigger the watch 227 228 children, stat, childCh, err = zk.ChildrenW("/gozk-test") 229 if err != nil { 230 t.Fatalf("Children returned error: %+v", err) 231 } else if stat == nil { 232 t.Fatal("Children returned nil stat") 233 } else if len(children) != 0 { 234 t.Fatal("Children should return 0 children") 235 } 236 237 if err := zk.Delete("/gozk-test", -1); err != nil && err != ErrNoNode { 238 t.Fatalf("Delete returned error: %+v", err) 239 } 240 241 select { 242 case ev := <-childCh: 243 if ev.Err != nil { 244 t.Fatalf("Child watcher error %+v", ev.Err) 245 } 246 if ev.Path != "/gozk-test" { 247 t.Fatalf("Child watcher wrong path %s instead of %s", ev.Path, "/") 248 } 249 case _ = <-time.After(time.Second * 2): 250 t.Fatal("Child watcher timed out") 251 } 252 } 253 254 func TestSetWatchers(t *testing.T) { 255 ts, err := StartTestCluster(1) 256 if err != nil { 257 t.Fatal(err) 258 } 259 defer ts.Stop() 260 zk, err := ts.ConnectAll() 261 if err != nil { 262 t.Fatalf("Connect returned error: %+v", err) 263 } 264 defer zk.Close() 265 266 zk.reconnectDelay = time.Second 267 268 zk2, err := ts.ConnectAll() 269 if err != nil { 270 t.Fatalf("Connect returned error: %+v", err) 271 } 272 defer zk2.Close() 273 274 if err := zk.Delete("/gozk-test", -1); err != nil && err != ErrNoNode { 275 t.Fatalf("Delete returned error: %+v", err) 276 } 277 278 testPath, err := zk.Create("/gozk-test-2", []byte{}, 0, WorldACL(PermAll)) 279 if err != nil { 280 t.Fatalf("Create returned: %+v", err) 281 } 282 283 _, _, testEvCh, err := zk.GetW(testPath) 284 if err != nil { 285 t.Fatalf("GetW returned: %+v", err) 286 } 287 288 children, stat, childCh, err := zk.ChildrenW("/") 289 if err != nil { 290 t.Fatalf("Children returned error: %+v", err) 291 } else if stat == nil { 292 t.Fatal("Children returned nil stat") 293 } else if len(children) < 1 { 294 t.Fatal("Children should return at least 1 child") 295 } 296 297 zk.conn.Close() 298 if err := zk2.Delete(testPath, -1); err != nil && err != ErrNoNode { 299 t.Fatalf("Delete returned error: %+v", err) 300 } 301 time.Sleep(time.Millisecond * 100) 302 303 if path, err := zk2.Create("/gozk-test", []byte{1, 2, 3, 4}, 0, WorldACL(PermAll)); err != nil { 304 t.Fatalf("Create returned error: %+v", err) 305 } else if path != "/gozk-test" { 306 t.Fatalf("Create returned different path '%s' != '/gozk-test'", path) 307 } 308 309 select { 310 case ev := <-testEvCh: 311 if ev.Err != nil { 312 t.Fatalf("GetW watcher error %+v", ev.Err) 313 } 314 if ev.Path != testPath { 315 t.Fatalf("GetW watcher wrong path %s instead of %s", ev.Path, testPath) 316 } 317 case <-time.After(2 * time.Second): 318 t.Fatal("GetW watcher timed out") 319 } 320 321 select { 322 case ev := <-childCh: 323 if ev.Err != nil { 324 t.Fatalf("Child watcher error %+v", ev.Err) 325 } 326 if ev.Path != "/" { 327 t.Fatalf("Child watcher wrong path %s instead of %s", ev.Path, "/") 328 } 329 case <-time.After(2 * time.Second): 330 t.Fatal("Child watcher timed out") 331 } 332 } 333 334 func TestExpiringWatch(t *testing.T) { 335 ts, err := StartTestCluster(1) 336 if err != nil { 337 t.Fatal(err) 338 } 339 defer ts.Stop() 340 zk, err := ts.ConnectAll() 341 if err != nil { 342 t.Fatalf("Connect returned error: %+v", err) 343 } 344 defer zk.Close() 345 346 if err := zk.Delete("/gozk-test", -1); err != nil && err != ErrNoNode { 347 t.Fatalf("Delete returned error: %+v", err) 348 } 349 350 children, stat, childCh, err := zk.ChildrenW("/") 351 if err != nil { 352 t.Fatalf("Children returned error: %+v", err) 353 } else if stat == nil { 354 t.Fatal("Children returned nil stat") 355 } else if len(children) < 1 { 356 t.Fatal("Children should return at least 1 child") 357 } 358 359 zk.sessionID = 99999 360 zk.conn.Close() 361 362 select { 363 case ev := <-childCh: 364 if ev.Err != ErrSessionExpired { 365 t.Fatalf("Child watcher error %+v instead of expected ErrSessionExpired", ev.Err) 366 } 367 if ev.Path != "/" { 368 t.Fatalf("Child watcher wrong path %s instead of %s", ev.Path, "/") 369 } 370 case <-time.After(2 * time.Second): 371 t.Fatal("Child watcher timed out") 372 } 373 } 374 375 func TestRequestFail(t *testing.T) { 376 // If connecting fails to all servers in the list then pending requests 377 // should be errored out so they don't hang forever. 378 379 zk, _, err := Connect([]string{"127.0.0.1:32444"}, time.Second*15) 380 if err != nil { 381 t.Fatal(err) 382 } 383 defer zk.Close() 384 385 ch := make(chan error) 386 go func() { 387 _, _, err := zk.Get("/blah") 388 ch <- err 389 }() 390 select { 391 case err := <-ch: 392 if err == nil { 393 t.Fatal("Expected non-nil error on failed request due to connection failure") 394 } 395 case <-time.After(time.Second * 2): 396 t.Fatal("Get hung when connection could not be made") 397 } 398 }