package net.rdrei.android.scdl2.test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.security.cert.Certificate;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLPeerUnverifiedException;
import net.rdrei.android.scdl2.api.URLConnectionFactory;
public class FakeURLConnectionFactoryImpl implements URLConnectionFactory {
private final String mStreamFixture;
private Integer mResponseCode;
private final Map<String, String> mHeaderFields;
protected URL mUrl;
/**
* Creates a new FakeURL factory that returns the given resource fixture as
* stream instead of actually opening a network connection.
*
* @param streamFixture
*/
public FakeURLConnectionFactoryImpl(String streamFixture) {
mStreamFixture = streamFixture;
mHeaderFields = new HashMap<String, String>();
}
public FakeURLConnectionFactoryImpl() {
this(null);
}
@Override
public URLConnection create(URL url) {
mUrl = url;
final FakeURLConnection connection = new FakeURLConnection(url,
mStreamFixture);
if (mResponseCode != null) {
connection.setResponseCode(mResponseCode);
}
connection.setResponseHeaders(mHeaderFields);
return connection;
}
public URL getURL() {
return mUrl;
}
public void setResponseCode(int i) {
mResponseCode = i;
}
public void setHeaderField(String key, String value) {
mHeaderFields.put(key, value);
}
}
/*
* Fakes an HTTP connection to always return the messages HTML file after a
* successful login without actual network connection.
*
* @author pascal
*/
class FakeURLConnection extends HttpsURLConnection {
private final String mStreamFixture;
private Integer mResponseCode;
private final OutputStream mOutputStream;
private Map<String, String> mHeaderFields;
protected FakeURLConnection(URL url, String streamFixture) {
super(url);
mStreamFixture = streamFixture;
mOutputStream = new ByteArrayOutputStream();
}
public void setResponseHeaders(final Map<String, String> headers) {
mHeaderFields = headers;
}
@Override
public void connect() throws IOException {
throw new IllegalArgumentException("Not implemented!");
}
public InputStream getInputStream() throws IOException {
if (mStreamFixture == null) {
return new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
};
}
// This is were the magic happens.
final InputStream stream = this.getClass().getResourceAsStream(
mStreamFixture);
if (stream == null) {
throw new IOException("Could not find test fixture "
+ mStreamFixture);
}
return stream;
}
@Override
public void disconnect() {
}
@Override
public boolean usingProxy() {
return false;
}
/*
* (non-Javadoc)
*
* @see java.net.HttpURLConnection#getResponseCode()
*/
@Override
public int getResponseCode() throws IOException {
if (mResponseCode != null) {
return mResponseCode;
} else {
return super.getResponseCode();
}
}
public void setResponseCode(int responseCode) {
mResponseCode = responseCode;
}
@Override
public OutputStream getOutputStream() throws IOException {
return mOutputStream;
}
@Override
public String getCipherSuite() {
return null;
}
@Override
public Certificate[] getLocalCertificates() {
return null;
}
@Override
public String getHeaderField(String key) {
if (mHeaderFields != null) {
return mHeaderFields.get(key);
}
return super.getHeaderField(key);
}
@Override
public Certificate[] getServerCertificates()
throws SSLPeerUnverifiedException {
return null;
}
}