001/*
002 * Copyright (c) 2013 - 2016 TDP Ltd All Rights Reserved.
003 * TDP Ltd grants permission, free of charge, to any person obtaining copies
004 * of this software and its associated documentation files (the "Software"),
005 * to deal in the Software without restriction, including to use, copy, adapt,
006 * publish, distribute, display, perform, sublicense, and sell copies of the
007 * Software, subject to the following condition: You must include the above
008 * copyright notice and this permission notice in all full or partial copies
009 * of the Software.
010 * 
011 * TDP LTD PROVIDES THE SOFTWARE "AS IS," WITHOUT ANY EXPRESS OR IMPLIED WARRANTY,
012 * INCLUDING WITHOUT THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
013 * PARTICULAR PURPOSE, AND NON-INFRINGMENT. TDP LTD, THE AUTHORS OF THE SOFTWARE,
014 * AND THE OWNERS OF COPYRIGHT IN THE SOFTWARE ARE NOT LIABLE FOR ANY CLAIM, DAMAGES,
015 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING
016 * FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
017 * THE SOFTWARE.
018 */
019package cz.tdp.kshield.example;
020
021import java.io.ByteArrayInputStream;
022import java.io.IOException;
023import java.io.InputStream;
024import java.io.OutputStream;
025import java.nio.charset.Charset;
026import java.util.Locale;
027
028import org.apache.http.Header;
029import org.apache.http.HeaderIterator;
030import org.apache.http.HttpEntity;
031import org.apache.http.HttpHost;
032import org.apache.http.HttpRequest;
033import org.apache.http.HttpResponse;
034import org.apache.http.HttpStatus;
035import org.apache.http.ProtocolVersion;
036import org.apache.http.StatusLine;
037import org.apache.http.client.ClientProtocolException;
038import org.apache.http.client.ResponseHandler;
039import org.apache.http.client.methods.CloseableHttpResponse;
040import org.apache.http.client.methods.HttpUriRequest;
041import org.apache.http.conn.ClientConnectionManager;
042import org.apache.http.conn.HttpClientConnectionManager;
043import org.apache.http.impl.client.CloseableHttpClient;
044import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
045import org.apache.http.message.BasicStatusLine;
046import org.apache.http.params.HttpParams;
047import org.apache.http.protocol.HttpContext;
048
049//SONAR-IGNORE-FILE
050
051/**
052 * Used for JUnit testing and demonstration purposes
053 * This implementation will always return response with given string bytes
054 */
055@SuppressWarnings("all")
056public class MockHttpClient extends CloseableHttpClient  //NOSONAR suppress sonar warnings in Mock class
057{
058  /**
059   * Last httpRequest - you can check this in tests
060   */
061  public HttpRequest httpRequest;
062  
063  /**
064   * Last httpResponse - you can check this in tests
065   */
066  public MockHttpResponse httpResponse;
067  
068  private HttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
069  
070  /**
071   * @param response fake response as String
072   */
073  public MockHttpClient(String response) {
074    setResponse(response);
075  }
076
077  /**
078   * Sets new fake response as string
079   * @param response
080   */
081  public final void setResponse(String response) {
082    final byte[] bytes = response.getBytes(Charset.defaultCharset());
083    final ByteArrayInputStream istream = new ByteArrayInputStream(bytes);
084    
085    httpResponse = new MockHttpResponse(istream, bytes);
086  }
087  
088  public final void setStatus(int status) {
089    httpResponse.setStatusCode(status);
090    httpResponse.setStatus(status);
091  }
092  
093  static final class MockHttpResponse implements CloseableHttpResponse
094  {
095    private final ByteArrayInputStream istream;
096    private final byte[] bytes;
097    private int status = HttpStatus.SC_OK;
098    
099    /**
100     * @param istream
101     * @param bytes
102     */
103    MockHttpResponse(ByteArrayInputStream istream, byte[] bytes) {
104      this.istream = istream;
105      this.bytes = bytes;
106    }
107    
108    @Override
109    public HttpEntity getEntity() {
110      return new MockHttpEntity();
111    }
112    
113    public void setStatus(int status) {
114      this.status = status;
115    }
116    
117    @Override
118    public void addHeader(Header arg0) {}
119    
120    @Override
121    public void addHeader(String arg0, String arg1) {}
122    
123    @Override
124    public boolean containsHeader(String arg0) { return false; }
125    
126    @Override
127    public Header[] getAllHeaders() { return null; }
128    
129    @Override
130    public Header getFirstHeader(String arg0) { return null; }
131    
132    @Override
133    public Header[] getHeaders(String arg0) { return null; }
134    
135    @Override
136    public Header getLastHeader(String arg0) { return null; }
137    
138    @Override
139    public HttpParams getParams() { return null; }
140    
141    @Override
142    public ProtocolVersion getProtocolVersion() { return null; }
143    
144    @Override
145    public HeaderIterator headerIterator() { return null; }
146    
147    @Override
148    public HeaderIterator headerIterator(String arg0) { return null; }
149    
150    @Override
151    public void removeHeader(Header arg0) {}
152    
153    @Override
154    public void removeHeaders(String arg0) {}
155    
156    @Override
157    public void setHeader(Header arg0) {}
158    
159    @Override
160    public void setHeader(String arg0, String arg1) {}
161    
162    @Override
163    public void setHeaders(Header[] arg0) {}
164    
165    @Override
166    public void setParams(HttpParams arg0) {}
167    
168    @Override
169    public Locale getLocale() { return null; }
170    
171    @Override
172    public StatusLine getStatusLine() { return new BasicStatusLine(new ProtocolVersion("HTTP",1,1), status, ""); }
173    
174    @Override
175    public void setEntity(HttpEntity arg0) {}
176    
177    @Override
178    public void setLocale(Locale arg0) {}
179    
180    @Override
181    public void setReasonPhrase(String arg0) throws IllegalStateException {}
182    
183    @Override
184    public void setStatusCode(int arg0) throws IllegalStateException {}
185    
186    @Override
187    public void setStatusLine(StatusLine arg0) {}
188    
189    @Override
190    public void setStatusLine(ProtocolVersion arg0, int arg1) {}
191    
192    @Override
193    public void setStatusLine(ProtocolVersion arg0, int arg1, String arg2) {}
194    
195    class MockHttpEntity implements HttpEntity
196    {
197      @Override
198      public InputStream getContent() throws IOException {
199        return istream;
200      }
201      @Override
202      public void consumeContent() throws IOException {}
203      @Override
204      public Header getContentEncoding() { return null; }
205      @Override
206      public long getContentLength() { return bytes.length; }
207      @Override
208      public Header getContentType() { return null; }
209      @Override
210      public boolean isChunked() { return false; }
211      @Override
212      public boolean isRepeatable() { return false; }
213      @Override
214      public boolean isStreaming() { return false; }
215      @Override
216      public void writeTo(OutputStream arg0) throws IOException {}
217    }
218
219    @Override
220    public void close() throws IOException {}
221  }
222
223  @Override
224  public HttpParams getParams() {
225    return null;
226  }
227
228  @Override
229  public ClientConnectionManager getConnectionManager() {
230    return null;
231  }
232
233  @Override
234  public void close() throws IOException {}
235
236  /* (non-Javadoc)
237   * @see org.apache.http.impl.client.CloseableHttpClient#doExecute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext)
238   */
239  @Override
240  protected CloseableHttpResponse doExecute(HttpHost target, HttpRequest request, HttpContext context)
241      throws IOException, ClientProtocolException {
242    httpRequest = request;
243    return httpResponse;
244  }
245}