1ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/*
2ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Copyright 2007 the original author or authors.
3ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
4ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * you may not use this file except in compliance with the License.
6ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * You may obtain a copy of the License at
7ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
8ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
10ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Unless required by applicable law or agreed to in writing, software
11ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * See the License for the specific language governing permissions and
14ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * limitations under the License.
15ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
16ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpackage org.mockftpserver.stub.command;
17ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
18ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.apache.log4j.Logger;
19ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.easymock.ArgumentsMatcher;
20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.Command;
21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.CommandNames;
22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.command.ReplyCodes;
23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport org.mockftpserver.core.util.AssertFailedException;
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.util.Arrays;
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Tests for the FileRetrCommandHandler class
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision$ - $Date$
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpublic final class FileRetrCommandHandlerTest extends AbstractCommandHandlerTest {
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final Logger LOG = Logger.getLogger(FileRetrCommandHandlerTest.class);
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final byte BYTE1 = (byte) 7;
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private static final byte BYTE2 = (byte) 21;
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private FileRetrCommandHandler commandHandler;
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the constructor that takes a String, passing in a null
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testConstructor_String_Null() {
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        try {
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            new FileRetrCommandHandler(null);
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            fail("Expected AssertFailedException");
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        catch (AssertFailedException expected) {
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            LOG.info("Expected: " + expected);
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the setFile(String) method, passing in a null
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testSetFile_Null() {
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        try {
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            commandHandler.setFile(null);
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            fail("Expected AssertFailedException");
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        catch (AssertFailedException expected) {
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            LOG.info("Expected: " + expected);
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the handleCommand(Command,Session) method. Create a temporary (binary) file, and
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * make sure its contents are written back
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @throws Exception
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testHandleCommand() throws Exception {
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        final byte[] BUFFER = new byte[FileRetrCommandHandler.BUFFER_SIZE];
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        Arrays.fill(BUFFER, BYTE1);
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(ReplyCodes.TRANSFER_DATA_INITIAL_OK, replyTextFor(ReplyCodes.TRANSFER_DATA_INITIAL_OK));
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.openDataConnection();
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        ArgumentsMatcher matcher = new ArgumentsMatcher() {
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            int counter = -1;   // will increment for each invocation
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            public boolean matches(Object[] expected, Object[] actual) {
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                counter++;
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                byte[] buffer = (byte[]) actual[0];
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                int expectedLength = ((Integer) expected[1]).intValue();
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                int actualLength = ((Integer) actual[1]).intValue();
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                LOG.info("invocation #" + counter + " expected=" + expectedLength + " actualLength=" + actualLength);
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                if (counter < 5) {
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                    assertEquals("buffer for invocation #" + counter, BUFFER, buffer);
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                } else {
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                    // TODO Got two invocations here; only expected one
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                    //assertEquals("length for invocation #" + counter, expectedLength, actualLength);
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                    assertEquals("buffer[0]", BYTE2, buffer[0]);
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                    assertEquals("buffer[1]", BYTE2, buffer[1]);
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                    assertEquals("buffer[2]", BYTE2, buffer[2]);
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                }
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                return true;
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
102ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            public String toString(Object[] args) {
103ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair                return args[0].getClass().getName() + " " + args[1].toString();
104ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            }
105ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        };
106ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
107ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendData(BUFFER, 512);
108ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        control(session).setMatcher(matcher);
109ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendData(BUFFER, 512);
110ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendData(BUFFER, 512);
111ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendData(BUFFER, 512);
112ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendData(BUFFER, 512);
113ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendData(BUFFER, 3);
114ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
115ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.closeDataConnection();
116ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        session.sendReply(ReplyCodes.TRANSFER_DATA_FINAL_OK, replyTextFor(ReplyCodes.TRANSFER_DATA_FINAL_OK));
117ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        replay(session);
118ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
119ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setFile("Sample.jpg");
120ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        Command command = new Command(CommandNames.RETR, array(FILENAME1));
121ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.handleCommand(command, session);
122ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        verify(session);
123ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
124ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        verifyNumberOfInvocations(commandHandler, 1);
125ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        verifyOneDataElement(commandHandler.getInvocation(0), FileRetrCommandHandler.PATHNAME_KEY, FILENAME1);
126ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
127ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
128ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
129ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the handleCommand() method, when no pathname parameter has been specified
130ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
131ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testHandleCommand_MissingPathnameParameter() throws Exception {
132ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setFile("abc.txt");      // this property must be set
133ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        testHandleCommand_InvalidParameters(commandHandler, CommandNames.RETR, EMPTY);
134ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
135ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
136ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
137ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Test the HandleCommand method, when the file property has not been set
138ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
139ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void testHandleCommand_FileNotSet() throws Exception {
140ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        try {
141ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            commandHandler.handleCommand(new Command(CommandNames.RETR, EMPTY), session);
142ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            fail("Expected AssertFailedException");
143ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
144ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        catch (AssertFailedException expected) {
145ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair            LOG.info("Expected: " + expected);
146ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        }
147ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
148ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
149ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
150ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Perform initialization before each test
151ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     *
152ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see org.mockftpserver.stub.command.AbstractCommandHandlerTest#setUp()
153ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
154ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    protected void setUp() throws Exception {
155ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        super.setUp();
156ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler = new FileRetrCommandHandler();
157ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        commandHandler.setReplyTextBundle(replyTextBundle);
158ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
159ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
160ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//    /**
161ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//     * Create a sample binary file; 5 buffers full plus 3 extra bytes
162ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//     */
163ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//    private void createSampleFile() {
164ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        final String FILE_PATH = "test/org.mockftpserver/command/Sample.jpg";
165ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        final byte[] BUFFER = new byte[FileRetrCommandHandler.BUFFER_SIZE];
166ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        Arrays.fill(BUFFER, BYTE1);
167ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//
168ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        File file = new File(FILE_PATH);
169ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        FileOutputStream out = new FileOutputStream(file);
170ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        for (int i = 0; i < 5; i++) {
171ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//            out.write(BUFFER);
172ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        }
173ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        Arrays.fill(BUFFER, BYTE2);
174ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        out.write(BUFFER, 0, 3);
175ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        out.close();
176ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//        LOG.info("Created temporary file [" + FILE_PATH + "]: length=" + file.length());
177ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair//    }
178ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
179ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}
180