package net.sf.openrocket.communication; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.security.Permission; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import net.sf.openrocket.util.BugException; public class HttpURLConnectionMock extends HttpURLConnection { private static final URL MOCK_URL; static { try { MOCK_URL = new URL("http://localhost/"); } catch (MalformedURLException e) { throw new BugException(e); } } @SuppressWarnings("hiding") private volatile boolean instanceFollowRedirects = false; @SuppressWarnings("hiding") private volatile int responseCode; private volatile String requestMethod = ""; private Map<String, String> requestProperties = new HashMap<String, String>(); private volatile int connectTimeout = -1; private volatile String contentEncoding = ""; @SuppressWarnings("hiding") private volatile boolean doInput = false; @SuppressWarnings("hiding") private volatile boolean doOutput = false; private volatile byte[] content = null; private volatile String contentType = null; @SuppressWarnings("hiding") private volatile boolean useCaches = false; private volatile InputStream inputStream = null; private volatile ByteArrayOutputStream outputStream = null; private volatile String trueUrl = null; @SuppressWarnings("hiding") private volatile boolean connected = false; private volatile int connectionDelay = 0; private volatile boolean failed = false; public HttpURLConnectionMock() { super(MOCK_URL); } public HttpURLConnectionMock(URL u) { super(u); } public String getTrueUrl() { return trueUrl; } public void setTrueUrl(String url) { assertNull(this.trueUrl); this.trueUrl = url; } public boolean hasFailed() { return failed; } public void setConnectionDelay(int delay) { this.connectionDelay = delay; } @Override public void connect() { if (!connected) { try { Thread.sleep(connectionDelay); } catch (InterruptedException e) { } connected = true; } } @Override public void disconnect() { } @Override public boolean usingProxy() { return false; } @Override public boolean getInstanceFollowRedirects() { return this.instanceFollowRedirects; } @Override public void setInstanceFollowRedirects(boolean followRedirects) { assertFalse(connected); this.instanceFollowRedirects = followRedirects; } @Override public String getRequestMethod() { return this.requestMethod; } @Override public void setRequestMethod(String method) throws ProtocolException { assertFalse(connected); this.requestMethod = method; } @Override public int getResponseCode() throws IOException { connect(); return this.responseCode; } public void setResponseCode(int code) { this.responseCode = code; } @Override public void addRequestProperty(String key, String value) { assertFalse(connected); assertFalse(this.requestProperties.containsKey(key.toLowerCase(Locale.ENGLISH))); this.requestProperties.put(key.toLowerCase(Locale.ENGLISH), value); } @Override public void setRequestProperty(String key, String value) { assertFalse(connected); this.requestProperties.put(key.toLowerCase(Locale.ENGLISH), value); } @Override public String getRequestProperty(String key) { return this.requestProperties.get(key.toLowerCase(Locale.ENGLISH)); } @Override public int getConnectTimeout() { return this.connectTimeout; } @Override public void setConnectTimeout(int timeout) { assertFalse(connected); this.connectTimeout = timeout; } @Override public String getContentEncoding() { connect(); return this.contentEncoding; } public void setContentEncoding(String encoding) { this.contentEncoding = encoding; } @Override public int getContentLength() { connect(); if (content == null) return 0; return content.length; } public void setContent(byte[] content) { this.content = content; } public void setContent(String content) { try { this.content = content.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { fail("UTF-8"); } } @Override public String getContentType() { connect(); return this.contentType; } public void setContentType(String type) { this.contentType = type; } @Override public boolean getDoInput() { return this.doInput; } @Override public void setDoInput(boolean doinput) { assertFalse(connected); this.doInput = doinput; } @Override public boolean getDoOutput() { return this.doOutput; } @Override public void setDoOutput(boolean dooutput) { assertFalse(connected); this.doOutput = dooutput; } @Override public InputStream getInputStream() throws IOException { assertTrue(doInput); assertNull(inputStream); assertNotNull(content); connect(); inputStream = new ByteArrayInputStream(content); return inputStream; } @Override public OutputStream getOutputStream() throws IOException { assertTrue(doOutput); assertNull(outputStream); outputStream = new ByteArrayOutputStream(); return outputStream; } public byte[] getOutputStreamData() { return outputStream.toByteArray(); } public String getOutputStreamString() { try { return outputStream.toString("UTF-8"); } catch (UnsupportedEncodingException e) { fail("UTF-8"); return null; } } @Override public void setUseCaches(boolean usecaches) { assertFalse(connected); this.useCaches = usecaches; } @Override public boolean getUseCaches() { return this.useCaches; } private void assertNull(Object o) { try { org.junit.Assert.assertNull(o); } catch (AssertionError e) { failed = true; throw e; } } private void assertNotNull(Object o) { try { org.junit.Assert.assertNotNull(o); } catch (AssertionError e) { failed = true; throw e; } } private void assertTrue(boolean o) { try { org.junit.Assert.assertTrue(o); } catch (AssertionError e) { failed = true; throw e; } } private void assertFalse(boolean o) { try { org.junit.Assert.assertFalse(o); } catch (AssertionError e) { failed = true; throw e; } } private void fail(String msg) { failed = true; org.junit.Assert.fail(msg); } @Override public InputStream getErrorStream() { throw new UnsupportedOperationException(); } @Override public String getHeaderField(int n) { throw new UnsupportedOperationException(); } @Override public long getHeaderFieldDate(String name, long Default) { throw new UnsupportedOperationException(); } @Override public String getHeaderFieldKey(int n) { throw new UnsupportedOperationException(); } @Override public Permission getPermission() throws IOException { throw new UnsupportedOperationException(); } @Override public String getResponseMessage() throws IOException { throw new UnsupportedOperationException(); } @Override public void setChunkedStreamingMode(int chunklen) { throw new UnsupportedOperationException(); } @Override public void setFixedLengthStreamingMode(int contentLength) { throw new UnsupportedOperationException(); } @Override public boolean getAllowUserInteraction() { throw new UnsupportedOperationException(); } @Override public Object getContent() throws IOException { throw new UnsupportedOperationException(); } @Override public Object getContent(@SuppressWarnings("rawtypes") Class[] classes) throws IOException { throw new UnsupportedOperationException(); } @Override public long getDate() { throw new UnsupportedOperationException(); } @Override public boolean getDefaultUseCaches() { throw new UnsupportedOperationException(); } @Override public long getExpiration() { throw new UnsupportedOperationException(); } @Override public String getHeaderField(String name) { throw new UnsupportedOperationException(); } @Override public int getHeaderFieldInt(String name, int Default) { throw new UnsupportedOperationException(); } @Override public Map<String, List<String>> getHeaderFields() { throw new UnsupportedOperationException(); } @Override public long getIfModifiedSince() { throw new UnsupportedOperationException(); } @Override public long getLastModified() { throw new UnsupportedOperationException(); } @Override public int getReadTimeout() { throw new UnsupportedOperationException(); } @Override public Map<String, List<String>> getRequestProperties() { throw new UnsupportedOperationException(); } @Override public URL getURL() { throw new UnsupportedOperationException(); } @Override public void setAllowUserInteraction(boolean allowuserinteraction) { throw new UnsupportedOperationException(); } @Override public void setDefaultUseCaches(boolean defaultusecaches) { throw new UnsupportedOperationException(); } @Override public void setIfModifiedSince(long ifmodifiedsince) { throw new UnsupportedOperationException(); } @Override public void setReadTimeout(int timeout) { throw new UnsupportedOperationException(); } @Override public String toString() { throw new UnsupportedOperationException(); } }