Пример #1
0
        public void testChrootedWatchReestablishment()
        {
            string chroot = "/" + Guid.NewGuid() + "watchtest";

            using (ZooKeeper zk1 = CreateClient())
            {
                Assert.AreEqual(chroot, zk1.Create(chroot, null, Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent));
            }

            ZooKeeper zk      = CreateClient(chroot);
            MyWatcher watcher = new MyWatcher();

            string name = "/watchtest";

            zk.GetChildren("/", watcher);
            zk.Create(name, null, Ids.OPEN_ACL_UNSAFE, CreateMode.Ephemeral);

            WatchedEvent @event;

            Assert.IsTrue(watcher.events.TryTake(out @event, TimeSpan.FromSeconds(3d)));
            Assert.AreEqual("/", @event.Path);
            Assert.AreEqual(EventType.NodeChildrenChanged, @event.Type);
            Assert.AreEqual(KeeperState.SyncConnected, @event.State);

            zk.GetChildren("/", watcher);

            ClientConnection cnxn = (ClientConnection)zk.GetType().GetField("cnxn", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(zk);
            ClientConnectionRequestProducer producer = (ClientConnectionRequestProducer)cnxn.GetType().GetField("producer", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(cnxn);
            TcpClient client = (TcpClient)producer.GetType().GetField("client", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(producer);

            client.Close();
            Thread.Sleep(100);

            zk.Delete(name, -1);

            Assert.IsTrue(watcher.events.TryTake(out @event, TimeSpan.FromSeconds(3d)));
            Assert.AreEqual("/", @event.Path);
            Assert.AreEqual(EventType.NodeChildrenChanged, @event.Type);
            Assert.AreEqual(KeeperState.SyncConnected, @event.State);

            Assert.AreEqual(0, watcher.events.Count);
        }