1e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair/*
2e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Copyright 2007 the original author or authors.
3e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
4e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * you may not use this file except in compliance with the License.
6e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * You may obtain a copy of the License at
7e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
8e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
10e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Unless required by applicable law or agreed to in writing, software
11e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * See the License for the specific language governing permissions and
14e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * limitations under the License.
15e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */
16e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairpackage org.mockftpserver.core.session;
17e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
18e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.ByteArrayInputStream;
19e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.ByteArrayOutputStream;
20e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.IOException;
21e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.InputStream;
22e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.util.HashMap;
23e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.util.ListResourceBundle;
24e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.util.Map;
25e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.util.ResourceBundle;
26e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
27e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
28e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.log4j.Logger;
29e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.Command;
30e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.CommandHandler;
31e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.CommandNames;
32e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.InvocationRecord;
33e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.session.DefaultSession;
34e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.session.Session;
35e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.socket.StubSocket;
36e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.AbstractStubCommandHandler;
37e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.ConnectCommandHandler;
38e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.test.AbstractTest;
39e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
40e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair/**
41e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Tests for the DefaultSession class that require the session (thread) to be running/active.
42e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
43e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @version $Revision$ - $Date$
44e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
45e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @author Chris Mair
46e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */
47e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairpublic final class DefaultSession_RunTest extends AbstractTest {
48e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
49e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final Logger LOG = Logger.getLogger(DefaultSession_RunTest.class);
50e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final Command COMMAND = new Command("USER", EMPTY);
51e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final int REPLY_CODE = 100;
52e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final String REPLY_TEXT = "sample text description";
53e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
54e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private DefaultSession session;
55e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private ByteArrayOutputStream outputStream;
56e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private Map commandHandlerMap;
57e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private StubSocket stubSocket;
58e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private boolean commandHandled = false;
59e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
60e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
61e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Perform initialization before each test
62e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
63e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
64e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
65e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    protected void setUp() throws Exception {
66e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        super.setUp();
67e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        commandHandlerMap = new HashMap();
68e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        outputStream = new ByteArrayOutputStream();
69e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
70e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
71e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
72e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test that the CommandHandler is properly initialized and passed the expected parameters
73e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
74e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testInvocationOfCommandHandler() throws Exception {
75e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        AbstractStubCommandHandler commandHandler = new AbstractStubCommandHandler() {
76e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session cmdSession, InvocationRecord invocationRecord) {
77e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                assertEquals("command", COMMAND, command);
78e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                assertSame("session", session, cmdSession);
79e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                assertEquals("InvocationRecord: command", COMMAND, invocationRecord.getCommand());
80e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                assertEquals("InvocationRecord: clientHost", DEFAULT_HOST, invocationRecord.getClientHost());
81e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
82e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
83e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
84e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, "");
85e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
86e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
87e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
88e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the close() method
89e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
90e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @throws IOException
91e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
92e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testClose() throws Exception {
93e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
94e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
95e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                session.close();
96e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
97e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
98e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
99e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, "");
100e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertFalse("socket should not be closed", stubSocket.isClosed());
101e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
102e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
103e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
104e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the getClientHost() method
105e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
106e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @throws IOException
107e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
108e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testGetClientHost() throws Exception {
109e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
110e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
111e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
112e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
113e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
114e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, "");
115e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("clientHost=" + session.getClientHost());
116e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("clientHost", DEFAULT_HOST, session.getClientHost());
117e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
118e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
119e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
120e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the sendReply() method, when the specified reply text is null
121e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
122e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSendReply_NullReplyText() throws Exception {
123e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
124e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
125e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                session.sendReply(REPLY_CODE, null);
126e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
127e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
128e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
129e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, Integer.toString(REPLY_CODE));
130e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
131e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
132e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
133e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the sendReply() method, verifying that extra extra whitespace is trimmed from the reply text
134e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
135e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSendReply_TrimReplyText() throws Exception {
136e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
137e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
138e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                session.sendReply(REPLY_CODE, " " + REPLY_TEXT + " ");
139e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
140e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
141e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
142e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, REPLY_CODE + " " + REPLY_TEXT);
143e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
144e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
145e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
146e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the sendReply() method, when the text contains multiple lines
147e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
148e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSendReply_MultiLineText() throws Exception {
149e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String MULTILINE_REPLY_TEXT = "abc\ndef\nghi\njkl";
150e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String FORMATTED_MULTILINE_REPLY_TEXT = "123-abc\ndef\nghi\n123 jkl";
151e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
152e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
153e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
154e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                session.sendReply(123, MULTILINE_REPLY_TEXT);
155e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
156e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
157e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
158e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, FORMATTED_MULTILINE_REPLY_TEXT);
159e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
160e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
161e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
162e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the sendReply() method when the reply code has associated reply text
163e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
164e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSendReply_ReplyText() throws Exception {
165e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
166e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
167e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                session.sendReply(REPLY_CODE, REPLY_TEXT);
168e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                commandHandled = true;
169e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
170e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
171e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        runCommandAndVerifyOutput(commandHandler, REPLY_CODE + " " + REPLY_TEXT);
172e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
173e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
174e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // -------------------------------------------------------------------------
175e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // Internal Helper Methods
176e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // -------------------------------------------------------------------------
177e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
178e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
179e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Create and return a DefaultSession object that reads from an InputStream with the specified
180e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * contents and writes to the predefined outputStrean ByteArrayOutputStream. Also, save the
181e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * StubSocket being used in the stubSocket attribute.
182e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
183e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param inputStreamContents - the contents of the input stream
184e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @return the DefaultSession
185e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
186e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private DefaultSession createDefaultSession(CommandHandler commandHandler) {
187e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stubSocket = createTestSocket(COMMAND.getName());
188e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        commandHandlerMap.put(COMMAND.getName(), commandHandler);
189e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
190e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ConnectCommandHandler connectCommandHandler = new ConnectCommandHandler();
191e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
192e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ResourceBundle replyTextBundle = new ListResourceBundle() {
193e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            protected Object[][] getContents() {
194e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                return new Object[][] {
195e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                        { "220", "Reply for 220" },
196e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                };
197e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            }
198e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        };
199e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        connectCommandHandler.setReplyTextBundle(replyTextBundle);
200e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        commandHandlerMap.put(CommandNames.CONNECT, connectCommandHandler);
201e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
202e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        return new DefaultSession(stubSocket, commandHandlerMap);
203e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
204e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
205e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
206e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Create and return a StubSocket that reads from an InputStream with the specified contents and
207e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * writes to the predefined outputStrean ByteArrayOutputStream.
208e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
209e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param inputStreamContents - the contents of the input stream
210e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @return the StubSocket
211e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
212e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private StubSocket createTestSocket(String inputStreamContents) {
213e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        InputStream inputStream = new ByteArrayInputStream(inputStreamContents.getBytes());
214e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        return new StubSocket(DEFAULT_HOST, inputStream, outputStream);
215e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
216e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
217e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
218e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Run the command represented by the CommandHandler and verify that the session output from the
219e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * control socket contains the expected output text.
220e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
221e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param commandHandler - the CommandHandler to invoke
222e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param expectedOutput - the text expected within the session output
223e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @throws InterruptedException
224e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
225e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private void runCommandAndVerifyOutput(CommandHandler commandHandler, String expectedOutput)
226e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            throws InterruptedException {
227e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        session = createDefaultSession(commandHandler);
228e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
229e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        Thread thread = new Thread(session);
230e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        thread.start();
231e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
232e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        for (int i = 0; !commandHandled && i < 10; i++) {
233e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            Thread.sleep(50L);
234e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        }
235e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
236e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        session.close();
237e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        thread.join();
238e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
239e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("commandHandled", true, commandHandled);
240e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
241e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String output = outputStream.toString().trim();
242e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("output=[" + output + "]");
243e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("output: expected [" + expectedOutput + "]", output.indexOf(expectedOutput) != -1);
244e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
245e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
246e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair}
247