/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.frameworks.ftpclient; import junit.framework.TestCase; import org.exoplatform.frameworks.ftpclient.client.FtpClientSession; import org.exoplatform.frameworks.ftpclient.client.FtpClientSessionImpl; import org.exoplatform.frameworks.ftpclient.commands.CmdList; import org.exoplatform.frameworks.ftpclient.commands.CmdMkd; import org.exoplatform.frameworks.ftpclient.commands.CmdPass; import org.exoplatform.frameworks.ftpclient.commands.CmdPasv; import org.exoplatform.frameworks.ftpclient.commands.CmdRetr; import org.exoplatform.frameworks.ftpclient.commands.CmdRmd; import org.exoplatform.frameworks.ftpclient.commands.CmdStor; import org.exoplatform.frameworks.ftpclient.commands.CmdSyst; import org.exoplatform.frameworks.ftpclient.commands.CmdType; import org.exoplatform.frameworks.ftpclient.commands.CmdUser; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.util.ArrayList; /** * Created by The eXo Platform SAS . * * @author Vitaly Guly * @version $Id: $ */ public class MultiThreadFtpTest extends TestCase { public static final int ITEMS_COUNT = 3; public static final int CLIENTS_COUNT = 10; protected class FtpThreadTest extends Thread { protected Log log; protected String testFolder; public FtpThreadTest(String testFolder) { log = ExoLogger.getLogger("exo.jcr.framework.command." + this); this.testFolder = testFolder; } protected void createFolders(String rootTestFolder) { try { FtpClientSession client = FtpTestConfig.getTestFtpClient(); client.connect(); assertEquals(FtpConst.Replyes.REPLY_331, client.executeCommand(new CmdUser(FtpTestConfig.USER_ID))); assertEquals(FtpConst.Replyes.REPLY_230, client.executeCommand(new CmdPass(FtpTestConfig.USER_PASS))); assertEquals(FtpConst.Replyes.REPLY_215, client.executeCommand(new CmdSyst())); assertEquals(FtpConst.Replyes.REPLY_200, client.executeCommand(new CmdType("A"))); assertEquals(FtpConst.Replyes.REPLY_227, client.executeCommand(new CmdPasv())); log.info("Verify folder exists..."); if (client.executeCommand(new CmdList(rootTestFolder)) == FtpConst.Replyes.REPLY_226) { log.info("Test folder exist. try delete it..."); assertEquals(FtpConst.Replyes.REPLY_250, client.executeCommand(new CmdRmd(rootTestFolder))); log.info("Deleted."); } for (int i1 = 1; i1 <= ITEMS_COUNT; i1++) { String folder1 = rootTestFolder + "/folder_" + i1; assertEquals(FtpConst.Replyes.REPLY_257, client.executeCommand(new CmdMkd(folder1))); for (int i2 = 1; i2 <= ITEMS_COUNT; i2++) { String folder2 = folder1.substring(0); folder2 += "/subfolder_" + i2; assertEquals(FtpConst.Replyes.REPLY_257, client.executeCommand(new CmdMkd(folder2))); for (int i3 = 0; i3 < ITEMS_COUNT; i3++) { assertEquals(FtpConst.Replyes.REPLY_227, client.executeCommand(new CmdPasv())); String file3 = folder2.substring(0); file3 += "/test_file_" + i3 + ".txt"; CmdStor cmdStor = new CmdStor(file3); byte[] fileData = new byte[256 * 4]; for (int c = 0; c < 256 * 4; c++) { fileData[c] = (byte)'A'; fileData[c] = fileData[c] += (byte)i3; } cmdStor.setFileContent(fileData); assertEquals(FtpConst.Replyes.REPLY_226, client.executeCommand(cmdStor)); log.info("File [" + file3 + "] created"); } } } client.close(); } catch (Exception exc) { log.info("Unhandled exception. " + exc.getMessage(), exc); } } public void readAllFolders(String rootTestFolder) { try { FtpClientSession client = new FtpClientSessionImpl("127.0.0.1", 21); client.connect(); assertEquals(FtpConst.Replyes.REPLY_331, client.executeCommand(new CmdUser("admin"))); assertEquals(FtpConst.Replyes.REPLY_230, client.executeCommand(new CmdPass("admin"))); assertEquals(FtpConst.Replyes.REPLY_215, client.executeCommand(new CmdSyst())); assertEquals(FtpConst.Replyes.REPLY_200, client.executeCommand(new CmdType("A"))); for (int i1 = 1; i1 <= ITEMS_COUNT; i1++) { String folder1 = rootTestFolder + "/folder_" + i1; for (int i2 = 1; i2 <= ITEMS_COUNT; i2++) { String folder2 = folder1.substring(0); folder2 += "/subfolder_" + i2; for (int i3 = 0; i3 < ITEMS_COUNT; i3++) { String file3 = folder2.substring(0); file3 += "/test_file_" + i3 + ".txt"; log.info("CurFileName - [" + file3 + "]"); assertEquals(FtpConst.Replyes.REPLY_227, client.executeCommand(new CmdPasv())); CmdRetr cmdRetr = new CmdRetr(file3); int reply = client.executeCommand(cmdRetr); log.info("RETR REPLY - " + reply); } } } client.close(); } catch (Exception exc) { log.info("Unhandled exception. " + exc.getMessage(), exc); } } public void removeAllFolders(String rootTestFolder) { log.info("Clearing..."); try { FtpClientSession client = new FtpClientSessionImpl("127.0.0.1", 21); client.connect(); assertEquals(FtpConst.Replyes.REPLY_331, client.executeCommand(new CmdUser("admin"))); assertEquals(FtpConst.Replyes.REPLY_230, client.executeCommand(new CmdPass("admin"))); assertEquals(FtpConst.Replyes.REPLY_215, client.executeCommand(new CmdSyst())); assertEquals(FtpConst.Replyes.REPLY_200, client.executeCommand(new CmdType("A"))); for (int i1 = 1; i1 <= ITEMS_COUNT; i1++) { String folder1 = rootTestFolder + "/folder_" + i1; for (int i2 = 1; i2 <= ITEMS_COUNT; i2++) { String folder2 = folder1.substring(0); folder2 += "/subfolder_" + i2; for (int i3 = 0; i3 < ITEMS_COUNT; i3++) { String file3 = folder2.substring(0); file3 += "/test_file_" + i3 + ".txt"; log.info("Try delete [" + file3 + "]..."); assertEquals(FtpConst.Replyes.REPLY_250, client.executeCommand(new CmdRmd(file3))); } log.info("Try delete [" + folder2 + "]..."); assertEquals(FtpConst.Replyes.REPLY_250, client.executeCommand(new CmdRmd(folder2))); } log.info("Try delete [" + folder1 + "]..."); assertEquals(FtpConst.Replyes.REPLY_250, client.executeCommand(new CmdRmd(folder1))); } assertEquals(FtpConst.Replyes.REPLY_250, client.executeCommand(new CmdRmd(rootTestFolder))); client.close(); } catch (Exception exc) { log.info("Unhandled exception. " + exc.getMessage(), exc); } log.info("Complete."); } public void run() { log.info("Start test..."); createFolders(testFolder); readAllFolders(testFolder); removeAllFolders(testFolder); log.info("Test complete."); } } public void testMultiThread() throws Exception { Log log = ExoLogger.getLogger("exo.jcr.framework.command.MultiThreadFtpTest"); log.info("Test..."); ArrayList<FtpThreadTest> testers = new ArrayList<FtpThreadTest>(); for (int i = 0; i < CLIENTS_COUNT; i++) { String testFolder = "/production/test_folder_" + i; FtpThreadTest curTest = new FtpThreadTest(testFolder); testers.add(curTest); curTest.start(); } try { boolean enable = true; while (enable) { enable = false; for (int i = 0; i < testers.size(); i++) { FtpThreadTest curTest = testers.get(i); if (curTest.isAlive()) { enable = true; } } Thread.sleep(100); } } catch (Exception exc) { log.info("Unhandled ecxeption. " + exc.getMessage(), exc); } log.info("Complete."); } }