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