1ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/*
2ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Copyright 2007 the original author or authors.
3ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
4ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Licensed under the Apache License, Version 2.0 (the "License");
5ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * you may not use this file except in compliance with the License.
6ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * You may obtain a copy of the License at
7ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
8ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *      http://www.apache.org/licenses/LICENSE-2.0
9ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
10ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Unless required by applicable law or agreed to in writing, software
11ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * distributed under the License is distributed on an "AS IS" BASIS,
12ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * See the License for the specific language governing permissions and
14ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * limitations under the License.
15ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
16ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpackage org.mockftpserver.core.socket;
17ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
18ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.io.IOException;
19ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.io.InputStream;
20ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.io.OutputStream;
21ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.net.InetAddress;
22ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairimport java.net.Socket;
23ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
24ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair/**
25ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * Test (fake) subclass of Socket that performs no network access and allows setting the
26ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * inputStream and OutputStream for the socket.
27ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
28ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @version $Revision$ - $Date$
29ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair *
30ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair * @author Chris Mair
31ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair */
32ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismairpublic final class StubSocket extends Socket {
33ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
34ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private InetAddress inetAddress;
35ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private InetAddress localAddress;
36ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private InputStream inputStream;
37ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    private OutputStream outputStream;
38ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
39ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
40ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Construct a new instance using the specified InputStream and OutputStream
41ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param inputStream - the InputStream to use
42ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param outputStream - the OutputStream to use
43ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
44ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public StubSocket(InputStream inputStream, OutputStream outputStream) {
45ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this(null, inputStream, outputStream);
46ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
47ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
48ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
49ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Construct a new instance using the specified host, InputStream and OutputStream
50ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param inetAddress - the InetAddress for this socket
51ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param inputStream - the InputStream to use
52ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @param outputStream - the OutputStream to use
53ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
54ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public StubSocket(InetAddress inetAddress, InputStream inputStream, OutputStream outputStream) {
55ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.inetAddress = inetAddress;
56ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.inputStream = inputStream;
57ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.outputStream = outputStream;
58ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
59ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
60ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
61ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Override the superclass implementation. If the local inetAddress is not null,
62ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * return that. Otherwise return super.getInetAddress().
63ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see java.net.Socket#getInetAddress()
64ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
65ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public InetAddress getInetAddress() {
66ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return (inetAddress != null) ? inetAddress : super.getInetAddress();
67ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
68ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
69ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
70ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Override the superclass implementation. If the local localAddress is not
71ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * null, return that. Otherwise return super.getLocalAddress();
72ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see java.net.Socket#getLocalAddress()
73ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
74ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public InetAddress getLocalAddress() {
75ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return (localAddress != null) ? localAddress : super.getLocalAddress();
76ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
77ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
78ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
79ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Override the superclass implementation to provide the predefined InputStream
80ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see java.net.Socket#getInputStream()
81ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
82ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public InputStream getInputStream() throws IOException {
83ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return inputStream;
84ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
85ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
86ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    /**
87ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * Override the superclass implementation to provide the predefined OutputStream
88ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     * @see java.net.Socket#getOutputStream()
89ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair     */
90ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public OutputStream getOutputStream() throws IOException {
91ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        return outputStream;
92ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
93ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
94ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
95ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    // Test-specific helper methods
96ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    //-------------------------------------------------------------------------
97ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair
98ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    public void _setLocalAddress(InetAddress localAddress) {
99ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair        this.localAddress = localAddress;
100ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair    }
101ad39334d4c363c6ada5863d0bb3184f5f4699d69chrismair}
102