package com.asana.dispatcher;
import com.google.api.client.http.*;
import com.google.api.client.testing.http.MockHttpTransport;
import com.google.api.client.testing.http.MockLowLevelHttpRequest;
import com.google.api.client.testing.http.MockLowLevelHttpResponse;
import com.google.common.base.Joiner;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
public class MockDispatcher extends Dispatcher {
public class Call {
public LowLevelHttpRequest request;
public LowLevelHttpResponse response;
public String requestBody;
public JsonElement parsedRequestBody;
public Call(LowLevelHttpRequest request, LowLevelHttpResponse response, String requestBody) {
this.request = request;
this.response = response;
this.requestBody = requestBody;
try {
this.parsedRequestBody = new JsonParser().parse(requestBody);
} catch (Exception e) {
}
}
}
private HttpTransport transport;
private HashMap<String, LinkedList<MockLowLevelHttpResponse>> responses;
public ArrayList<Call> calls;
public ArrayList<Integer> sleepCalls;
public MockDispatcher() {
this.calls = new ArrayList<Call>();
this.sleepCalls = new ArrayList<Integer>();
this.responses = new HashMap<String, LinkedList<MockLowLevelHttpResponse>>();
this.transport = new MockHttpTransport() {
@Override
public LowLevelHttpRequest buildRequest(final String method, final String url) throws IOException {
return new MockLowLevelHttpRequest() {
@Override
public LowLevelHttpResponse execute() throws IOException {
String key = formatRequestKey(method, url);
if (responses.containsKey(key) && responses.get(key).size() > 0) {
LowLevelHttpResponse response = responses.get(key).removeFirst();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
if (this.getStreamingContent() != null) {
this.getStreamingContent().writeTo(buffer);
}
calls.add(new Call(this, response, buffer.toString()));
return response;
} else {
throw new IOException("No response registered for " + key);
}
}
};
}
};
}
public HttpRequest buildRequest(String method, GenericUrl url, HttpContent content) throws IOException {
return this.transport.createRequestFactory().buildRequest(method, url, content);
}
public void sleep(long millis) {
this.sleepCalls.add(new Integer((int) millis));
}
public MockHttpResponse registerResponse(String method, String path) {
MockHttpResponse response = new MockHttpResponse();
String key = formatRequestKey(method, path);
if (!responses.containsKey(key)) {
responses.put(key, new LinkedList<MockLowLevelHttpResponse>());
}
responses.get(key).add(response);
return response;
}
public class MockHttpResponse extends MockLowLevelHttpResponse {
public MockHttpResponse code(int statusCode) {
return (MockHttpResponse) super.setStatusCode(statusCode);
}
public MockHttpResponse content(String content) {
return (MockHttpResponse) super.setContent(content);
}
public MockHttpResponse header(String name, String value) {
return (MockHttpResponse) super.addHeader(name, value);
}
}
private String formatRequestKey(String method, String path) {
String[] components = path.split("\\?");
String result = method + ":" + components[0];
if (components.length == 2 && components[1].length() > 0) {
String[] params = components[1].split("&");
Arrays.sort(params);
result += "?" + Joiner.on("&").join(params);
}
return result;
}
}