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  }