/** * 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; }