177391c2a01ce1fed085906743cc240a4d58edd92chrismair/*
277391c2a01ce1fed085906743cc240a4d58edd92chrismair * Copyright 2007 the original author or authors.
377391c2a01ce1fed085906743cc240a4d58edd92chrismair *
477391c2a01ce1fed085906743cc240a4d58edd92chrismair * Licensed under the Apache License, Version 2.0 (the "License");
577391c2a01ce1fed085906743cc240a4d58edd92chrismair * you may not use this file except in compliance with the License.
677391c2a01ce1fed085906743cc240a4d58edd92chrismair * You may obtain a copy of the License at
777391c2a01ce1fed085906743cc240a4d58edd92chrismair *
877391c2a01ce1fed085906743cc240a4d58edd92chrismair *      http://www.apache.org/licenses/LICENSE-2.0
977391c2a01ce1fed085906743cc240a4d58edd92chrismair *
1077391c2a01ce1fed085906743cc240a4d58edd92chrismair * Unless required by applicable law or agreed to in writing, software
1177391c2a01ce1fed085906743cc240a4d58edd92chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1277391c2a01ce1fed085906743cc240a4d58edd92chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377391c2a01ce1fed085906743cc240a4d58edd92chrismair * See the License for the specific language governing permissions and
1477391c2a01ce1fed085906743cc240a4d58edd92chrismair * limitations under the License.
1577391c2a01ce1fed085906743cc240a4d58edd92chrismair */
1677391c2a01ce1fed085906743cc240a4d58edd92chrismairpackage org.mockftpserver.core.session;
1777391c2a01ce1fed085906743cc240a4d58edd92chrismair
1877391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.io.ByteArrayInputStream;
1977391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.io.ByteArrayOutputStream;
2077391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.io.IOException;
2177391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.io.InputStream;
2277391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.util.HashMap;
2377391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.util.ListResourceBundle;
2477391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.util.Map;
2577391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.util.ResourceBundle;
2677391c2a01ce1fed085906743cc240a4d58edd92chrismair
2777391c2a01ce1fed085906743cc240a4d58edd92chrismair
2877391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.apache.log4j.Logger;
2977391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.command.Command;
3077391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.command.CommandHandler;
3177391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.command.CommandNames;
3277391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.command.InvocationRecord;
3377391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.session.DefaultSession;
3477391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.session.Session;
3577391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.core.socket.StubSocket;
3677391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.stub.command.AbstractStubCommandHandler;
3777391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.stub.command.ConnectCommandHandler;
3877391c2a01ce1fed085906743cc240a4d58edd92chrismairimport org.mockftpserver.test.AbstractTest;
3977391c2a01ce1fed085906743cc240a4d58edd92chrismair
4077391c2a01ce1fed085906743cc240a4d58edd92chrismair/**
4177391c2a01ce1fed085906743cc240a4d58edd92chrismair * Tests for the DefaultSession class that require the session (thread) to be running/active.
4277391c2a01ce1fed085906743cc240a4d58edd92chrismair *
4377391c2a01ce1fed085906743cc240a4d58edd92chrismair * @version $Revision$ - $Date$
4477391c2a01ce1fed085906743cc240a4d58edd92chrismair *
4577391c2a01ce1fed085906743cc240a4d58edd92chrismair * @author Chris Mair
4677391c2a01ce1fed085906743cc240a4d58edd92chrismair */
4777391c2a01ce1fed085906743cc240a4d58edd92chrismairpublic final class DefaultSession_RunTest extends AbstractTest {
4877391c2a01ce1fed085906743cc240a4d58edd92chrismair
4977391c2a01ce1fed085906743cc240a4d58edd92chrismair    private static final Logger LOG = Logger.getLogger(DefaultSession_RunTest.class);
5077391c2a01ce1fed085906743cc240a4d58edd92chrismair    private static final Command COMMAND = new Command("USER", EMPTY);
5177391c2a01ce1fed085906743cc240a4d58edd92chrismair    private static final int REPLY_CODE = 100;
5277391c2a01ce1fed085906743cc240a4d58edd92chrismair    private static final String REPLY_TEXT = "sample text description";
5377391c2a01ce1fed085906743cc240a4d58edd92chrismair
5477391c2a01ce1fed085906743cc240a4d58edd92chrismair    private DefaultSession session;
5577391c2a01ce1fed085906743cc240a4d58edd92chrismair    private ByteArrayOutputStream outputStream;
5677391c2a01ce1fed085906743cc240a4d58edd92chrismair    private Map commandHandlerMap;
5777391c2a01ce1fed085906743cc240a4d58edd92chrismair    private StubSocket stubSocket;
5877391c2a01ce1fed085906743cc240a4d58edd92chrismair    private boolean commandHandled = false;
5977391c2a01ce1fed085906743cc240a4d58edd92chrismair
6077391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
6177391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Perform initialization before each test
6277391c2a01ce1fed085906743cc240a4d58edd92chrismair     *
6377391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
6477391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
6577391c2a01ce1fed085906743cc240a4d58edd92chrismair    protected void setUp() throws Exception {
6677391c2a01ce1fed085906743cc240a4d58edd92chrismair        super.setUp();
6777391c2a01ce1fed085906743cc240a4d58edd92chrismair        commandHandlerMap = new HashMap();
6877391c2a01ce1fed085906743cc240a4d58edd92chrismair        outputStream = new ByteArrayOutputStream();
6977391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
7077391c2a01ce1fed085906743cc240a4d58edd92chrismair
7177391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
7277391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test that the CommandHandler is properly initialized and passed the expected parameters
7377391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
7477391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testInvocationOfCommandHandler() throws Exception {
7577391c2a01ce1fed085906743cc240a4d58edd92chrismair        AbstractStubCommandHandler commandHandler = new AbstractStubCommandHandler() {
7677391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session cmdSession, InvocationRecord invocationRecord) {
7777391c2a01ce1fed085906743cc240a4d58edd92chrismair                assertEquals("command", COMMAND, command);
7877391c2a01ce1fed085906743cc240a4d58edd92chrismair                assertSame("session", session, cmdSession);
7977391c2a01ce1fed085906743cc240a4d58edd92chrismair                assertEquals("InvocationRecord: command", COMMAND, invocationRecord.getCommand());
8077391c2a01ce1fed085906743cc240a4d58edd92chrismair                assertEquals("InvocationRecord: clientHost", DEFAULT_HOST, invocationRecord.getClientHost());
8177391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
8277391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
8377391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
8477391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, "");
8577391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
8677391c2a01ce1fed085906743cc240a4d58edd92chrismair
8777391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
8877391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test the close() method
8977391c2a01ce1fed085906743cc240a4d58edd92chrismair     *
9077391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @throws IOException
9177391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
9277391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testClose() throws Exception {
9377391c2a01ce1fed085906743cc240a4d58edd92chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
9477391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
9577391c2a01ce1fed085906743cc240a4d58edd92chrismair                session.close();
9677391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
9777391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
9877391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
9977391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, "");
10077391c2a01ce1fed085906743cc240a4d58edd92chrismair        assertFalse("socket should not be closed", stubSocket.isClosed());
10177391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
10277391c2a01ce1fed085906743cc240a4d58edd92chrismair
10377391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
10477391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test the getClientHost() method
10577391c2a01ce1fed085906743cc240a4d58edd92chrismair     *
10677391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @throws IOException
10777391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
10877391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testGetClientHost() throws Exception {
10977391c2a01ce1fed085906743cc240a4d58edd92chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
11077391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
11177391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
11277391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
11377391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
11477391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, "");
11577391c2a01ce1fed085906743cc240a4d58edd92chrismair        LOG.info("clientHost=" + session.getClientHost());
11677391c2a01ce1fed085906743cc240a4d58edd92chrismair        assertEquals("clientHost", DEFAULT_HOST, session.getClientHost());
11777391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
11877391c2a01ce1fed085906743cc240a4d58edd92chrismair
11977391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
12077391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test the sendReply() method, when the specified reply text is null
12177391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
12277391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testSendReply_NullReplyText() throws Exception {
12377391c2a01ce1fed085906743cc240a4d58edd92chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
12477391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
12577391c2a01ce1fed085906743cc240a4d58edd92chrismair                session.sendReply(REPLY_CODE, null);
12677391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
12777391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
12877391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
12977391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, Integer.toString(REPLY_CODE));
13077391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
13177391c2a01ce1fed085906743cc240a4d58edd92chrismair
13277391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
13377391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test the sendReply() method, verifying that extra extra whitespace is trimmed from the reply text
13477391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
13577391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testSendReply_TrimReplyText() throws Exception {
13677391c2a01ce1fed085906743cc240a4d58edd92chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
13777391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
13877391c2a01ce1fed085906743cc240a4d58edd92chrismair                session.sendReply(REPLY_CODE, " " + REPLY_TEXT + " ");
13977391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
14077391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
14177391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
14277391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, REPLY_CODE + " " + REPLY_TEXT);
14377391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
14477391c2a01ce1fed085906743cc240a4d58edd92chrismair
14577391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
14677391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test the sendReply() method, when the text contains multiple lines
14777391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
14877391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testSendReply_MultiLineText() throws Exception {
14977391c2a01ce1fed085906743cc240a4d58edd92chrismair        final String MULTILINE_REPLY_TEXT = "abc\ndef\nghi\njkl";
15077391c2a01ce1fed085906743cc240a4d58edd92chrismair        final String FORMATTED_MULTILINE_REPLY_TEXT = "123-abc\ndef\nghi\n123 jkl";
15177391c2a01ce1fed085906743cc240a4d58edd92chrismair
15277391c2a01ce1fed085906743cc240a4d58edd92chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
15377391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
15477391c2a01ce1fed085906743cc240a4d58edd92chrismair                session.sendReply(123, MULTILINE_REPLY_TEXT);
15577391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
15677391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
15777391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
15877391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, FORMATTED_MULTILINE_REPLY_TEXT);
15977391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
16077391c2a01ce1fed085906743cc240a4d58edd92chrismair
16177391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
16277391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Test the sendReply() method when the reply code has associated reply text
16377391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
16477391c2a01ce1fed085906743cc240a4d58edd92chrismair    public void testSendReply_ReplyText() throws Exception {
16577391c2a01ce1fed085906743cc240a4d58edd92chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
16677391c2a01ce1fed085906743cc240a4d58edd92chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
16777391c2a01ce1fed085906743cc240a4d58edd92chrismair                session.sendReply(REPLY_CODE, REPLY_TEXT);
16877391c2a01ce1fed085906743cc240a4d58edd92chrismair                commandHandled = true;
16977391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
17077391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
17177391c2a01ce1fed085906743cc240a4d58edd92chrismair        runCommandAndVerifyOutput(commandHandler, REPLY_CODE + " " + REPLY_TEXT);
17277391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
17377391c2a01ce1fed085906743cc240a4d58edd92chrismair
17477391c2a01ce1fed085906743cc240a4d58edd92chrismair    // -------------------------------------------------------------------------
17577391c2a01ce1fed085906743cc240a4d58edd92chrismair    // Internal Helper Methods
17677391c2a01ce1fed085906743cc240a4d58edd92chrismair    // -------------------------------------------------------------------------
17777391c2a01ce1fed085906743cc240a4d58edd92chrismair
17877391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
17977391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Create and return a DefaultSession object that reads from an InputStream with the specified
18077391c2a01ce1fed085906743cc240a4d58edd92chrismair     * contents and writes to the predefined outputStrean ByteArrayOutputStream. Also, save the
18177391c2a01ce1fed085906743cc240a4d58edd92chrismair     * StubSocket being used in the stubSocket attribute.
18277391c2a01ce1fed085906743cc240a4d58edd92chrismair     *
18377391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param inputStreamContents - the contents of the input stream
18477391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @return the DefaultSession
18577391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
18677391c2a01ce1fed085906743cc240a4d58edd92chrismair    private DefaultSession createDefaultSession(CommandHandler commandHandler) {
18777391c2a01ce1fed085906743cc240a4d58edd92chrismair        stubSocket = createTestSocket(COMMAND.getName());
18877391c2a01ce1fed085906743cc240a4d58edd92chrismair        commandHandlerMap.put(COMMAND.getName(), commandHandler);
18977391c2a01ce1fed085906743cc240a4d58edd92chrismair
19077391c2a01ce1fed085906743cc240a4d58edd92chrismair        ConnectCommandHandler connectCommandHandler = new ConnectCommandHandler();
19177391c2a01ce1fed085906743cc240a4d58edd92chrismair
19277391c2a01ce1fed085906743cc240a4d58edd92chrismair        ResourceBundle replyTextBundle = new ListResourceBundle() {
19377391c2a01ce1fed085906743cc240a4d58edd92chrismair            protected Object[][] getContents() {
19477391c2a01ce1fed085906743cc240a4d58edd92chrismair                return new Object[][] {
19577391c2a01ce1fed085906743cc240a4d58edd92chrismair                        { "220", "Reply for 220" },
19677391c2a01ce1fed085906743cc240a4d58edd92chrismair                };
19777391c2a01ce1fed085906743cc240a4d58edd92chrismair            }
19877391c2a01ce1fed085906743cc240a4d58edd92chrismair        };
19977391c2a01ce1fed085906743cc240a4d58edd92chrismair        connectCommandHandler.setReplyTextBundle(replyTextBundle);
20077391c2a01ce1fed085906743cc240a4d58edd92chrismair        commandHandlerMap.put(CommandNames.CONNECT, connectCommandHandler);
20177391c2a01ce1fed085906743cc240a4d58edd92chrismair
20277391c2a01ce1fed085906743cc240a4d58edd92chrismair        return new DefaultSession(stubSocket, commandHandlerMap);
20377391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
20477391c2a01ce1fed085906743cc240a4d58edd92chrismair
20577391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
20677391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Create and return a StubSocket that reads from an InputStream with the specified contents and
20777391c2a01ce1fed085906743cc240a4d58edd92chrismair     * writes to the predefined outputStrean ByteArrayOutputStream.
20877391c2a01ce1fed085906743cc240a4d58edd92chrismair     *
20977391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param inputStreamContents - the contents of the input stream
21077391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @return the StubSocket
21177391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
21277391c2a01ce1fed085906743cc240a4d58edd92chrismair    private StubSocket createTestSocket(String inputStreamContents) {
21377391c2a01ce1fed085906743cc240a4d58edd92chrismair        InputStream inputStream = new ByteArrayInputStream(inputStreamContents.getBytes());
21477391c2a01ce1fed085906743cc240a4d58edd92chrismair        return new StubSocket(DEFAULT_HOST, inputStream, outputStream);
21577391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
21677391c2a01ce1fed085906743cc240a4d58edd92chrismair
21777391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
21877391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Run the command represented by the CommandHandler and verify that the session output from the
21977391c2a01ce1fed085906743cc240a4d58edd92chrismair     * control socket contains the expected output text.
22077391c2a01ce1fed085906743cc240a4d58edd92chrismair     *
22177391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param commandHandler - the CommandHandler to invoke
22277391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param expectedOutput - the text expected within the session output
22377391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @throws InterruptedException
22477391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
22577391c2a01ce1fed085906743cc240a4d58edd92chrismair    private void runCommandAndVerifyOutput(CommandHandler commandHandler, String expectedOutput)
22677391c2a01ce1fed085906743cc240a4d58edd92chrismair            throws InterruptedException {
22777391c2a01ce1fed085906743cc240a4d58edd92chrismair        session = createDefaultSession(commandHandler);
22877391c2a01ce1fed085906743cc240a4d58edd92chrismair
22977391c2a01ce1fed085906743cc240a4d58edd92chrismair        Thread thread = new Thread(session);
23077391c2a01ce1fed085906743cc240a4d58edd92chrismair        thread.start();
23177391c2a01ce1fed085906743cc240a4d58edd92chrismair
23277391c2a01ce1fed085906743cc240a4d58edd92chrismair        for (int i = 0; !commandHandled && i < 10; i++) {
23377391c2a01ce1fed085906743cc240a4d58edd92chrismair            Thread.sleep(50L);
23477391c2a01ce1fed085906743cc240a4d58edd92chrismair        }
23577391c2a01ce1fed085906743cc240a4d58edd92chrismair
23677391c2a01ce1fed085906743cc240a4d58edd92chrismair        session.close();
23777391c2a01ce1fed085906743cc240a4d58edd92chrismair        thread.join();
23877391c2a01ce1fed085906743cc240a4d58edd92chrismair
23977391c2a01ce1fed085906743cc240a4d58edd92chrismair        assertEquals("commandHandled", true, commandHandled);
24077391c2a01ce1fed085906743cc240a4d58edd92chrismair
24177391c2a01ce1fed085906743cc240a4d58edd92chrismair        String output = outputStream.toString().trim();
24277391c2a01ce1fed085906743cc240a4d58edd92chrismair        LOG.info("output=[" + output + "]");
24377391c2a01ce1fed085906743cc240a4d58edd92chrismair        assertTrue("output: expected [" + expectedOutput + "]", output.indexOf(expectedOutput) != -1);
24477391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
24577391c2a01ce1fed085906743cc240a4d58edd92chrismair
24677391c2a01ce1fed085906743cc240a4d58edd92chrismair}
247