12ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/*
22ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Copyright 2007 the original author or authors.
32ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
42ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Licensed under the Apache License, Version 2.0 (the "License");
52ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * you may not use this file except in compliance with the License.
62ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * You may obtain a copy of the License at
72ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
82ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *      http://www.apache.org/licenses/LICENSE-2.0
92ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
102ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Unless required by applicable law or agreed to in writing, software
112ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * distributed under the License is distributed on an "AS IS" BASIS,
122ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * See the License for the specific language governing permissions and
142ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * limitations under the License.
152ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
162ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpackage org.mockftpserver.core.socket;
172ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
182ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport java.io.IOException;
192ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport java.net.ServerSocket;
202ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport java.net.Socket;
212ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairimport java.net.SocketTimeoutException;
222ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
232ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair/**
242ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Test (fake) subclass of ServerSocket that performs no network access and allows setting the
252ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * Socket returned by accept(), and the local port for the ServerSocket.
262ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
272ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @version $Revision$ - $Date$
282ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair *
292ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair * @author Chris Mair
302ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair */
312ab05e83458f35931075adca0d7b0fce4ea7cccbchrismairpublic class StubServerSocket extends ServerSocket {
322ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private int localPort;
332ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    private Socket socket;
342ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
352ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
362ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Construct a new instance with the specified local port.
372ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param localPort - the local port to be returned from getLocalPort()
382ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws IOException
392ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
402ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public StubServerSocket(int localPort) throws IOException {
412ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this(localPort, null);
422ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
432ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
442ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
452ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Construct a new instance with specified local port and accept() socket.
462ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param localPort - the local port to be returned from getLocalPort()
472ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @param socket - the socket to be returned from accept(); if null, then accept() throws SocketTimeoutException.
482ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @throws IOException
492ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
502ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public StubServerSocket(int localPort, Socket socket) throws IOException {
512ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        super(0);
522ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.localPort = localPort;
532ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        this.socket = socket;
542ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
552ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
562ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
572ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * Return the predefined local port
582ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @see java.net.ServerSocket#getLocalPort()
592ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
602ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public int getLocalPort() {
612ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        return localPort;
622ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
632ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair
642ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    /**
652ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * If a socket was specified on the constructor, then return that; otherwise, throw a SocketTimeoutException.
662ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     * @see java.net.ServerSocket#accept()
672ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair     */
682ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    public Socket accept() throws IOException {
692ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        if (socket != null) {
702ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair            return socket;
712ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        }
722ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair        throw new SocketTimeoutException();
732ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair    }
742ab05e83458f35931075adca0d7b0fce4ea7cccbchrismair}
75