14bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair/*
24bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Copyright 2007 the original author or authors.
34bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
44bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Licensed under the Apache License, Version 2.0 (the "License");
54bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * you may not use this file except in compliance with the License.
64bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * You may obtain a copy of the License at
74bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
84bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *      http://www.apache.org/licenses/LICENSE-2.0
94bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
104bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Unless required by applicable law or agreed to in writing, software
114bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * distributed under the License is distributed on an "AS IS" BASIS,
124bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * See the License for the specific language governing permissions and
144bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * limitations under the License.
154bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */
164bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairpackage org.mockftpserver.core.socket;
174bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
184bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.IOException;
194bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.InputStream;
204bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.io.OutputStream;
214bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.net.InetAddress;
224bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairimport java.net.Socket;
234bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
244bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair/**
254bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * Test (fake) subclass of Socket that performs no network access and allows setting the
264bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * inputStream and OutputStream for the socket.
274bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
284bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @version $Revision$ - $Date$
294bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair *
304bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair * @author Chris Mair
314bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair */
324bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismairpublic final class StubSocket extends Socket {
334bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
344bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    private InetAddress inetAddress;
354bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    private InetAddress localAddress;
364bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    private InputStream inputStream;
374bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    private OutputStream outputStream;
384bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
394bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
404bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Construct a new instance using the specified InputStream and OutputStream
414bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @param inputStream - the InputStream to use
424bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @param outputStream - the OutputStream to use
434bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
444bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public StubSocket(InputStream inputStream, OutputStream outputStream) {
454bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        this(null, inputStream, outputStream);
464bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
474bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
484bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
494bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Construct a new instance using the specified host, InputStream and OutputStream
504bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @param inetAddress - the InetAddress for this socket
514bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @param inputStream - the InputStream to use
524bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @param outputStream - the OutputStream to use
534bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
544bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public StubSocket(InetAddress inetAddress, InputStream inputStream, OutputStream outputStream) {
554bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        this.inetAddress = inetAddress;
564bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        this.inputStream = inputStream;
574bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        this.outputStream = outputStream;
584bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
594bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
604bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
614bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Override the superclass implementation. If the local inetAddress is not null,
624bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * return that. Otherwise return super.getInetAddress().
634bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @see java.net.Socket#getInetAddress()
644bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
654bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public InetAddress getInetAddress() {
664bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        return (inetAddress != null) ? inetAddress : super.getInetAddress();
674bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
684bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
694bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
704bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Override the superclass implementation. If the local localAddress is not
714bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * null, return that. Otherwise return super.getLocalAddress();
724bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @see java.net.Socket#getLocalAddress()
734bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
744bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public InetAddress getLocalAddress() {
754bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        return (localAddress != null) ? localAddress : super.getLocalAddress();
764bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
774bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
784bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
794bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Override the superclass implementation to provide the predefined InputStream
804bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @see java.net.Socket#getInputStream()
814bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
824bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public InputStream getInputStream() throws IOException {
834bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        return inputStream;
844bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
854bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
864bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    /**
874bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * Override the superclass implementation to provide the predefined OutputStream
884bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     * @see java.net.Socket#getOutputStream()
894bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair     */
904bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public OutputStream getOutputStream() throws IOException {
914bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        return outputStream;
924bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
934bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
944bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    //-------------------------------------------------------------------------
954bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    // Test-specific helper methods
964bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    //-------------------------------------------------------------------------
974bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair
984bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    public void _setLocalAddress(InetAddress localAddress) {
994bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair        this.localAddress = localAddress;
1004bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair    }
1014bc314fb002f3e5369cd724b91e83e0c71aeeccbchrismair}
102