This is an automated email from the ASF dual-hosted git repository.
andor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new f0f75d8 ZOOKEEPER-3269: Add queueEvent to the Testable facade
f0f75d8 is described below
commit f0f75d81087a2140e7f150bbb45a9fcec3d6644b
Author: randgalt <[email protected]>
AuthorDate: Wed Feb 6 09:46:37 2019 +0100
ZOOKEEPER-3269: Add queueEvent to the Testable facade
Add queueEvent to the Testable facade to enabled inserting events into the
clients queue.
For testing and other reasons it would be very useful to add a way to
inject an event into ZooKeeper's event queue. ZooKeeper already has the
Testable for features such as this (low level, backdoor, testing, etc.). This
queueEvent method would be particularly helpful to Apache Curator and we'd very
much appreciate its inclusion.
Author: randgalt <[email protected]>
Reviewers: [email protected]
Closes #799 from Randgalt/ZOOKEEPER-3269 and squashes the following commits:
0e3ab80a0 [randgalt] ZOOKEEPER-3269 - use explicit imports
f77574be1 [randgalt] ZOOKEEPER-3269 remove IDE introduced spacing changes
8b5222daf [randgalt] ZOOKEEPER-3269
---
.../main/java/org/apache/zookeeper/Testable.java | 7 ++++++
.../main/java/org/apache/zookeeper/ZooKeeper.java | 2 +-
.../org/apache/zookeeper/ZooKeeperTestable.java | 10 ++++++---
.../apache/zookeeper/test/SessionTimeoutTest.java | 25 +++++++++++++++++++---
4 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/Testable.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/Testable.java
index b38d2c3..023f525 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/Testable.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/Testable.java
@@ -26,4 +26,11 @@ public interface Testable {
* Cause the ZooKeeper instance to behave as if the session expired
*/
void injectSessionExpiration();
+
+ /**
+ * Allow an event to be inserted into the event queue
+ *
+ * @param event event to insert
+ */
+ void queueEvent(WatchedEvent event);
}
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
index 6b1d627..2746f76 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeper.java
@@ -1236,7 +1236,7 @@ public class ZooKeeper implements AutoCloseable {
// VisibleForTesting
public Testable getTestable() {
- return new ZooKeeperTestable(this, cnxn);
+ return new ZooKeeperTestable(cnxn);
}
/* Useful for testing watch handling behavior */
diff --git
a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeperTestable.java
b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeperTestable.java
index 873615b..f457432 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeperTestable.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZooKeeperTestable.java
@@ -25,11 +25,9 @@ class ZooKeeperTestable implements Testable {
private static final Logger LOG = LoggerFactory
.getLogger(ZooKeeperTestable.class);
- private final ZooKeeper zooKeeper;
private final ClientCnxn clientCnxn;
- ZooKeeperTestable(ZooKeeper zooKeeper, ClientCnxn clientCnxn) {
- this.zooKeeper = zooKeeper;
+ ZooKeeperTestable(ClientCnxn clientCnxn) {
this.clientCnxn = clientCnxn;
}
@@ -44,4 +42,10 @@ class ZooKeeperTestable implements Testable {
clientCnxn.state = ZooKeeper.States.CLOSED;
clientCnxn.sendThread.getClientCnxnSocket().onClosing();
}
+
+ @Override
+ public void queueEvent(WatchedEvent event) {
+ LOG.info("queueEvent() called: {}", event);
+ clientCnxn.eventThread.queueEvent(event);
+ }
}
diff --git
a/zookeeper-server/src/test/java/org/apache/zookeeper/test/SessionTimeoutTest.java
b/zookeeper-server/src/test/java/org/apache/zookeeper/test/SessionTimeoutTest.java
index 09badae..f3b3e5d 100644
---
a/zookeeper-server/src/test/java/org/apache/zookeeper/test/SessionTimeoutTest.java
+++
b/zookeeper-server/src/test/java/org/apache/zookeeper/test/SessionTimeoutTest.java
@@ -24,15 +24,12 @@ import org.apache.zookeeper.TestableZooKeeper;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.data.Stat;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -79,6 +76,28 @@ public class SessionTimeoutTest extends ClientBase {
Assert.assertTrue(gotException);
}
+ @Test
+ public void testQueueEvent() throws InterruptedException,
+ KeeperException {
+ final CountDownLatch eventLatch = new CountDownLatch(1);
+ Watcher watcher = new Watcher() {
+ @Override
+ public void process(WatchedEvent event) {
+ if ( event.getType() == Event.EventType.NodeDataChanged ) {
+ if ( event.getPath().equals("/foo/bar") ) {
+ eventLatch.countDown();
+ }
+ }
+ }
+ };
+ zk.exists("/foo/bar", watcher);
+
+ WatchedEvent event = new
WatchedEvent(Watcher.Event.EventType.NodeDataChanged,
+ Watcher.Event.KeeperState.SyncConnected, "/foo/bar");
+ zk.getTestable().queueEvent(event);
+ Assert.assertTrue(eventLatch.await(5, TimeUnit.SECONDS));
+ }
+
/**
* Make sure ephemerals get cleaned up when session disconnects.
*/