/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.zookeeper; import org.apache.zookeeper.test.ClientBase; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class ZooKeeperTestableTest extends ClientBase { @Test public void testSessionExpiration() throws IOException, InterruptedException, KeeperException { ZooKeeper zk = createClient(); final CountDownLatch expirationLatch = new CountDownLatch(1); Watcher watcher = new Watcher() { @Override public void process(WatchedEvent event) { if ( event.getState() == Event.KeeperState.Expired ) { expirationLatch.countDown(); } } }; zk.exists("/foo", watcher); zk.getTestable().injectSessionExpiration(); Assert.assertTrue(expirationLatch.await(5, TimeUnit.SECONDS)); boolean gotException = false; try { zk.exists("/foo", false); Assert.fail("Should have thrown a SessionExpiredException"); } catch (KeeperException.SessionExpiredException e) { // correct gotException = true; } Assert.assertTrue(gotException); } }