177391c2a01ce1fed085906743cc240a4d58edd92chrismair/*
277391c2a01ce1fed085906743cc240a4d58edd92chrismair * Copyright 2007 the original author or authors.
377391c2a01ce1fed085906743cc240a4d58edd92chrismair *
477391c2a01ce1fed085906743cc240a4d58edd92chrismair * Licensed under the Apache License, Version 2.0 (the "License");
577391c2a01ce1fed085906743cc240a4d58edd92chrismair * you may not use this file except in compliance with the License.
677391c2a01ce1fed085906743cc240a4d58edd92chrismair * You may obtain a copy of the License at
777391c2a01ce1fed085906743cc240a4d58edd92chrismair *
877391c2a01ce1fed085906743cc240a4d58edd92chrismair *      http://www.apache.org/licenses/LICENSE-2.0
977391c2a01ce1fed085906743cc240a4d58edd92chrismair *
1077391c2a01ce1fed085906743cc240a4d58edd92chrismair * Unless required by applicable law or agreed to in writing, software
1177391c2a01ce1fed085906743cc240a4d58edd92chrismair * distributed under the License is distributed on an "AS IS" BASIS,
1277391c2a01ce1fed085906743cc240a4d58edd92chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377391c2a01ce1fed085906743cc240a4d58edd92chrismair * See the License for the specific language governing permissions and
1477391c2a01ce1fed085906743cc240a4d58edd92chrismair * limitations under the License.
1577391c2a01ce1fed085906743cc240a4d58edd92chrismair */
1677391c2a01ce1fed085906743cc240a4d58edd92chrismairpackage org.mockftpserver.core.socket;
1777391c2a01ce1fed085906743cc240a4d58edd92chrismair
1877391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.io.IOException;
1977391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.net.ServerSocket;
2077391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.net.Socket;
2177391c2a01ce1fed085906743cc240a4d58edd92chrismairimport java.net.SocketTimeoutException;
2277391c2a01ce1fed085906743cc240a4d58edd92chrismair
2377391c2a01ce1fed085906743cc240a4d58edd92chrismair/**
2477391c2a01ce1fed085906743cc240a4d58edd92chrismair * Test (fake) subclass of ServerSocket that performs no network access and allows setting the
2577391c2a01ce1fed085906743cc240a4d58edd92chrismair * Socket returned by accept(), and the local port for the ServerSocket.
2677391c2a01ce1fed085906743cc240a4d58edd92chrismair *
2777391c2a01ce1fed085906743cc240a4d58edd92chrismair * @version $Revision$ - $Date$
2877391c2a01ce1fed085906743cc240a4d58edd92chrismair *
2977391c2a01ce1fed085906743cc240a4d58edd92chrismair * @author Chris Mair
3077391c2a01ce1fed085906743cc240a4d58edd92chrismair */
3177391c2a01ce1fed085906743cc240a4d58edd92chrismairpublic class StubServerSocket extends ServerSocket {
3277391c2a01ce1fed085906743cc240a4d58edd92chrismair    private int localPort;
3377391c2a01ce1fed085906743cc240a4d58edd92chrismair    private Socket socket;
3477391c2a01ce1fed085906743cc240a4d58edd92chrismair
3577391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
3677391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Construct a new instance with the specified local port.
3777391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param localPort - the local port to be returned from getLocalPort()
3877391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @throws IOException
3977391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
4077391c2a01ce1fed085906743cc240a4d58edd92chrismair    public StubServerSocket(int localPort) throws IOException {
4177391c2a01ce1fed085906743cc240a4d58edd92chrismair        this(localPort, null);
4277391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
4377391c2a01ce1fed085906743cc240a4d58edd92chrismair
4477391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
4577391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Construct a new instance with specified local port and accept() socket.
4677391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param localPort - the local port to be returned from getLocalPort()
4777391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @param socket - the socket to be returned from accept(); if null, then accept() throws SocketTimeoutException.
4877391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @throws IOException
4977391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
5077391c2a01ce1fed085906743cc240a4d58edd92chrismair    public StubServerSocket(int localPort, Socket socket) throws IOException {
5177391c2a01ce1fed085906743cc240a4d58edd92chrismair        super(0);
5277391c2a01ce1fed085906743cc240a4d58edd92chrismair        this.localPort = localPort;
5377391c2a01ce1fed085906743cc240a4d58edd92chrismair        this.socket = socket;
5477391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
5577391c2a01ce1fed085906743cc240a4d58edd92chrismair
5677391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
5777391c2a01ce1fed085906743cc240a4d58edd92chrismair     * Return the predefined local port
5877391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @see java.net.ServerSocket#getLocalPort()
5977391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
6077391c2a01ce1fed085906743cc240a4d58edd92chrismair    public int getLocalPort() {
6177391c2a01ce1fed085906743cc240a4d58edd92chrismair        return localPort;
6277391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
6377391c2a01ce1fed085906743cc240a4d58edd92chrismair
6477391c2a01ce1fed085906743cc240a4d58edd92chrismair    /**
6577391c2a01ce1fed085906743cc240a4d58edd92chrismair     * If a socket was specified on the constructor, then return that; otherwise, throw a SocketTimeoutException.
6677391c2a01ce1fed085906743cc240a4d58edd92chrismair     * @see java.net.ServerSocket#accept()
6777391c2a01ce1fed085906743cc240a4d58edd92chrismair     */
6877391c2a01ce1fed085906743cc240a4d58edd92chrismair    public Socket accept() throws IOException {
6977391c2a01ce1fed085906743cc240a4d58edd92chrismair        if (socket != null) {
7077391c2a01ce1fed085906743cc240a4d58edd92chrismair            return socket;
7177391c2a01ce1fed085906743cc240a4d58edd92chrismair        }
7277391c2a01ce1fed085906743cc240a4d58edd92chrismair        throw new SocketTimeoutException();
7377391c2a01ce1fed085906743cc240a4d58edd92chrismair    }
7477391c2a01ce1fed085906743cc240a4d58edd92chrismair}
75