/* * Copyright 2011 Open Source Applications Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.osaf.caldav4j.support; import static org.junit.Assert.assertEquals; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.SocketAddress; import java.net.SocketException; import java.net.SocketImpl; import java.util.HashMap; import java.util.Map; /** * Fake {@code SocketImpl} test double that expects a given output and produces a stub input. * * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a> * @version $Id$ */ class FakeSocketImpl extends SocketImpl { // fields ----------------------------------------------------------------- private final InputStream expectedOutput; private final InputStream input; private final ByteArrayOutputStream output; private final Map<Integer, Object> optionValuesById; // constructors ----------------------------------------------------------- public FakeSocketImpl(InputStream expectedOutput, InputStream input) { this.expectedOutput = expectedOutput; this.input = input; output = new ByteArrayOutputStream(); optionValuesById = new HashMap<Integer, Object>(); } // SocketImpl methods ----------------------------------------------------- /** * {@inheritDoc} */ @Override protected void create(boolean stream) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected void connect(String host, int port) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected void connect(InetAddress address, int port) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected void connect(SocketAddress address, int timeout) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected void bind(InetAddress host, int port) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected void listen(int backlog) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected void accept(SocketImpl s) throws IOException { // no-op } /** * {@inheritDoc} */ @Override protected InputStream getInputStream() throws IOException { return input; } /** * {@inheritDoc} */ @Override protected OutputStream getOutputStream() throws IOException { return output; } /** * {@inheritDoc} */ @Override protected int available() throws IOException { return getInputStream().available(); } /** * {@inheritDoc} */ @Override protected void close() throws IOException { getInputStream().close(); getOutputStream().close(); // TODO: use explicit encoding? assertEquals("Output", new String(toBytes(expectedOutput)), new String(output.toByteArray())); } /** * {@inheritDoc} */ @Override protected void sendUrgentData(int data) throws IOException { // TODO: implement? throw new UnsupportedOperationException(); } // SocketOptions methods -------------------------------------------------- /** * {@inheritDoc} */ public void setOption(int optID, Object value) throws SocketException { optionValuesById.put(optID, value); } /** * {@inheritDoc} */ public Object getOption(int optID) throws SocketException { return optionValuesById.get(optID); } // private methods -------------------------------------------------------- private static byte[] toBytes(InputStream in) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[1024 * 4]; int n; while ((n = in.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, n); } return out.toByteArray(); } }