package com.sogeti.droidnetworking.test.integration;
import android.app.Activity;
import com.google.mockwebserver.MockResponse;
import com.google.mockwebserver.MockWebServer;
import com.google.mockwebserver.RecordedRequest;
import com.sogeti.droidnetworking.NetworkEngine;
import com.sogeti.droidnetworking.NetworkOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.RobolectricBackgroundExecutorService;
import java.lang.System;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
public class MultipartTests {
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 postMultipartWithData() 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);
byte[] data = new byte[] {'A', 'B', 'C', 'D'};
operation.addData(data, "data");
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"));
String contentType = request.getHeader("Content-Type");
String boundary = getBoundaryFromContentType(contentType);
assertTrue(boundary.length() == 30);
assertTrue(numberOfBoundariesInBody(boundary, request.getUtf8Body()) == 3);
}
private int numberOfBoundariesInBody(String boundary, String body) {
Pattern p = Pattern.compile(boundary);
Matcher m = p.matcher(body);
int count = 0;
while (m.find()) {
count +=1;
}
return count;
}
private String getBoundaryFromContentType(String contentType) {
String pattern = "boundary=(.{30})";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(contentType);
assertTrue(m.groupCount() == 1);
m.find();
String boundary = m.group().substring(9, 39);
return boundary;
}
@Test
public void postWithRawBody() throws Throwable {
server.enqueue(new MockResponse().setBody("").setResponseCode(201));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost");
operation.setHttpMethod(NetworkEngine.HttpMethod.POST);
operation.setBody(new byte[] {'A', 'B', 'C', 'D'});
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"));
System.out.println(request.getUtf8Body());
assertTrue(request.getBodySize() == 4);
assertTrue(request.getUtf8Body().equals("ABCD"));
}
}