185efb15529d45e32fea8de03c38a968c157c8262chrismair/*
285efb15529d45e32fea8de03c38a968c157c8262chrismair * Copyright 2007 the original author or authors.
385efb15529d45e32fea8de03c38a968c157c8262chrismair *
485efb15529d45e32fea8de03c38a968c157c8262chrismair * Licensed under the Apache License, Version 2.0 (the "License");
585efb15529d45e32fea8de03c38a968c157c8262chrismair * you may not use this file except in compliance with the License.
685efb15529d45e32fea8de03c38a968c157c8262chrismair * You may obtain a copy of the License at
785efb15529d45e32fea8de03c38a968c157c8262chrismair *
885efb15529d45e32fea8de03c38a968c157c8262chrismair *      http://www.apache.org/licenses/LICENSE-2.0
985efb15529d45e32fea8de03c38a968c157c8262chrismair *
1085efb15529d45e32fea8de03c38a968c157c8262chrismair * Unless required by applicable law or agreed to in writing, software
1185efb15529d45e32fea8de03c38a968c157c8262chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1285efb15529d45e32fea8de03c38a968c157c8262chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1385efb15529d45e32fea8de03c38a968c157c8262chrismair * See the License for the specific language governing permissions and
1485efb15529d45e32fea8de03c38a968c157c8262chrismair * limitations under the License.
1585efb15529d45e32fea8de03c38a968c157c8262chrismair */
1685efb15529d45e32fea8de03c38a968c157c8262chrismairpackage org.mockftpserver.core.session;
1785efb15529d45e32fea8de03c38a968c157c8262chrismair
1885efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.ByteArrayInputStream;
1985efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.ByteArrayOutputStream;
2085efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.IOException;
2185efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.io.InputStream;
2285efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.util.HashMap;
2385efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.util.ListResourceBundle;
2485efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.util.Map;
2585efb15529d45e32fea8de03c38a968c157c8262chrismairimport java.util.ResourceBundle;
2685efb15529d45e32fea8de03c38a968c157c8262chrismair
2785efb15529d45e32fea8de03c38a968c157c8262chrismair
2885efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.apache.log4j.Logger;
2985efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.Command;
3085efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.CommandHandler;
3185efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.CommandNames;
3285efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.command.InvocationRecord;
3385efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.session.DefaultSession;
3485efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.session.Session;
3585efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.core.socket.StubSocket;
3685efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.AbstractStubCommandHandler;
3785efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.stub.command.ConnectCommandHandler;
3885efb15529d45e32fea8de03c38a968c157c8262chrismairimport org.mockftpserver.test.AbstractTest;
3985efb15529d45e32fea8de03c38a968c157c8262chrismair
4085efb15529d45e32fea8de03c38a968c157c8262chrismair/**
4185efb15529d45e32fea8de03c38a968c157c8262chrismair * Tests for the DefaultSession class that require the session (thread) to be running/active.
4285efb15529d45e32fea8de03c38a968c157c8262chrismair *
4385efb15529d45e32fea8de03c38a968c157c8262chrismair * @version $Revision$ - $Date$
4485efb15529d45e32fea8de03c38a968c157c8262chrismair *
4585efb15529d45e32fea8de03c38a968c157c8262chrismair * @author Chris Mair
4685efb15529d45e32fea8de03c38a968c157c8262chrismair */
4785efb15529d45e32fea8de03c38a968c157c8262chrismairpublic final class DefaultSession_RunTest extends AbstractTest {
4885efb15529d45e32fea8de03c38a968c157c8262chrismair
4985efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final Logger LOG = Logger.getLogger(DefaultSession_RunTest.class);
5085efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final Command COMMAND = new Command("USER", EMPTY);
5185efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final int REPLY_CODE = 100;
5285efb15529d45e32fea8de03c38a968c157c8262chrismair    private static final String REPLY_TEXT = "sample text description";
5385efb15529d45e32fea8de03c38a968c157c8262chrismair
5485efb15529d45e32fea8de03c38a968c157c8262chrismair    private DefaultSession session;
5585efb15529d45e32fea8de03c38a968c157c8262chrismair    private ByteArrayOutputStream outputStream;
5685efb15529d45e32fea8de03c38a968c157c8262chrismair    private Map commandHandlerMap;
5785efb15529d45e32fea8de03c38a968c157c8262chrismair    private StubSocket stubSocket;
5885efb15529d45e32fea8de03c38a968c157c8262chrismair    private boolean commandHandled = false;
5985efb15529d45e32fea8de03c38a968c157c8262chrismair
6085efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
6185efb15529d45e32fea8de03c38a968c157c8262chrismair     * Perform initialization before each test
6285efb15529d45e32fea8de03c38a968c157c8262chrismair     *
6385efb15529d45e32fea8de03c38a968c157c8262chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
6485efb15529d45e32fea8de03c38a968c157c8262chrismair     */
6585efb15529d45e32fea8de03c38a968c157c8262chrismair    protected void setUp() throws Exception {
6685efb15529d45e32fea8de03c38a968c157c8262chrismair        super.setUp();
6785efb15529d45e32fea8de03c38a968c157c8262chrismair        commandHandlerMap = new HashMap();
6885efb15529d45e32fea8de03c38a968c157c8262chrismair        outputStream = new ByteArrayOutputStream();
6985efb15529d45e32fea8de03c38a968c157c8262chrismair    }
7085efb15529d45e32fea8de03c38a968c157c8262chrismair
7185efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
7285efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test that the CommandHandler is properly initialized and passed the expected parameters
7385efb15529d45e32fea8de03c38a968c157c8262chrismair     */
7485efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testInvocationOfCommandHandler() throws Exception {
7585efb15529d45e32fea8de03c38a968c157c8262chrismair        AbstractStubCommandHandler commandHandler = new AbstractStubCommandHandler() {
7685efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session cmdSession, InvocationRecord invocationRecord) {
7785efb15529d45e32fea8de03c38a968c157c8262chrismair                assertEquals("command", COMMAND, command);
7885efb15529d45e32fea8de03c38a968c157c8262chrismair                assertSame("session", session, cmdSession);
7985efb15529d45e32fea8de03c38a968c157c8262chrismair                assertEquals("InvocationRecord: command", COMMAND, invocationRecord.getCommand());
8085efb15529d45e32fea8de03c38a968c157c8262chrismair                assertEquals("InvocationRecord: clientHost", DEFAULT_HOST, invocationRecord.getClientHost());
8185efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
8285efb15529d45e32fea8de03c38a968c157c8262chrismair            }
8385efb15529d45e32fea8de03c38a968c157c8262chrismair        };
8485efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, "");
8585efb15529d45e32fea8de03c38a968c157c8262chrismair    }
8685efb15529d45e32fea8de03c38a968c157c8262chrismair
8785efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
8885efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the close() method
8985efb15529d45e32fea8de03c38a968c157c8262chrismair     *
9085efb15529d45e32fea8de03c38a968c157c8262chrismair     * @throws IOException
9185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
9285efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testClose() throws Exception {
9385efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
9485efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
9585efb15529d45e32fea8de03c38a968c157c8262chrismair                session.close();
9685efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
9785efb15529d45e32fea8de03c38a968c157c8262chrismair            }
9885efb15529d45e32fea8de03c38a968c157c8262chrismair        };
9985efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, "");
10085efb15529d45e32fea8de03c38a968c157c8262chrismair        assertFalse("socket should not be closed", stubSocket.isClosed());
10185efb15529d45e32fea8de03c38a968c157c8262chrismair    }
10285efb15529d45e32fea8de03c38a968c157c8262chrismair
10385efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
10485efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the getClientHost() method
10585efb15529d45e32fea8de03c38a968c157c8262chrismair     *
10685efb15529d45e32fea8de03c38a968c157c8262chrismair     * @throws IOException
10785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
10885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testGetClientHost() throws Exception {
10985efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
11085efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
11185efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
11285efb15529d45e32fea8de03c38a968c157c8262chrismair            }
11385efb15529d45e32fea8de03c38a968c157c8262chrismair        };
11485efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, "");
11585efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("clientHost=" + session.getClientHost());
11685efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("clientHost", DEFAULT_HOST, session.getClientHost());
11785efb15529d45e32fea8de03c38a968c157c8262chrismair    }
11885efb15529d45e32fea8de03c38a968c157c8262chrismair
11985efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
12085efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the sendReply() method, when the specified reply text is null
12185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
12285efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSendReply_NullReplyText() throws Exception {
12385efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
12485efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
12585efb15529d45e32fea8de03c38a968c157c8262chrismair                session.sendReply(REPLY_CODE, null);
12685efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
12785efb15529d45e32fea8de03c38a968c157c8262chrismair            }
12885efb15529d45e32fea8de03c38a968c157c8262chrismair        };
12985efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, Integer.toString(REPLY_CODE));
13085efb15529d45e32fea8de03c38a968c157c8262chrismair    }
13185efb15529d45e32fea8de03c38a968c157c8262chrismair
13285efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
13385efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the sendReply() method, verifying that extra extra whitespace is trimmed from the reply text
13485efb15529d45e32fea8de03c38a968c157c8262chrismair     */
13585efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSendReply_TrimReplyText() throws Exception {
13685efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
13785efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
13885efb15529d45e32fea8de03c38a968c157c8262chrismair                session.sendReply(REPLY_CODE, " " + REPLY_TEXT + " ");
13985efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
14085efb15529d45e32fea8de03c38a968c157c8262chrismair            }
14185efb15529d45e32fea8de03c38a968c157c8262chrismair        };
14285efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, REPLY_CODE + " " + REPLY_TEXT);
14385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
14485efb15529d45e32fea8de03c38a968c157c8262chrismair
14585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
14685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the sendReply() method, when the text contains multiple lines
14785efb15529d45e32fea8de03c38a968c157c8262chrismair     */
14885efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSendReply_MultiLineText() throws Exception {
14985efb15529d45e32fea8de03c38a968c157c8262chrismair        final String MULTILINE_REPLY_TEXT = "abc\ndef\nghi\njkl";
15085efb15529d45e32fea8de03c38a968c157c8262chrismair        final String FORMATTED_MULTILINE_REPLY_TEXT = "123-abc\ndef\nghi\n123 jkl";
15185efb15529d45e32fea8de03c38a968c157c8262chrismair
15285efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
15385efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
15485efb15529d45e32fea8de03c38a968c157c8262chrismair                session.sendReply(123, MULTILINE_REPLY_TEXT);
15585efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
15685efb15529d45e32fea8de03c38a968c157c8262chrismair            }
15785efb15529d45e32fea8de03c38a968c157c8262chrismair        };
15885efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, FORMATTED_MULTILINE_REPLY_TEXT);
15985efb15529d45e32fea8de03c38a968c157c8262chrismair    }
16085efb15529d45e32fea8de03c38a968c157c8262chrismair
16185efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
16285efb15529d45e32fea8de03c38a968c157c8262chrismair     * Test the sendReply() method when the reply code has associated reply text
16385efb15529d45e32fea8de03c38a968c157c8262chrismair     */
16485efb15529d45e32fea8de03c38a968c157c8262chrismair    public void testSendReply_ReplyText() throws Exception {
16585efb15529d45e32fea8de03c38a968c157c8262chrismair        CommandHandler commandHandler = new AbstractStubCommandHandler() {
16685efb15529d45e32fea8de03c38a968c157c8262chrismair            public void handleCommand(Command command, Session session, InvocationRecord invocationRecord) {
16785efb15529d45e32fea8de03c38a968c157c8262chrismair                session.sendReply(REPLY_CODE, REPLY_TEXT);
16885efb15529d45e32fea8de03c38a968c157c8262chrismair                commandHandled = true;
16985efb15529d45e32fea8de03c38a968c157c8262chrismair            }
17085efb15529d45e32fea8de03c38a968c157c8262chrismair        };
17185efb15529d45e32fea8de03c38a968c157c8262chrismair        runCommandAndVerifyOutput(commandHandler, REPLY_CODE + " " + REPLY_TEXT);
17285efb15529d45e32fea8de03c38a968c157c8262chrismair    }
17385efb15529d45e32fea8de03c38a968c157c8262chrismair
17485efb15529d45e32fea8de03c38a968c157c8262chrismair    // -------------------------------------------------------------------------
17585efb15529d45e32fea8de03c38a968c157c8262chrismair    // Internal Helper Methods
17685efb15529d45e32fea8de03c38a968c157c8262chrismair    // -------------------------------------------------------------------------
17785efb15529d45e32fea8de03c38a968c157c8262chrismair
17885efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
17985efb15529d45e32fea8de03c38a968c157c8262chrismair     * Create and return a DefaultSession object that reads from an InputStream with the specified
18085efb15529d45e32fea8de03c38a968c157c8262chrismair     * contents and writes to the predefined outputStrean ByteArrayOutputStream. Also, save the
18185efb15529d45e32fea8de03c38a968c157c8262chrismair     * StubSocket being used in the stubSocket attribute.
18285efb15529d45e32fea8de03c38a968c157c8262chrismair     *
18385efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param inputStreamContents - the contents of the input stream
18485efb15529d45e32fea8de03c38a968c157c8262chrismair     * @return the DefaultSession
18585efb15529d45e32fea8de03c38a968c157c8262chrismair     */
18685efb15529d45e32fea8de03c38a968c157c8262chrismair    private DefaultSession createDefaultSession(CommandHandler commandHandler) {
18785efb15529d45e32fea8de03c38a968c157c8262chrismair        stubSocket = createTestSocket(COMMAND.getName());
18885efb15529d45e32fea8de03c38a968c157c8262chrismair        commandHandlerMap.put(COMMAND.getName(), commandHandler);
18985efb15529d45e32fea8de03c38a968c157c8262chrismair
19085efb15529d45e32fea8de03c38a968c157c8262chrismair        ConnectCommandHandler connectCommandHandler = new ConnectCommandHandler();
19185efb15529d45e32fea8de03c38a968c157c8262chrismair
19285efb15529d45e32fea8de03c38a968c157c8262chrismair        ResourceBundle replyTextBundle = new ListResourceBundle() {
19385efb15529d45e32fea8de03c38a968c157c8262chrismair            protected Object[][] getContents() {
19485efb15529d45e32fea8de03c38a968c157c8262chrismair                return new Object[][] {
19585efb15529d45e32fea8de03c38a968c157c8262chrismair                        { "220", "Reply for 220" },
19685efb15529d45e32fea8de03c38a968c157c8262chrismair                };
19785efb15529d45e32fea8de03c38a968c157c8262chrismair            }
19885efb15529d45e32fea8de03c38a968c157c8262chrismair        };
19985efb15529d45e32fea8de03c38a968c157c8262chrismair        connectCommandHandler.setReplyTextBundle(replyTextBundle);
20085efb15529d45e32fea8de03c38a968c157c8262chrismair        commandHandlerMap.put(CommandNames.CONNECT, connectCommandHandler);
20185efb15529d45e32fea8de03c38a968c157c8262chrismair
20285efb15529d45e32fea8de03c38a968c157c8262chrismair        return new DefaultSession(stubSocket, commandHandlerMap);
20385efb15529d45e32fea8de03c38a968c157c8262chrismair    }
20485efb15529d45e32fea8de03c38a968c157c8262chrismair
20585efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
20685efb15529d45e32fea8de03c38a968c157c8262chrismair     * Create and return a StubSocket that reads from an InputStream with the specified contents and
20785efb15529d45e32fea8de03c38a968c157c8262chrismair     * writes to the predefined outputStrean ByteArrayOutputStream.
20885efb15529d45e32fea8de03c38a968c157c8262chrismair     *
20985efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param inputStreamContents - the contents of the input stream
21085efb15529d45e32fea8de03c38a968c157c8262chrismair     * @return the StubSocket
21185efb15529d45e32fea8de03c38a968c157c8262chrismair     */
21285efb15529d45e32fea8de03c38a968c157c8262chrismair    private StubSocket createTestSocket(String inputStreamContents) {
21385efb15529d45e32fea8de03c38a968c157c8262chrismair        InputStream inputStream = new ByteArrayInputStream(inputStreamContents.getBytes());
21485efb15529d45e32fea8de03c38a968c157c8262chrismair        return new StubSocket(DEFAULT_HOST, inputStream, outputStream);
21585efb15529d45e32fea8de03c38a968c157c8262chrismair    }
21685efb15529d45e32fea8de03c38a968c157c8262chrismair
21785efb15529d45e32fea8de03c38a968c157c8262chrismair    /**
21885efb15529d45e32fea8de03c38a968c157c8262chrismair     * Run the command represented by the CommandHandler and verify that the session output from the
21985efb15529d45e32fea8de03c38a968c157c8262chrismair     * control socket contains the expected output text.
22085efb15529d45e32fea8de03c38a968c157c8262chrismair     *
22185efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param commandHandler - the CommandHandler to invoke
22285efb15529d45e32fea8de03c38a968c157c8262chrismair     * @param expectedOutput - the text expected within the session output
22385efb15529d45e32fea8de03c38a968c157c8262chrismair     * @throws InterruptedException
22485efb15529d45e32fea8de03c38a968c157c8262chrismair     */
22585efb15529d45e32fea8de03c38a968c157c8262chrismair    private void runCommandAndVerifyOutput(CommandHandler commandHandler, String expectedOutput)
22685efb15529d45e32fea8de03c38a968c157c8262chrismair            throws InterruptedException {
22785efb15529d45e32fea8de03c38a968c157c8262chrismair        session = createDefaultSession(commandHandler);
22885efb15529d45e32fea8de03c38a968c157c8262chrismair
22985efb15529d45e32fea8de03c38a968c157c8262chrismair        Thread thread = new Thread(session);
23085efb15529d45e32fea8de03c38a968c157c8262chrismair        thread.start();
23185efb15529d45e32fea8de03c38a968c157c8262chrismair
23285efb15529d45e32fea8de03c38a968c157c8262chrismair        for (int i = 0; !commandHandled && i < 10; i++) {
23385efb15529d45e32fea8de03c38a968c157c8262chrismair            Thread.sleep(50L);
23485efb15529d45e32fea8de03c38a968c157c8262chrismair        }
23585efb15529d45e32fea8de03c38a968c157c8262chrismair
23685efb15529d45e32fea8de03c38a968c157c8262chrismair        session.close();
23785efb15529d45e32fea8de03c38a968c157c8262chrismair        thread.join();
23885efb15529d45e32fea8de03c38a968c157c8262chrismair
23985efb15529d45e32fea8de03c38a968c157c8262chrismair        assertEquals("commandHandled", true, commandHandled);
24085efb15529d45e32fea8de03c38a968c157c8262chrismair
24185efb15529d45e32fea8de03c38a968c157c8262chrismair        String output = outputStream.toString().trim();
24285efb15529d45e32fea8de03c38a968c157c8262chrismair        LOG.info("output=[" + output + "]");
24385efb15529d45e32fea8de03c38a968c157c8262chrismair        assertTrue("output: expected [" + expectedOutput + "]", output.indexOf(expectedOutput) != -1);
24485efb15529d45e32fea8de03c38a968c157c8262chrismair    }
24585efb15529d45e32fea8de03c38a968c157c8262chrismair
24685efb15529d45e32fea8de03c38a968c157c8262chrismair}
247