117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair/* 217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Copyright 2007 the original author or authors. 317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * 417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Licensed under the Apache License, Version 2.0 (the "License"); 517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * you may not use this file except in compliance with the License. 617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * You may obtain a copy of the License at 717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * 817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * http://www.apache.org/licenses/LICENSE-2.0 917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * 1017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Unless required by applicable law or agreed to in writing, software 1117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * distributed under the License is distributed on an "AS IS" BASIS, 1217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * See the License for the specific language governing permissions and 1417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * limitations under the License. 1517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */ 1617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairpackage org.mockftpserver.stub; 1717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 1817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.apache.commons.net.ftp.FTPClient; 1917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.apache.log4j.Logger; 2017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.Command; 2117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.CommandNames; 2217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.command.InvocationRecord; 2317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.core.session.Session; 2417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.stub.StubFtpServer; 2517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.stub.command.AbstractStubCommandHandler; 2617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.test.AbstractTest; 2717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.test.IntegrationTest; 2817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairimport org.mockftpserver.test.PortTestUtil; 2917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 3017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair/** 3117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * StubFtpServer tests for multiple FTP clients using the Apache Jakarta Commons Net FTP client. 3217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * 3317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * @version $Revision$ - $Date$ 3417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * 3517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * @author Chris Mair 3617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */ 3717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismairpublic final class StubFtpServer_MultipleClientsIntegrationTest extends AbstractTest implements 3817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair IntegrationTest { 3917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 4017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private static final Logger LOG = Logger.getLogger(StubFtpServer_MultipleClientsIntegrationTest.class); 4117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private static final String SERVER = "localhost"; 4217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 4317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Custom CommandHandler for PWD so that we can verify unique session-specific responses. 4417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Send back the hashCode for the Session as the reply text. 4517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private static class CustomPwdCommandHandler extends AbstractStubCommandHandler { 4617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair protected void handleCommand(Command command, Session session, InvocationRecord invocationRecord) throws Exception { 4717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair String replyText = quotes(Integer.toString(session.hashCode())); 4817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair sendReply(session, 257, null, replyText, null); 4917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 5017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 5117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 5217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private StubFtpServer stubFtpServer; 5317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private FTPClient ftpClient1; 5417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private FTPClient ftpClient2; 5517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair private FTPClient ftpClient3; 5617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 5717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair /** 5817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Test that multiple simultaneous clients can connect and establish sessions. 5917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */ 6017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair public void testMultipleClients() throws Exception { 6117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 6217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Connect from client 1 6317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("connect() to ftpClient1"); 6417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient1.connect(SERVER, PortTestUtil.getFtpServerControlPort()); 6517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair String sessionId1 = ftpClient1.printWorkingDirectory(); 6617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("PWD(1) reply =[" + sessionId1 + "]"); 6717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 6817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Connect from client 2 6917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("connect() to ftpClient2"); 7017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient2.connect(SERVER, PortTestUtil.getFtpServerControlPort()); 7117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair String sessionId2 = ftpClient2.printWorkingDirectory(); 7217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("PWD(2) reply =[" + sessionId2 + "]"); 7317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 7417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Connect from client 3 7517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("connect() to ftpClient3"); 7617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient3.connect(SERVER, PortTestUtil.getFtpServerControlPort()); 7717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair String sessionId3 = ftpClient3.printWorkingDirectory(); 7817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("PWD(3) reply =[" + sessionId3 + "]"); 7917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 8017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Make sure all session ids are unique 8117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair assertNotSame("sessionId1 vs sessionId2", sessionId1, sessionId2); 8217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair assertNotSame("sessionId2 vs sessionId3", sessionId2, sessionId3); 8317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair assertNotSame("sessionId1 vs sessionId3", sessionId1, sessionId3); 8417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 8517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Now make sure that the replies from the existing sessions remain consistent 8617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair assertEquals("reply from session1", sessionId1, ftpClient1.printWorkingDirectory()); 8717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair assertEquals("reply from session2", sessionId2, ftpClient2.printWorkingDirectory()); 8817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair assertEquals("reply from session3", sessionId3, ftpClient3.printWorkingDirectory()); 8917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 9017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 9117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // ------------------------------------------------------------------------- 9217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // Test setup and tear-down 9317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair // ------------------------------------------------------------------------- 9417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 9517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair /** 9617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Perform initialization before each test 9717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * @see org.mockftpserver.test.AbstractTest#setUp() 9817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */ 9917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair protected void setUp() throws Exception { 10017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair super.setUp(); 10117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 10217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair stubFtpServer = new StubFtpServer(); 10317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair stubFtpServer.setServerControlPort(PortTestUtil.getFtpServerControlPort()); 10417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair stubFtpServer.setCommandHandler(CommandNames.PWD, new CustomPwdCommandHandler()); 10517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair stubFtpServer.start(); 10617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 10717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient1 = new FTPClient(); 10817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient2 = new FTPClient(); 10917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient3 = new FTPClient(); 11017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 11117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient1.setDefaultTimeout(1000); 11217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient2.setDefaultTimeout(1000); 11317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient3.setDefaultTimeout(1000); 11417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 11517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 11617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair /** 11717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * Perform cleanup after each test 11817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair * @see org.mockftpserver.test.AbstractTest#tearDown() 11917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair */ 12017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair protected void tearDown() throws Exception { 12117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair super.tearDown(); 12217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 12317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair LOG.info("Cleaning up..."); 12417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair if (ftpClient1.isConnected()) { 12517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient1.disconnect(); 12617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 12717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair if (ftpClient2.isConnected()) { 12817f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient2.disconnect(); 12917f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 13017f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair if (ftpClient3.isConnected()) { 13117f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair ftpClient3.disconnect(); 13217f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 13317f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 13417f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair stubFtpServer.stop(); 13517f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair } 13617f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair 13717f899cea435aaf91624af2a93bc24bcfcd5fc2dchrismair} 138