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?
---