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 static org.junit.Assert.assertTrue;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.RobolectricBackgroundExecutorService;
import android.app.Activity;
@RunWith(RobolectricTestRunner.class)
public class AuthenticationTests {
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 basicAuthenticationWithNoUsernameOrPassword() throws Throwable {
server.enqueue(new MockResponse().setBody("HTTP Basic: Access denied.").setResponseCode(401));
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() == 401);
assertTrue(operation.getResponseString().equals("HTTP Basic: Access denied."));
// Verify that a authorization header wasn't sent
RecordedRequest request = server.takeRequest();
assertTrue(request.getHeader("Authorization") == null);
}
@Test
public void basicAuthenticationWithUsernameAndPassword() throws Throwable {
server.enqueue(new MockResponse().setBody("").setResponseCode(200));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost");
// Set a username and password
operation.setBasicAuthenticationHeader("droid", "networking");
NetworkEngine.getInstance().executeOperation(operation);
// We did supply a username and password. 200 OK
assertTrue(operation.getStatus() == NetworkOperation.STATUS_COMPLETED);
assertTrue(operation.getHttpStatusCode() == 200);
assertTrue(operation.getResponseString().equals(""));
// Verify the authorizaion header
RecordedRequest request = server.takeRequest();
assertTrue(request.getHeader("Authorization").equals("Basic ZHJvaWQ6bmV0d29ya2luZw=="));
}
@Test
public void basicAuthenticationWithIncorrectUsernameAndPassword() throws Throwable {
server.enqueue(new MockResponse().setBody("HTTP Basic: Access denied.").setResponseCode(401));
server.play(8080);
NetworkOperation operation = NetworkEngine.getInstance().createOperationWithURLString("http://localhost");
// Set a username and password
operation.setBasicAuthenticationHeader("wrong", "password");
NetworkEngine.getInstance().executeOperation(operation);
// We did supply a username and password, but the wrong ones. 401 Unauthorized
assertTrue(operation.getStatus() == NetworkOperation.STATUS_ERROR);
assertTrue(operation.getHttpStatusCode() == 401);
assertTrue(operation.getResponseString().equals("HTTP Basic: Access denied."));
// Verify the authorizaion header
RecordedRequest request = server.takeRequest();
assertTrue(request.getHeader("Authorization").equals("Basic d3Jvbmc6cGFzc3dvcmQ="));
}
}