14bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair/* 24bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Copyright 2007 the original author or authors. 34bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 44bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Licensed under the Apache License, Version 2.0 (the "License"); 54bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * you may not use this file except in compliance with the License. 64bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * You may obtain a copy of the License at 74bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 84bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * http://www.apache.org/licenses/LICENSE-2.0 94bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Unless required by applicable law or agreed to in writing, software 114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * distributed under the License is distributed on an "AS IS" BASIS, 124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * See the License for the specific language governing permissions and 144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * limitations under the License. 154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairpackage org.mockftpserver.core.session; 174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.ByteArrayInputStream; 194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.ByteArrayOutputStream; 204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.IOException; 214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.InputStream; 224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.net.InetAddress; 234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.net.SocketTimeoutException; 244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.util.Collections; 254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.util.HashMap; 264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.util.Map; 274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.apache.log4j.Logger; 294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.MockFtpServerException; 304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.command.Command; 314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.socket.StubServerSocket; 324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.socket.StubServerSocketFactory; 334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.socket.StubSocket; 344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.socket.StubSocketFactory; 354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.core.util.AssertFailedException; 364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport org.mockftpserver.test.AbstractTest; 374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair/** 394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Tests for the DefaultSession class 404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @version $Revision$ - $Date$ 424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @author Chris Mair 444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairpublic final class DefaultSessionTest extends AbstractTest { 464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private static final Logger LOG = Logger.getLogger(DefaultSessionTest.class); 484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private static final String DATA = "sample data 123"; 494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private static final int PORT = 197; 504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private static final String NAME1 = "name1"; 514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private static final String NAME2 = "name2"; 524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private static final Object VALUE = "value"; 534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private DefaultSession session; 554bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private ByteArrayOutputStream outputStream; 564bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private Map commandHandlerMap; 574bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private StubSocket stubSocket; 584bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private InetAddress clientHost; 594bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 604bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 614bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Perform initialization before each test 624bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 634bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @see org.mockftpserver.test.AbstractTest#setUp() 644bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 654bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair protected void setUp() throws Exception { 664bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair super.setUp(); 674bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 684bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair commandHandlerMap = new HashMap(); 694bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair outputStream = new ByteArrayOutputStream(); 704bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session = createDefaultSession(""); 714bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair clientHost = InetAddress.getLocalHost(); 724bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 734bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 744bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 754bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @see org.mockftpserver.test.AbstractTest#tearDown() 764bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 774bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair protected void tearDown() throws Exception { 784bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair super.tearDown(); 794bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 804bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 814bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 824bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the Constructor when the control socket is null 834bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 844bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testConstructor_NullControlSocket() { 854bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 864bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair new DefaultSession(null, commandHandlerMap); 874bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 884bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 894bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 904bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 914bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 924bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 934bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 944bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 954bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the Constructor when the command handler Map is null 964bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 974bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testConstructor_NullCommandHandlerMap() { 984bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 994bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair new DefaultSession(stubSocket, null); 1004bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 1014bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1024bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 1034bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 1044bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1054bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1064bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1074bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 1084bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the setClientDataPort() method 1094bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 1104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSetClientDataPort() { 1114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket(""); 1124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocketFactory stubSocketFactory = new StubSocketFactory(stubSocket); 1134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.socketFactory = stubSocketFactory; 1144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataPort(PORT); 1154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 1164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 1174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("data port", PORT, stubSocketFactory.requestedDataPort); 1184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 1214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the setClientDataPort() method after the session was in passive data mode 1224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 1234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSetClientDataPort_AfterPassiveConnectionMode() throws IOException { 1244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocket stubServerSocket = new StubServerSocket(PORT); 1254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocketFactory stubServerSocketFactory = new StubServerSocketFactory(stubServerSocket); 1264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.serverSocketFactory = stubServerSocketFactory; 1274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.switchToPassiveMode(); 1294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertFalse("server socket closed", stubServerSocket.isClosed()); 1304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNotNull("passiveModeDataSocket", session.passiveModeDataSocket); 1314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataPort(PORT); 1324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair // Make sure that any passive mode connection info is cleared out 1344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertTrue("server socket closed", stubServerSocket.isClosed()); 1354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("passiveModeDataSocket should be null", session.passiveModeDataSocket); 1364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 1394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the setClientHost() method 1404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 1414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSetClientHost() throws Exception { 1424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket(""); 1434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocketFactory stubSocketFactory = new StubSocketFactory(stubSocket); 1444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.socketFactory = stubSocketFactory; 1454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 1464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 1474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("client host", clientHost, stubSocketFactory.requestedHost); 1484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 1514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the openDataConnection(), setClientDataPort() and setClientDataHost() methods 1524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 1534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testOpenDataConnection() { 1544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket(""); 1554bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocketFactory stubSocketFactory = new StubSocketFactory(stubSocket); 1564bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.socketFactory = stubSocketFactory; 1574bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1584bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair // Use default client data port 1594bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 1604bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 1614bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("data port", DefaultSession.DEFAULT_CLIENT_DATA_PORT, stubSocketFactory.requestedDataPort); 1624bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("client host", clientHost, stubSocketFactory.requestedHost); 1634bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1644bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair // Set client data port explicitly 1654bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataPort(PORT); 1664bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 1674bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 1684bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("data port", PORT, stubSocketFactory.requestedDataPort); 1694bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("client host", clientHost, stubSocketFactory.requestedHost); 1704bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1714bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1724bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 1734bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the OpenDataConnection method, when in passive mode and no incoming connection is 1744bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * initiated 1754bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 1764bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testOpenDataConnection_PassiveMode_NoConnection() throws IOException { 1774bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1784bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocket stubServerSocket = new StubServerSocket(PORT); 1794bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocketFactory stubServerSocketFactory = new StubServerSocketFactory(stubServerSocket); 1804bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.serverSocketFactory = stubServerSocketFactory; 1814bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1824bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.switchToPassiveMode(); 1834bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1844bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 1854bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 1864bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected MockFtpServerException"); 1874bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1884bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (MockFtpServerException expected) { 1894bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 1904bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertSame("cause", SocketTimeoutException.class, expected.getCause().getClass()); 1914bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1924bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 1934bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 1944bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 1954bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the OpenDataConnection method, when the clientHost has not been set 1964bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 1974bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testOpenDataConnection_NullClientHost() { 1984bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 1994bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 2004bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 2014bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2024bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 2034bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 2044bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2054bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2064bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2074bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2084bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the readData() method 2094bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testReadData() { 2114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket(DATA); 2124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.socketFactory = new StubSocketFactory(stubSocket); 2134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 2144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 2164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair byte[] data = session.readData(); 2174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("data=[" + new String(data) + "]"); 2184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("data", DATA.getBytes(), data); 2194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the readData() method after switching to passive mode 2234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testReadData_PassiveMode() throws IOException { 2254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket(DATA); 2264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocket stubServerSocket = new StubServerSocket(PORT, stubSocket); 2274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocketFactory stubServerSocketFactory = new StubServerSocketFactory(stubServerSocket); 2284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.serverSocketFactory = stubServerSocketFactory; 2294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.switchToPassiveMode(); 2314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 2324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair byte[] data = session.readData(); 2334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("data=[" + new String(data) + "]"); 2344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("data", DATA.getBytes(), data); 2354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the closeDataConnection() method 2394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testCloseDataConnection() { 2414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket(DATA); 2424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.socketFactory = new StubSocketFactory(stubSocket); 2434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 2454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 2464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.closeDataConnection(); 2474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertTrue("client data socket should be closed", stubSocket.isClosed()); 2484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the switchToPassiveMode() method 2524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSwitchToPassiveMode() throws IOException { 2544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocket stubServerSocket = new StubServerSocket(PORT); 2554bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubServerSocketFactory stubServerSocketFactory = new StubServerSocketFactory(stubServerSocket); 2564bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.serverSocketFactory = stubServerSocketFactory; 2574bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2584bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("passiveModeDataSocket starts out null", session.passiveModeDataSocket); 2594bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair int port = session.switchToPassiveMode(); 2604bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertSame("passiveModeDataSocket", stubServerSocket, session.passiveModeDataSocket); 2614bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("port", PORT, port); 2624bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2634bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2644bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2654bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the getServerHost() method 2664bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2674bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testGetServerHost() { 2684bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("host", DEFAULT_HOST, session.getServerHost()); 2694bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2704bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2714bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2724bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the getClientHost() method when the session is not yet started 2734bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2744bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testGetClientHost_NotRunning() { 2754bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("null", session.getClientHost()); 2764bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2774bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2784bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2794bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the parseCommand() method 2804bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2814bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testParseCommand() { 2824bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair Command command = session.parseCommand("LIST"); 2834bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("command name", "LIST", command.getName()); 2844bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("command parameters", EMPTY, command.getParameters()); 2854bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2864bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair command = session.parseCommand("USER user123"); 2874bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("command name", "USER", command.getName()); 2884bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("command parameters", array("user123"), command.getParameters()); 2894bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2904bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair command = session.parseCommand("PORT 127,0,0,1,17,37"); 2914bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("command name", "PORT", command.getName()); 2924bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("command parameters", new String[] { "127", "0", "0", "1", "17", "37" }, command 2934bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair .getParameters()); 2944bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 2954bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 2964bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 2974bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the parseCommand() method, passing in an empty command String 2984bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 2994bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testParseCommand_EmptyCommandString() { 3004bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 3014bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.parseCommand(""); 3024bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 3034bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3044bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 3054bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 3064bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3074bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3084bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3094bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the sendData() method, as well as the openDataConnection() and closeDataConnection() 3114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSendData() { 3134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = createTestSocket("1234567890 abcdef"); 3144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.socketFactory = new StubSocketFactory(stubSocket); 3154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setClientDataHost(clientHost); 3174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.openDataConnection(); 3184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.sendData(DATA.getBytes(), DATA.length()); 3194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("output=[" + outputStream.toString() + "]"); 3204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("output", DATA, outputStream.toString()); 3214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the SendData() method, passing in a null byte[] 3254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSendData_Null() { 3274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 3294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.sendData(null, 1); 3304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 3314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 3334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 3344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the SendReply(int,String) method, passing in an invalid reply code 3394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSendReply_InvalidReplyCode() { 3414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 3434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.sendReply(-66, "text"); 3444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 3454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 3474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 3484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the getAttribute() and setAttribute() methods 3534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testGetAndSetAttribute() { 3554bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("name does not exist yet", session.getAttribute(NAME1)); 3564bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setAttribute(NAME1, VALUE); 3574bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setAttribute(NAME2, null); 3584bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("NAME1", VALUE, session.getAttribute(NAME1)); 3594bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("NAME2", session.getAttribute(NAME2)); 3604bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("no such name", session.getAttribute("noSuchName")); 3614bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3624bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3634bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3644bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the getAttribute() method, passing in a null name 3654bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3664bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testGetAttribute_Null() { 3674bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 3684bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.getAttribute(null); 3694bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 3704bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3714bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 3724bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 3734bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3744bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3754bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3764bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3774bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the setAttribute() method, passing in a null name 3784bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3794bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testSetAttribute_NullName() { 3804bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 3814bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setAttribute(null, VALUE); 3824bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 3834bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3844bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 3854bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 3864bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3874bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3884bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3894bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 3904bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the removeAttribute() 3914bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 3924bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testRemoveAttribute() { 3934bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.removeAttribute("noSuchName"); // do nothing 3944bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setAttribute(NAME1, VALUE); 3954bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.removeAttribute(NAME1); 3964bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertNull("NAME1", session.getAttribute(NAME1)); 3974bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 3984bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 3994bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 4004bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the removeAttribute() method, passing in a null name 4014bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 4024bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testRemoveAttribute_Null() { 4034bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair try { 4044bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.removeAttribute(null); 4054bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair fail("Expected AssertFailedException"); 4064bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 4074bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair catch (AssertFailedException expected) { 4084bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair LOG.info("Expected: " + expected); 4094bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 4104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 4114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 4124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 4134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test the getAttributeNames() 4144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 4154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair public void testGetAttributeNames() { 4164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("No names yet", Collections.EMPTY_SET, session.getAttributeNames()); 4174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setAttribute(NAME1, VALUE); 4184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("1", Collections.singleton(NAME1), session.getAttributeNames()); 4194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair session.setAttribute(NAME2, VALUE); 4204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair assertEquals("2", set(NAME1, NAME2), session.getAttributeNames()); 4214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 4224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 4234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair // ------------------------------------------------------------------------- 4244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair // Internal Helper Methods 4254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair // ------------------------------------------------------------------------- 4264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 4274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 4284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Create and return a DefaultSession object that reads from an InputStream with the specified 4294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * contents and writes to the predefined outputStrean ByteArrayOutputStream. Also, save the 4304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * StubSocket being used in the stubSocket attribute. 4314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 4324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @param inputStreamContents - the contents of the input stream 4334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @return the DefaultSession 4344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 4354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private DefaultSession createDefaultSession(String inputStreamContents) { 4364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair stubSocket = createTestSocket(inputStreamContents); 4374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair return new DefaultSession(stubSocket, commandHandlerMap); 4384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 4394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 4404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair /** 4414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Create and return a StubSocket that reads from an InputStream with the specified contents and 4424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * writes to the predefined outputStrean ByteArrayOutputStream. 4434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * 4444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @param inputStreamContents - the contents of the input stream 4454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @return the StubSocket 4464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */ 4474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair private StubSocket createTestSocket(String inputStreamContents) { 4484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair InputStream inputStream = new ByteArrayInputStream(inputStreamContents.getBytes()); 4494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair StubSocket stubSocket = new StubSocket(inputStream, outputStream); 4504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair stubSocket._setLocalAddress(DEFAULT_HOST); 4514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair return stubSocket; 4524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair } 4534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair 4544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair} 455