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.stub;
17e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
18e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.ByteArrayInputStream;
19e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport java.io.ByteArrayOutputStream;
20e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
21e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
22e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.commons.net.ftp.FTP;
23e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.commons.net.ftp.FTPClient;
24e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.commons.net.ftp.FTPFile;
25e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.apache.log4j.Logger;
26e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.CommandHandler;
27e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.CommandNames;
28e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.InvocationRecord;
29e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.SimpleCompositeCommandHandler;
30e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.core.command.StaticReplyCommandHandler;
31e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.StubFtpServer;
32e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.AppeCommandHandler;
33e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.CwdCommandHandler;
34e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.HelpCommandHandler;
35e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.ListCommandHandler;
36e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.NlstCommandHandler;
37e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.PwdCommandHandler;
38e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.RetrCommandHandler;
39e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.StatCommandHandler;
40e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.StorCommandHandler;
41e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.stub.command.StouCommandHandler;
42e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.test.AbstractTest;
43e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairimport org.mockftpserver.test.IntegrationTest;
44e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
45e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair/**
46e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * Tests for StubFtpServer using the Apache Jakarta Commons Net FTP client.
47e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
48e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @version $Revision$ - $Date$
49e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair *
50e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair * @author Chris Mair
51e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair */
52e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismairpublic final class StubFtpServerIntegrationTest extends AbstractTest implements IntegrationTest {
53e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
54e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final Logger LOG = Logger.getLogger(StubFtpServerIntegrationTest.class);
55e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final String SERVER = "localhost";
56e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final String USERNAME = "user123";
57e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final String PASSWORD = "password";
58e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final String FILENAME = "abc.txt";
59e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final String ASCII_CONTENTS = "abcdef\r\nghijkl\r\nmnopqr";
60e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private static final byte[] BINARY_CONTENTS = new byte[256];
61e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
62e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private StubFtpServer stubFtpServer;
63e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private FTPClient ftpClient;
64e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private RetrCommandHandler retrCommandHandler;
65e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private StorCommandHandler storCommandHandler;
66e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
67e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    //-------------------------------------------------------------------------
68e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // Tests
69e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    //-------------------------------------------------------------------------
70e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
71e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
72e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test connecting and logging in
73e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
74e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testLogin() throws Exception {
75e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Connect
76e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Conecting to " + SERVER);
77e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
78e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("connect", 220);
79e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
80e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Login
81e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String userAndPassword = USERNAME + "/" + PASSWORD;
82e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Logging in as " + userAndPassword);
83e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.login(USERNAME, PASSWORD);
84e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to login with " + userAndPassword, success);
85e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("login with " + userAndPassword, 230);
86e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
87e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Quit
88e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Quit");
89e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.quit();
90e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("quit", 221);
91e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
92e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
93e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
94e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the ACCT command
95e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
96e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testAcct() throws Exception {
97e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
98e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
99e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // ACCT
100e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        int replyCode = ftpClient.acct("123456");
101e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("acct", 230, replyCode);
102e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
103e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
104e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
105e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the stop() method when no session has ever been started
106e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
107e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testStop_NoSessionEverStarted() throws Exception {
108e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Testing a stop() when no session has ever been started");
109e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
110e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
111e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
112e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test help (HELP)
113e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
114e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testHelp() throws Exception {
115e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Modify HELP CommandHandler to return a predefined help message
116e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String HELP = "help message";
117e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        HelpCommandHandler helpCommandHandler = (HelpCommandHandler) stubFtpServer.getCommandHandler(CommandNames.HELP);
118e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        helpCommandHandler.setHelpMessage(HELP);
119e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
120e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
121e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
122e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // HELP
123e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String help = ftpClient.listHelp();
124e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Wrong response", help.indexOf(HELP) != -1);
125e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("listHelp", 214);
126e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
127e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
128e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
129e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the LIST and SYST commands.
130e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
131e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testList() throws Exception {
132e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
133e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
134e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Set directory listing
135e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
136e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log\n"
137e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair                + "11-01-01 1:30PM <DIR> 0 archive");
138e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
139e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // LIST
140e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        FTPFile[] files = ftpClient.listFiles();
141e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("number of files", 2, files.length);
142e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyFTPFile(files[0], FTPFile.FILE_TYPE, "File2350.log", 406348L);
143e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyFTPFile(files[1], FTPFile.DIRECTORY_TYPE, "archive", 0L);
144e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("list", 226);
145e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
146e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
147e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
148e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the LIST, PASV and SYST commands, transferring a directory listing in passive mode
149e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
150e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testList_PassiveMode() throws Exception {
151e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
152e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
153e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.enterLocalPassiveMode();
154e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
155e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Set directory listing
156e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ListCommandHandler listCommandHandler = (ListCommandHandler) stubFtpServer.getCommandHandler(CommandNames.LIST);
157e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        listCommandHandler.setDirectoryListing("11-09-01 12:30PM  406348 File2350.log");
158e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
159e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // LIST
160e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        FTPFile[] files = ftpClient.listFiles();
161e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("number of files", 1, files.length);
162e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("list", 226);
163e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
164e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
165e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
166e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the NLST command.
167e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
168e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testNlst() throws Exception {
169e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
170e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
171e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Set directory listing
172e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        NlstCommandHandler nlstCommandHandler = (NlstCommandHandler) stubFtpServer.getCommandHandler(CommandNames.NLST);
173e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        nlstCommandHandler.setDirectoryListing("File1.txt\nfile2.data");
174e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
175e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // NLST
176e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String[] filenames = ftpClient.listNames();
177e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("number of files", 2, filenames.length);
178e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals(filenames[0], "File1.txt");
179e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals(filenames[1], "file2.data");
180e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("listNames", 226);
181e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
182e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
183e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
184e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test printing the current working directory (PWD)
185e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
186e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testPwd() throws Exception {
187e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Modify PWD CommandHandler to return a predefined directory
188e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String DIR = "some/dir";
189e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        PwdCommandHandler pwdCommandHandler = (PwdCommandHandler) stubFtpServer.getCommandHandler(CommandNames.PWD);
190e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        pwdCommandHandler.setDirectory(DIR);
191e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
192e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
193e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
194e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // PWD
195e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String dir = ftpClient.printWorkingDirectory();
196e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("Unable to PWD", DIR, dir);
197e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("printWorkingDirectory", 257);
198e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
199e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
200e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
201e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test getting the status (STAT)
202e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
203e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testStat() throws Exception {
204e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Modify Stat CommandHandler to return predefined text
205e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String STATUS = "some information 123";
206e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
207e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        statCommandHandler.setStatus(STATUS);
208e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
209e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
210e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
211e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // STAT
212e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String status = ftpClient.getStatus();
213e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("STAT reply", "211 " + STATUS + ".", status.trim());
214e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("getStatus", 211);
215e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
216e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
217e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
218e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test getting the status (STAT), when the reply text contains multiple lines
219e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
220e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testStat_MultilineReplyText() throws Exception {
221e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Modify Stat CommandHandler to return predefined text
222e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String STATUS = "System name: abc.def\nVersion 3.5.7\nNumber of failed logins: 2";
223e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final String FORMATTED_REPLY_STATUS = "211-System name: abc.def\r\nVersion 3.5.7\r\n211 Number of failed logins: 2.";
224e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        StatCommandHandler statCommandHandler = (StatCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STAT);
225e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        statCommandHandler.setStatus(STATUS);
226e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
227e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
228e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
229e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // STAT
230e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        String status = ftpClient.getStatus();
231e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("STAT reply", FORMATTED_REPLY_STATUS, status.trim());
232e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("getStatus", 211);
233e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
234e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
235e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
236e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the System (SYST) command
237e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
238e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSyst() throws Exception {
239e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
240e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
241e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // SYST
242e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("getSystemName()", "\"WINDOWS\" system type.", ftpClient.getSystemName());
243e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("syst", 215);
244e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
245e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
246e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
247e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test changing the current working directory (CWD)
248e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
249e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testCwd() throws Exception {
250e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Connect
251e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Conecting to " + SERVER);
252e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
253e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("connect", 220);
254e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
255e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // CWD
256e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
257e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to CWD", success);
258e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("changeWorkingDirectory", 250);
259e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
260e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
261e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
262e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test changing the current working directory (CWD), when it causes a remote error
263e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
264e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testCwd_Error() throws Exception {
265e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Override CWD CommandHandler to return error reply code
266e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        final int REPLY_CODE = 500;
267e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        StaticReplyCommandHandler cwdCommandHandler = new StaticReplyCommandHandler(REPLY_CODE);
268e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stubFtpServer.setCommandHandler("CWD", cwdCommandHandler);
269e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
270e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
271e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
272e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // CWD
273e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.changeWorkingDirectory("dir1/dir2");
274e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertFalse("Expected failure", success);
275e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("changeWorkingDirectory", REPLY_CODE);
276e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
277e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
278e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
279e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test changing to the parent directory (CDUP)
280e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
281e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testCdup() throws Exception {
282e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
283e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
284e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // CDUP
285e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.changeToParentDirectory();
286e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to CDUP", success);
287e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("changeToParentDirectory", 250);
288e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
289e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
290e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
291e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test delete (DELE)
292e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
293e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testDele() throws Exception {
294e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
295e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
296e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // DELE
297e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.deleteFile(FILENAME);
298e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to DELE", success);
299e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("deleteFile", 250);
300e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
301e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
302e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
303e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test make directory (MKD)
304e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
305e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testMkd() throws Exception {
306e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
307e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
308e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // MKD
309e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.makeDirectory("dir1/dir2");
310e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to CWD", success);
311e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("makeDirectory", 257);
312e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
313e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
314e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
315e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test NOOP
316e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
317e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testNoop() throws Exception {
318e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
319e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
320e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // NOOP
321e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.sendNoOp();
322e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to NOOP", success);
323e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("NOOP", 200);
324e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
325e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
326e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
327e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test restart (REST)
328e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
329e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testRest() throws Exception {
330e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
331e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
332e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // REST
333e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        int replyCode = ftpClient.rest("marker");
334e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("Unable to REST", 350, replyCode);
335e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
336e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
337e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
338e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test changing the current working directory (RMD)
339e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
340e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testRmd() throws Exception {
341e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
342e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
343e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // RMD
344e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.removeDirectory("dir1/dir2");
345e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to RMD", success);
346e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("removeDirectory", 250);
347e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
348e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
349e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
350e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test rename (RNFR/RNTO)
351e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
352e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testRename() throws Exception {
353e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
354e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
355e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Rename (RNFR, RNTO)
356e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.rename(FILENAME, "new_" + FILENAME);
357e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to RENAME", success);
358e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("rename", 250);
359e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
360e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
361e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
362e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the ALLO command
363e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
364e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testAllo() throws Exception {
365e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
366e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
367e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // ALLO
368e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("ALLO", ftpClient.allocate(1024));
369e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("ALLO with recordSize", ftpClient.allocate(1024, 64));
370e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
371e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
372e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
373e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test GET and PUT of ASCII files
374e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
375e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testTransferAsciiFile() throws Exception {
376e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        retrCommandHandler.setFileContents(ASCII_CONTENTS);
377e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
378e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
379e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
380e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Get File
381e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
382e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
383e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue(ftpClient.retrieveFile(FILENAME, outputStream));
384e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("File contents=[" + outputStream.toString());
385e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("File contents", ASCII_CONTENTS, outputStream.toString());
386e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
387e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Put File
388e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
389e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
390e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue(ftpClient.storeFile(FILENAME, inputStream));
391e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
392e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
393e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("File contents=[" + contents + "]");
394e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
395e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
396e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
397e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
398e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test GET and PUT of binary files
399e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
400e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testTransferBinaryFiles() throws Exception {
401e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        retrCommandHandler.setFileContents(BINARY_CONTENTS);
402e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
403e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
404e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
405e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
406e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Get File
407e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Get File for remotePath [" + FILENAME + "]");
408e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
409e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("GET", ftpClient.retrieveFile(FILENAME, outputStream));
410e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("GET File length=" + outputStream.size());
411e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("File contents", BINARY_CONTENTS, outputStream.toByteArray());
412e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
413e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Put File
414e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Put File for local path [" + FILENAME + "]");
415e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(BINARY_CONTENTS);
416e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("PUT", ftpClient.storeFile(FILENAME, inputStream));
417e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        InvocationRecord invocationRecord = storCommandHandler.getInvocation(0);
418e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
419e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("PUT File length=" + contents.length);
420e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("File contents", BINARY_CONTENTS, contents);
421e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
422e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
423e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
424e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the STOU command
425e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
426e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testStou() throws Exception {
427e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        StouCommandHandler stouCommandHandler = (StouCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOU);
428e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stouCommandHandler.setFilename(FILENAME);
429e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
430e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
431e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
432e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Stor a File (STOU)
433e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
434e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue(ftpClient.storeUniqueFile(FILENAME, inputStream));
435e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        InvocationRecord invocationRecord = stouCommandHandler.getInvocation(0);
436e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        byte[] contents = (byte[]) invocationRecord.getObject(StorCommandHandler.FILE_CONTENTS_KEY);
437e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("File contents=[" + contents + "]");
438e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
439e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
440e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
441e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
442e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the APPE command
443e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
444e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testAppe() throws Exception {
445e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        AppeCommandHandler appeCommandHandler = (AppeCommandHandler) stubFtpServer.getCommandHandler(CommandNames.APPE);
446e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
447e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
448e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
449e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Append a File (APPE)
450e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ByteArrayInputStream inputStream = new ByteArrayInputStream(ASCII_CONTENTS.getBytes());
451e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue(ftpClient.appendFile(FILENAME, inputStream));
452e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        InvocationRecord invocationRecord = appeCommandHandler.getInvocation(0);
453e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        byte[] contents = (byte[]) invocationRecord.getObject(AppeCommandHandler.FILE_CONTENTS_KEY);
454e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("File contents=[" + contents + "]");
455e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("File contents", ASCII_CONTENTS.getBytes(), contents);
456e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
457e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
458e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
459e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the ABOR command
460e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
461e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testAbor() throws Exception {
462e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
463e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
464e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // ABOR
465e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("ABOR", ftpClient.abort());
466e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
467e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
468e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
469e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the Passive (PASV) command
470e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
471e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testPasv() throws Exception {
472e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
473e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
474e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // PASV
475e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.enterLocalPassiveMode();
476e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // no reply code; the PASV command is sent only when the data connection is opened
477e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
478e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
479e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
480e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test Mode (MODE)
481e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    */
482e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testMode() throws Exception {
483e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
484e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
485e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // MODE
486e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
487e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to MODE", success);
488e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("setFileTransferMode", 200);
489e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
490e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
491e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
492e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test file structure (STRU)
493e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
494e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testStru() throws Exception {
495e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
496e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
497e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // STRU
498e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        boolean success = ftpClient.setFileStructure(FTP.FILE_STRUCTURE);
499e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("Unable to STRU", success);
500e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("setFileStructure", 200);
501e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
502e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
503e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
504e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test the SimpleCompositeCommandHandler
505e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
506e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSimpleCompositeCommandHandler() throws Exception {
507e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Replace CWD CommandHandler with a SimpleCompositeCommandHandler
508e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler1 = new StaticReplyCommandHandler(500);
509e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        CommandHandler commandHandler2 = new CwdCommandHandler();
510e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        SimpleCompositeCommandHandler simpleCompositeCommandHandler = new SimpleCompositeCommandHandler();
511e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler1);
512e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        simpleCompositeCommandHandler.addCommandHandler(commandHandler2);
513e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stubFtpServer.setCommandHandler("CWD", simpleCompositeCommandHandler);
514e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
515e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // Connect
516e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
517e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
518e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // CWD
519e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertFalse("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
520e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("first", ftpClient.changeWorkingDirectory("dir1/dir2"));
521e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
522e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
523e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
524e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test site parameters (SITE)
525e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
526e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSite() throws Exception {
527e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
528e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
529e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // SITE
530e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        int replyCode = ftpClient.site("parameters,1,2,3");
531e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("SITE", 200, replyCode);
532e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
533e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
534e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
535e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test structure mount (SMNT)
536e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
537e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testSmnt() throws Exception {
538e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
539e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
540e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // SMNT
541e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertTrue("SMNT", ftpClient.structureMount("dir1/dir2"));
542e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        verifyReplyCode("structureMount", 250);
543e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
544e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
545e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
546e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test reinitialize (REIN)
547e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
548e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testRein() throws Exception {
549e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
550e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
551e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        // REIN
552e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("REIN", 220, ftpClient.rein());
553e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
554e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
555e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
556e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Test that command names in lowercase or mixed upper/lower case are accepted
557e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
558e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    public void testCommandNamesInLowerOrMixedCase() throws Exception {
559e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient.connect(SERVER);
560e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
561e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("rein", 220, ftpClient.sendCommand("rein"));
562e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("rEIn", 220, ftpClient.sendCommand("rEIn"));
563e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("reiN", 220, ftpClient.sendCommand("reiN"));
564e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("Rein", 220, ftpClient.sendCommand("Rein"));
565e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
566e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
567e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // -------------------------------------------------------------------------
568e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // Test setup and tear-down
569e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // -------------------------------------------------------------------------
570e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
571e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
572e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Perform initialization before each test
573e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @see org.mockftpserver.test.AbstractTest#setUp()
574e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
575e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    protected void setUp() throws Exception {
576e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        super.setUp();
577e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
578e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        for (int i = 0; i < BINARY_CONTENTS.length; i++) {
579e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair            BINARY_CONTENTS[i] = (byte) i;
580e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        }
581e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
582e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stubFtpServer = new StubFtpServer();
583e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stubFtpServer.start();
584e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        ftpClient = new FTPClient();
585e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        retrCommandHandler = (RetrCommandHandler) stubFtpServer.getCommandHandler(CommandNames.RETR);
586e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        storCommandHandler = (StorCommandHandler) stubFtpServer.getCommandHandler(CommandNames.STOR);
587e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
588e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
589e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
590e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Perform cleanup after each test
591e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @see org.mockftpserver.test.AbstractTest#tearDown()
592e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
593e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    protected void tearDown() throws Exception {
594e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        super.tearDown();
595e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        stubFtpServer.stop();
596e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
597e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
598e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // -------------------------------------------------------------------------
599e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // Internal Helper Methods
600e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    // -------------------------------------------------------------------------
601e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
602e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
603e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Assert that the FtpClient reply code is equal to the expected value
604e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
605e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param operation - the description of the operation performed; used in the error message
606e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param expectedReplyCode - the expected FtpClient reply code
607e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
608e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private void verifyReplyCode(String operation, int expectedReplyCode) {
609e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        int replyCode = ftpClient.getReplyCode();
610e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info("Reply: operation=\"" + operation + "\" replyCode=" + replyCode);
611e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("Unexpected replyCode for " + operation, expectedReplyCode, replyCode);
612e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
613e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
614e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    /**
615e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * Verify that the FTPFile has the specified properties
616e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     *
617e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param ftpFile - the FTPFile to verify
618e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param type - the expected file type
619e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param name - the expected file name
620e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     * @param size - the expected file size (will be zero for a directory)
621e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair     */
622e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    private void verifyFTPFile(FTPFile ftpFile, int type, String name, long size) {
623e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        LOG.info(ftpFile);
624e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("type: " + ftpFile, type, ftpFile.getType());
625e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("name: " + ftpFile, name, ftpFile.getName());
626e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair        assertEquals("size: " + ftpFile, size, ftpFile.getSize());
627e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair    }
628e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair
629e47352fb2508e2b25f003b8df12fa79c3215b4b1chrismair}
630