Github user cammckenzie commented on a diff in the pull request: https://github.com/apache/curator/pull/252#discussion_r169528858 --- Diff: curator-framework/src/test/java/org/apache/curator/framework/ensemble/TestEnsembleProvider.java --- @@ -0,0 +1,162 @@ +/** + * 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.curator.framework.ensemble; + +import org.apache.curator.ensemble.EnsembleProvider; +import org.apache.curator.framework.CuratorFramework; +import org.apache.curator.framework.CuratorFrameworkFactory; +import org.apache.curator.framework.state.ConnectionState; +import org.apache.curator.framework.state.ConnectionStateListener; +import org.apache.curator.retry.RetryOneTime; +import org.apache.curator.test.BaseClassForTests; +import org.apache.curator.test.TestingServer; +import org.apache.curator.test.Timing; +import org.apache.curator.utils.CloseableUtils; +import org.testng.Assert; +import org.testng.annotations.Test; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +public class TestEnsembleProvider extends BaseClassForTests +{ + private final Timing timing = new Timing(); + + @Test + public void testBasic() + { + Semaphore counter = new Semaphore(0); + final CuratorFramework client = newClient(counter); + try + { + client.start(); + Assert.assertTrue(timing.acquireSemaphore(counter)); + } + finally + { + CloseableUtils.closeQuietly(client); + } + } + + @Test + public void testAfterSessionExpiration() throws Exception + { + TestingServer oldServer = server; + Semaphore counter = new Semaphore(0); + final CuratorFramework client = newClient(counter); + try + { + client.start(); + + final CountDownLatch connectedLatch = new CountDownLatch(1); + final CountDownLatch lostLatch = new CountDownLatch(1); + final CountDownLatch reconnectedLatch = new CountDownLatch(1); + ConnectionStateListener listener = new ConnectionStateListener() + { + @Override + public void stateChanged(CuratorFramework client, ConnectionState newState) + { + if ( newState == ConnectionState.CONNECTED ) + { + connectedLatch.countDown(); + } + if ( newState == ConnectionState.LOST ) + { + lostLatch.countDown(); + } + if ( newState == ConnectionState.RECONNECTED ) + { + reconnectedLatch.countDown(); + } + } + }; + client.getConnectionStateListenable().addListener(listener); --- End diff -- Is there a potential race condition here? Can't the connected event come before the listener is added as the client is started prior to the listener being added?
---