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