package com.mopub.common; import com.mopub.common.test.support.SdkTestRunner; import com.mopub.common.util.ResponseHeader; import com.mopub.mobileads.test.support.TestHttpResponseWithHeaders; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.robolectric.Robolectric; import org.robolectric.tester.org.apache.http.FakeHttpLayer; import static junit.framework.Assert.fail; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @RunWith(SdkTestRunner.class) public class DownloadTaskTest { @Mock private DownloadTask.DownloadTaskListener mockDownloadTaskListener; @Captor private ArgumentCaptor<DownloadResponse> responseCaptor; private DownloadTask mDownloadTask; private HttpGet httpGet; private String mTestResponse; private FakeHttpLayer mFakeHttpLayer; private TestHttpResponseWithHeaders mTestHttpResponseWithHeaders; @Before public void setUp() { mDownloadTask = new DownloadTask(mockDownloadTaskListener); try { httpGet = new HttpGet("http://www.mopub.com/"); } catch (IllegalArgumentException e) { fail("Could not initialize HttpGet in test"); } mTestResponse = "TEST RESPONSE"; mTestHttpResponseWithHeaders = new TestHttpResponseWithHeaders(200, mTestResponse); mTestHttpResponseWithHeaders.addHeader(ResponseHeader.IMPRESSION_URL.getKey(), "moPubImpressionTrackerUrl"); mTestHttpResponseWithHeaders.addHeader(ResponseHeader.CLICK_TRACKING_URL.getKey(), "moPubClickTrackerUrl"); mFakeHttpLayer = Robolectric.getFakeHttpLayer(); } @Test public void whenDownloadTaskAndHttpClientCompleteSuccessfully_shouldReturn200HttpResponse() { mFakeHttpLayer.addPendingHttpResponse(mTestHttpResponseWithHeaders); mDownloadTask.execute(httpGet); verify(mockDownloadTaskListener).onComplete(eq(httpGet.getURI().toString()), responseCaptor.capture()); DownloadResponse response = responseCaptor.getValue(); assertThat(response.getStatusCode()).isEqualTo(200); assertThat(response.getFirstHeader(ResponseHeader.IMPRESSION_URL)).isEqualTo("moPubImpressionTrackerUrl"); assertThat(response.getFirstHeader(ResponseHeader.CLICK_TRACKING_URL)).isEqualTo("moPubClickTrackerUrl"); assertThat(HttpResponses.asResponseString(response)).isEqualTo(mTestResponse); } @Test public void whenDownloadTaskCompletesSuccessfullyAndHttpClientTimesOut_shouldReturn599HttpResponse() { mFakeHttpLayer.addPendingHttpResponse(599, ""); mDownloadTask.execute(httpGet); verify(mockDownloadTaskListener).onComplete(eq(httpGet.getURI().toString()), responseCaptor.capture()); DownloadResponse response = responseCaptor.getValue(); assertThat(response.getStatusCode()).isEqualTo(599); assertThat(HttpResponses.asResponseString(response)).isEqualTo(""); } @Test public void whenDownloadTaskIsCancelledBeforeExecute_shouldNotCallOnComplete() { mFakeHttpLayer.addPendingHttpResponse(200, mTestResponse); mDownloadTask.cancel(true); mDownloadTask.execute(httpGet); verify(mockDownloadTaskListener, never()).onComplete( any(String.class), any(DownloadResponse.class)); } @Ignore("pending") @Test public void whenHttpUriRequestThrowsIOException_shouldCancelTaskAndReturnNullHttpResponse() { // need a way to force HttpUriRequest to throw on execute } @Test public void whenHttpUriRequestIsNull_shouldReturnNullHttpReponseAndNullUrl() { mDownloadTask.execute((HttpUriRequest) null); verify(mockDownloadTaskListener).onComplete(null, null); } @Test public void whenHttpUriRequestIsNullArray_shouldReturnNullHttpReponseAndNullUrl() { mDownloadTask.execute((HttpUriRequest[]) null); verify(mockDownloadTaskListener).onComplete(null, null); } @Test public void whenHttpUriRequestIsArray_shouldOnlyReturnFirstResponse() { mFakeHttpLayer.addPendingHttpResponse(200, mTestResponse); mFakeHttpLayer.addPendingHttpResponse(500, ""); mDownloadTask.execute(httpGet, new HttpGet("http://www.twitter.com/")); verify(mockDownloadTaskListener).onComplete(eq(httpGet.getURI().toString()), responseCaptor.capture()); DownloadResponse response = responseCaptor.getValue(); assertThat(response.getStatusCode()).isEqualTo(200); assertThat(HttpResponses.asResponseString(response)).isEqualTo(mTestResponse); } @Test(expected = IllegalArgumentException.class) public void constructor_withNullListener_shouldThrowIllegalArgumentException() { new DownloadTask(null); } }