Github user anmolnar commented on a diff in the pull request:
https://github.com/apache/zookeeper/pull/529#discussion_r196712402
--- Diff: src/java/test/org/apache/zookeeper/test/WatcherTest.java ---
@@ -140,6 +142,55 @@ public void processResult(int rc, String path, Object
ctx) {
}
}
}
+
+ @Test
+ public void testWatcherDisconnectOnClose()
+ throws IOException, InterruptedException, KeeperException
+ {
+ ZooKeeper zk = null;
+ try {
+ final BlockingQueue<WatchedEvent> queue = new
LinkedBlockingQueue<>();
+
+ MyWatcher connWatcher = new MyWatcher();
+
+ Watcher watcher = new Watcher(){
+ @Override
+ public void process(WatchedEvent event) {
+ try {
+ queue.put(event);
+ } catch (InterruptedException e) {
+ // Oh well, never mind
+ }
+ }
+
+ };
+
+ zk = createClient(connWatcher, hostPort);
+
+ StatCallback scb = new StatCallback() {
+ public void processResult(int rc, String path, Object ctx,
+ Stat stat) {
+ // don't do anything
+ }
+ };
+
+ // Register a watch on the node
+ zk.exists("/missing", watcher, scb, null);
+
+ // Close the client without changing the node
+ zk.close();
+
+
+ WatchedEvent event = queue.poll(10, TimeUnit.SECONDS);
+ Assert.assertEquals(Event.EventType.None, event.getType());
--- End diff --
When your patch isn't applied, the watcher won't receive any event and
timeout occurs. Resulting in `event == null` and test will get
NullReferenceException. Would you please assert for null ref and also add some
meaningful messages to the assert statements which indicate what exactly went
wrong and what should be the expected behaviour.
---