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