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?


---

Reply via email to