193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair/*
293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Copyright 2007 the original author or authors.
393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Licensed under the Apache License, Version 2.0 (the "License");
593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * you may not use this file except in compliance with the License.
693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * You may obtain a copy of the License at
793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *      http://www.apache.org/licenses/LICENSE-2.0
993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
1093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Unless required by applicable law or agreed to in writing, software
1193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * See the License for the specific language governing permissions and
1493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * limitations under the License.
1593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair */
1693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairpackage org.mockftpserver.core.socket;
1793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
1893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport java.io.IOException;
1993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport java.net.ServerSocket;
2093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport java.net.Socket;
2193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairimport java.net.SocketTimeoutException;
2293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
2393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair/**
2493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Test (fake) subclass of ServerSocket that performs no network access and allows setting the
2593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * Socket returned by accept(), and the local port for the ServerSocket.
2693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
274ca3386623ce60063f27955ad1b2b1b6cbba8b09chrismair * @version $Revision$ - $Date$
2893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair *
2993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair * @author Chris Mair
3093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair */
3193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismairpublic class StubServerSocket extends ServerSocket {
3293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private int localPort;
3393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    private Socket socket;
3493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
3593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
3693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Construct a new instance with the specified local port.
3793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @param localPort - the local port to be returned from getLocalPort()
3893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @throws IOException
3993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
4093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public StubServerSocket(int localPort) throws IOException {
4193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        this(localPort, null);
4293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
4393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
4493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
4593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Construct a new instance with specified local port and accept() socket.
4693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @param localPort - the local port to be returned from getLocalPort()
4793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @param socket - the socket to be returned from accept(); if null, then accept() throws SocketTimeoutException.
4893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @throws IOException
4993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
5093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public StubServerSocket(int localPort, Socket socket) throws IOException {
5193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        super(0);
5293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        this.localPort = localPort;
5393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        this.socket = socket;
5493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
5593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
5693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
5793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * Return the predefined local port
5893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @see java.net.ServerSocket#getLocalPort()
5993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
6093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public int getLocalPort() {
6193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        return localPort;
6293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
6393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair
6493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    /**
6593102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * If a socket was specified on the constructor, then return that; otherwise, throw a SocketTimeoutException.
6693102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     * @see java.net.ServerSocket#accept()
6793102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair     */
6893102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    public Socket accept() throws IOException {
6993102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        if (socket != null) {
7093102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair            return socket;
7193102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        }
7293102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair        throw new SocketTimeoutException();
7393102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair    }
7493102446a7b7c3d17888064b4e2e4e5cb534e6d0chrismair}
75