package com.sogeti.droidnetworking.test.integration;
import com.google.mockwebserver.MockWebServer;
import com.google.mockwebserver.MockResponse;
import com.google.mockwebserver.RecordedRequest;
import com.sogeti.droidnetworking.NetworkEngine;
import com.sogeti.droidnetworking.NetworkOperation;
import org.junit.Test;
import java.lang.Throwable;
import java.util.HashMap;
import static org.junit.Assert.assertTrue;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import java.util.HashMap;
import java.util.Map;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.RobolectricBackgroundExecutorService;
import android.app.Activity;
@RunWith(RobolectricTestRunner.class)
public class BasicHttpTests {
private MockWebServer server;
@Before
public void setup() {
Robolectric.getFakeHttpLayer().interceptHttpRequests(false);
server = new MockWebServer();
NetworkEngine.getInstance().setHttpPort(8080);
NetworkEngine.getInstance().init(new Activity());
NetworkEngine.getInstance().setUseCache(false);
NetworkEngine.getInstance().setSharedNetworkQueue(new RobolectricBackgroundExecutorService());
Robolectric.getBackgroundScheduler().pause();
Robolectric.getUiThreadScheduler().pause();
}
@After
public void tearDown() throws Throwable {
server.shutdown();
}
@Test
public void getWithStatus404() throws Throwable {
server.enqueue(new MockResponse().setBody("The page you were looking for doesn't exist.").setResponseCode(404));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost");
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_ERROR);
assertTrue(operation.getHttpStatusCode() == 404);
assertTrue(operation.getResponseString().equals("The page you were looking for doesn't exist."));
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("GET / HTTP/1.1"));
}
@Test
public void get() throws Throwable {
server.enqueue(new MockResponse().setBody("OK").setResponseCode(200));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost");
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 200);
assertTrue(operation.getResponseString().equals("OK"));
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("GET / HTTP/1.1"));
}
@Test
public void getWithParameters() throws Throwable {
server.enqueue(new MockResponse().setBody("OK").setResponseCode(200));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost");
Map<String, String> params = new HashMap<String,String>();
params.put("hello", "world");
operation.addParams(params);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 200);
assertTrue(operation.getResponseString().equals("OK"));
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("GET /?hello=world HTTP/1.1"));
}
@Test
public void post() throws Throwable {
server.enqueue(new MockResponse().setBody("").setResponseCode(201));
server.play(8080);
Map<String, String> params = new HashMap<String,String>();
params.put("hello", "world");
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost", params, NetworkEngine.HttpMethod.POST);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 201);
assertTrue(operation.getResponseString().equals(""));
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("POST / HTTP/1.1"));
assertTrue(request.getBodySize() == 11);
assertTrue(request.getUtf8Body().equals("hello=world"));
}
@Test
public void put() throws Throwable {
server.enqueue(new MockResponse().setBody("").setResponseCode(200));
server.play(8080);
Map<String, String> params = new HashMap<String,String>();
params.put("hello", "world");
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost", params, NetworkEngine.HttpMethod.PUT);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 200);
assertTrue(operation.getResponseString().equals(""));
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("PUT / HTTP/1.1"));
assertTrue(request.getBodySize() == 11);
assertTrue(request.getUtf8Body().equals("hello=world"));
}
@Test
public void delete() throws Throwable {
server.enqueue(new MockResponse().setBody("").setResponseCode(200));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost", null, NetworkEngine.HttpMethod.DELETE);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 200);
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("DELETE / HTTP/1.1"));
assertTrue(request.getBodySize() == 0);
}
@Test
public void head() throws Throwable {
server.enqueue(new MockResponse().setBody("").setResponseCode(200));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost", null, NetworkEngine.HttpMethod.HEAD);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_PENDING);
NetworkEngine.getInstance().executeOperation(operation);
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 200);
RecordedRequest request = server.takeRequest();
assertTrue(request.getRequestLine().equals("HEAD / HTTP/1.1"));
assertTrue(request.getBodySize() == 0);
}
}