177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/*
277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Copyright 2007 the original author or authors.
377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Licensed under the Apache License, Version 2.0 (the "License");
577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * you may not use this file except in compliance with the License.
677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * You may obtain a copy of the License at
777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *      http://www.apache.org/licenses/LICENSE-2.0
977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
1077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Unless required by applicable law or agreed to in writing, software
1177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * See the License for the specific language governing permissions and
1477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * limitations under the License.
1577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */
1677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpackage org.mockftpserver.stub.command;
1777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
1877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.apache.log4j.Logger;
1977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.easymock.ArgumentsMatcher;
2077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.AbstractCommandHandlerTest;
2177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.Command;
2277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.CommandNames;
2377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.command.ReplyCodes;
2477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport org.mockftpserver.core.util.AssertFailedException;
2577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
2677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairimport java.util.Arrays;
2777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
2877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair/**
2977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * Tests for the FileRetrCommandHandler class
3077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair *
3177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @author Chris Mair
3277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair * @version $Revision$ - $Date$
3377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair */
3477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismairpublic final class FileRetrCommandHandlerTest extends AbstractCommandHandlerTest {
3577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
3677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    private static final Logger LOG = Logger.getLogger(FileRetrCommandHandlerTest.class);
3777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    private static final byte BYTE1 = (byte) 7;
3877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    private static final byte BYTE2 = (byte) 21;
3977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
4077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    private FileRetrCommandHandler commandHandler;
4177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
4277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
4377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Test the constructor that takes a String, passing in a null
4477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
4577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    public void testConstructor_String_Null() {
4677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        try {
4777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            new FileRetrCommandHandler(null);
4877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            fail("Expected AssertFailedException");
4977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        }
5077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        catch (AssertFailedException expected) {
5177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            LOG.info("Expected: " + expected);
5277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        }
5377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
5477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
5577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
5677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Test the setFile(String) method, passing in a null
5777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
5877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    public void testSetFile_Null() {
5977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        try {
6077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            commandHandler.setFile(null);
6177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            fail("Expected AssertFailedException");
6277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        }
6377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        catch (AssertFailedException expected) {
6477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            LOG.info("Expected: " + expected);
6577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        }
6677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
6777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
6877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
6977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Test the handleCommand(Command,Session) method. Create a temporary (binary) file, and
7077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * make sure its contents are written back
7177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     *
7277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * @throws Exception
7377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
7477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    public void testHandleCommand() throws Exception {
7577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
7677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        final byte[] BUFFER = new byte[FileRetrCommandHandler.BUFFER_SIZE];
7777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        Arrays.fill(BUFFER, BYTE1);
7877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
7977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendReply(ReplyCodes.TRANSFER_DATA_INITIAL_OK, replyTextFor(ReplyCodes.TRANSFER_DATA_INITIAL_OK));
8077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.openDataConnection();
8177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
8277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        ArgumentsMatcher matcher = new ArgumentsMatcher() {
8377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            int counter = -1;   // will increment for each invocation
8477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
8577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            public boolean matches(Object[] expected, Object[] actual) {
8677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                counter++;
8777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                byte[] buffer = (byte[]) actual[0];
8877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                int expectedLength = ((Integer) expected[1]).intValue();
8977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                int actualLength = ((Integer) actual[1]).intValue();
9077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                LOG.info("invocation #" + counter + " expected=" + expectedLength + " actualLength=" + actualLength);
9177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                if (counter < 5) {
9277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                    assertEquals("buffer for invocation #" + counter, BUFFER, buffer);
9377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                } else {
9477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                    // TODO Got two invocations here; only expected one
9577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                    //assertEquals("length for invocation #" + counter, expectedLength, actualLength);
9677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                    assertEquals("buffer[0]", BYTE2, buffer[0]);
9777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                    assertEquals("buffer[1]", BYTE2, buffer[1]);
9877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                    assertEquals("buffer[2]", BYTE2, buffer[2]);
9977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                }
10077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                return true;
10177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            }
10277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
10377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            public String toString(Object[] args) {
10477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair                return args[0].getClass().getName() + " " + args[1].toString();
10577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            }
10677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        };
10777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
10877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendData(BUFFER, 512);
10977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        control(session).setMatcher(matcher);
11077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendData(BUFFER, 512);
11177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendData(BUFFER, 512);
11277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendData(BUFFER, 512);
11377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendData(BUFFER, 512);
11477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendData(BUFFER, 3);
11577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
11677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.closeDataConnection();
11777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        session.sendReply(ReplyCodes.TRANSFER_DATA_FINAL_OK, replyTextFor(ReplyCodes.TRANSFER_DATA_FINAL_OK));
11877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        replay(session);
11977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
12077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        commandHandler.setFile("Sample.jpg");
12177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        Command command = new Command(CommandNames.RETR, array(FILENAME1));
12277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        commandHandler.handleCommand(command, session);
12377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        verify(session);
12477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
12577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        verifyNumberOfInvocations(commandHandler, 1);
12677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        verifyOneDataElement(commandHandler.getInvocation(0), FileRetrCommandHandler.PATHNAME_KEY, FILENAME1);
12777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
12877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
12977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
13077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Test the handleCommand() method, when no pathname parameter has been specified
13177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
13277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    public void testHandleCommand_MissingPathnameParameter() throws Exception {
13377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        commandHandler.setFile("abc.txt");      // this property must be set
13477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        testHandleCommand_InvalidParameters(commandHandler, CommandNames.RETR, EMPTY);
13577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
13677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
13777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
13877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Test the HandleCommand method, when the file property has not been set
13977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
14077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    public void testHandleCommand_FileNotSet() throws Exception {
14177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        try {
14277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            commandHandler.handleCommand(new Command(CommandNames.RETR, EMPTY), session);
14377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            fail("Expected AssertFailedException");
14477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        }
14577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        catch (AssertFailedException expected) {
14677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair            LOG.info("Expected: " + expected);
14777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        }
14877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
14977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
15077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    /**
15177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * Perform initialization before each test
15277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     *
15377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     * @see org.mockftpserver.core.command.AbstractCommandHandlerTest#setUp()
15477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair     */
15577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    protected void setUp() throws Exception {
15677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        super.setUp();
15777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        commandHandler = new FileRetrCommandHandler();
15877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair        commandHandler.setReplyTextBundle(replyTextBundle);
15977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair    }
16077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
16177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//    /**
16277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//     * Create a sample binary file; 5 buffers full plus 3 extra bytes
16377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//     */
16477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//    private void createSampleFile() {
16577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        final String FILE_PATH = "test/org.mockftpserver/command/Sample.jpg";
16677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        final byte[] BUFFER = new byte[FileRetrCommandHandler.BUFFER_SIZE];
16777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        Arrays.fill(BUFFER, BYTE1);
16877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//
16977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        File file = new File(FILE_PATH);
17077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        FileOutputStream out = new FileOutputStream(file);
17177b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        for (int i = 0; i < 5; i++) {
17277b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//            out.write(BUFFER);
17377b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        }
17477b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        Arrays.fill(BUFFER, BYTE2);
17577b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        out.write(BUFFER, 0, 3);
17677b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        out.close();
17777b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//        LOG.info("Created temporary file [" + FILE_PATH + "]: length=" + file.length());
17877b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair//    }
17977b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair
18077b8661f08d1379c0bdf2af93d8004fced9f1ab0chrismair}
181