/**
  * Cleans up this.connections by removing any closed connections.
  *
  * @return a list of open connection ids.
  */
 private List<String> removeClosedConnectionsAndReturnOpenConnectionIds() {
   synchronized (this.connections) {
     List<String> openConnectionIds = new ArrayList<String>();
     Iterator<Entry<String, TcpConnectionSupport>> iterator =
         this.connections.entrySet().iterator();
     while (iterator.hasNext()) {
       Entry<String, TcpConnectionSupport> entry = iterator.next();
       TcpConnectionSupport connection = entry.getValue();
       if (!connection.isOpen()) {
         iterator.remove();
         if (logger.isDebugEnabled()) {
           logger.debug(
               getComponentName()
                   + ": Removed closed connection: "
                   + connection.getConnectionId());
         }
       } else {
         openConnectionIds.add(entry.getKey());
         if (logger.isTraceEnabled()) {
           logger.trace(
               getComponentName() + ": Connection is open: " + connection.getConnectionId());
         }
       }
     }
     return openConnectionIds;
   }
 }
 @Test
 public void testStop() throws Exception {
   AbstractClientConnectionFactory factory = mock(AbstractClientConnectionFactory.class);
   when(factory.isRunning()).thenReturn(true);
   TcpConnectionSupport mockConn1 = makeMockConnection("conn1");
   TcpConnectionSupport mockConn2 = makeMockConnection("conn2");
   int i = 3;
   when(factory.getConnection())
       .thenReturn(mockConn1)
       .thenReturn(mockConn2)
       .thenReturn(makeMockConnection("conn" + (i++)));
   CachingClientConnectionFactory cachingFactory = new CachingClientConnectionFactory(factory, 2);
   cachingFactory.start();
   TcpConnection conn1 = cachingFactory.getConnection();
   assertEquals("Cached:" + mockConn1.toString(), conn1.toString());
   conn1.close();
   conn1 = cachingFactory.getConnection();
   assertEquals("Cached:" + mockConn1.toString(), conn1.toString());
   TcpConnection conn2 = cachingFactory.getConnection();
   assertEquals("Cached:" + mockConn2.toString(), conn2.toString());
   cachingFactory.stop();
   Answer<Object> answer =
       new Answer<Object>() {
         @Override
         public Object answer(InvocationOnMock invocation) throws Throwable {
           return null;
         }
       };
   doAnswer(answer).when(mockConn1).close();
   doAnswer(answer).when(mockConn2).close();
   when(factory.isRunning()).thenReturn(false);
   conn1.close();
   conn2.close();
   verify(mockConn1).close();
   verify(mockConn2).close();
   when(mockConn1.isOpen()).thenReturn(false);
   when(mockConn2.isOpen()).thenReturn(false);
   when(factory.isRunning()).thenReturn(true);
   TcpConnection conn3 = cachingFactory.getConnection();
   assertNotSame(
       TestUtils.getPropertyValue(conn1, "theConnection"),
       TestUtils.getPropertyValue(conn3, "theConnection"));
   assertNotSame(
       TestUtils.getPropertyValue(conn2, "theConnection"),
       TestUtils.getPropertyValue(conn3, "theConnection"));
 }
 private TcpConnectionSupport makeMockConnection(String name, boolean closeOk) {
   TcpConnectionSupport mockConn1 = mock(TcpConnectionSupport.class);
   when(mockConn1.getConnectionId()).thenReturn(name);
   when(mockConn1.toString()).thenReturn(name);
   when(mockConn1.isOpen()).thenReturn(true);
   if (!closeOk) {
     doThrow(new RuntimeException("close() not expected")).when(mockConn1).close();
   }
   return mockConn1;
 }
 public TcpConnectionSupport makeMockConnection() {
   TcpConnectionSupport connection = mock(TcpConnectionSupport.class);
   when(connection.isOpen()).thenReturn(true);
   return connection;
 }