/** * Copyright 2012 Facebook * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook; import android.graphics.Bitmap; import android.test.suitebuilder.annotation.LargeTest; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import com.facebook.model.GraphObject; import com.facebook.model.GraphPlace; import com.facebook.model.GraphUser; import java.net.HttpURLConnection; import java.util.Arrays; import java.util.List; public class AsyncRequestTests extends FacebookTestCase { @SmallTest @MediumTest @LargeTest public void testCanLaunchAsyncRequestFromUiThread() { Request request = Request.newPostRequest(null, "me/feeds", null, null); try { TestRequestAsyncTask task = createAsyncTaskOnUiThread(request); assertNotNull(task); } catch (Throwable throwable) { assertNull(throwable); } } @SmallTest @MediumTest @LargeTest public void testExecuteWithNullRequestsThrows() throws Exception { try { TestRequestAsyncTask task = new TestRequestAsyncTask((Request[]) null); task.executeOnBlockerThread(); waitAndAssertSuccessOrRethrow(1); fail("expected NullPointerException"); } catch (NullPointerException exception) { } } @SmallTest @MediumTest @LargeTest public void testExecuteBatchWithZeroRequestsThrows() throws Exception { try { TestRequestAsyncTask task = new TestRequestAsyncTask(new Request[] {}); task.executeOnBlockerThread(); waitAndAssertSuccessOrRethrow(1); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException exception) { } } @SmallTest @MediumTest @LargeTest public void testExecuteBatchWithNullRequestThrows() throws Exception { try { TestRequestAsyncTask task = new TestRequestAsyncTask(new Request[] { null }); task.executeOnBlockerThread(); waitAndAssertSuccessOrRethrow(1); fail("expected NullPointerException"); } catch (NullPointerException exception) { } } @MediumTest @LargeTest public void testExecuteSingleGet() { Request request = new Request(null, "TourEiffel", null, null, new ExpectSuccessCallback() { @Override protected void performAsserts(Response response) { assertNotNull(response); GraphPlace graphPlace = response.getGraphObjectAs(GraphPlace.class); assertEquals("Paris", graphPlace.getLocation().getCity()); } }); TestRequestAsyncTask task = new TestRequestAsyncTask(request); task.executeOnBlockerThread(); // Wait on 2 signals: request and task will both signal. waitAndAssertSuccess(2); } @MediumTest @LargeTest public void testExecuteSingleGetUsingHttpURLConnection() { Request request = new Request(null, "TourEiffel", null, null, new ExpectSuccessCallback() { @Override protected void performAsserts(Response response) { assertNotNull(response); GraphPlace graphPlace = response.getGraphObjectAs(GraphPlace.class); assertEquals("Paris", graphPlace.getLocation().getCity()); } }); HttpURLConnection connection = Request.toHttpConnection(request); TestRequestAsyncTask task = new TestRequestAsyncTask(connection, Arrays.asList(new Request[] { request })); task.executeOnBlockerThread(); // Wait on 2 signals: request and task will both signal. waitAndAssertSuccess(2); } @MediumTest @LargeTest public void testExecuteSingleGetFailureCase() { Request request = new Request(null, "-1", null, null, new ExpectFailureCallback()); TestRequestAsyncTask task = new TestRequestAsyncTask(request); task.executeOnBlockerThread(); // Wait on 2 signals: request and task will both signal. waitAndAssertSuccess(2); } @SmallTest @MediumTest @LargeTest public void testBatchWithoutAppIDIsError() throws Throwable { Request request1 = new Request(null, "TourEiffel", null, null, new ExpectFailureCallback()); Request request2 = new Request(null, "SpaceNeedle", null, null, new ExpectFailureCallback()); TestRequestAsyncTask task = new TestRequestAsyncTask(request1, request2); task.executeOnBlockerThread(); // Wait on 3 signals: request1, request2, and task will all signal. waitAndAssertSuccessOrRethrow(3); } @LargeTest public void testMixedSuccessAndFailure() { TestSession session = openTestSessionWithSharedUser(); final int NUM_REQUESTS = 8; Request[] requests = new Request[NUM_REQUESTS]; for (int i = 0; i < NUM_REQUESTS; ++i) { boolean shouldSucceed = (i % 2) == 1; if (shouldSucceed) { requests[i] = new Request(session, "me", null, null, new ExpectSuccessCallback()); } else { requests[i] = new Request(session, "-1", null, null, new ExpectFailureCallback()); } } TestRequestAsyncTask task = new TestRequestAsyncTask(requests); task.executeOnBlockerThread(); // Note: plus 1, because the overall async task signals as well. waitAndAssertSuccess(NUM_REQUESTS + 1); } @MediumTest @LargeTest public void testStaticExecuteMeAsync() { final TestSession session = openTestSessionWithSharedUser(); class MeCallback extends ExpectSuccessCallback implements Request.GraphUserCallback { @Override public void onCompleted(GraphUser me, Response response) { assertNotNull(me); assertEquals(session.getTestUserId(), me.getId()); RequestTests.validateMeResponse(session, response); onCompleted(response); } } runOnBlockerThread(new Runnable() { @Override public void run() { Request.executeMeRequestAsync(session, new MeCallback()); } }, false); waitAndAssertSuccess(1); } @MediumTest @LargeTest public void testStaticExecuteMyFriendsAsync() { final TestSession session = openTestSessionWithSharedUser(); class FriendsCallback extends ExpectSuccessCallback implements Request.GraphUserListCallback { @Override public void onCompleted(List<GraphUser> friends, Response response) { assertNotNull(friends); RequestTests.validateMyFriendsResponse(session, response); onCompleted(response); } } runOnBlockerThread(new Runnable() { @Override public void run() { Request.executeMyFriendsRequestAsync(session, new FriendsCallback()); } }, false); waitAndAssertSuccess(1); } @LargeTest public void testBatchUploadPhoto() { TestSession session = openTestSessionWithSharedUserAndPermissions(null, "user_photos"); final int image1Size = 120; final int image2Size = 150; Bitmap bitmap1 = createTestBitmap(image1Size); Bitmap bitmap2 = createTestBitmap(image2Size); Request uploadRequest1 = Request.newUploadPhotoRequest(session, bitmap1, null); uploadRequest1.setBatchEntryName("uploadRequest1"); Request uploadRequest2 = Request.newUploadPhotoRequest(session, bitmap2, null); uploadRequest2.setBatchEntryName("uploadRequest2"); Request getRequest1 = new Request(session, "{result=uploadRequest1:$.id}", null, null, new ExpectSuccessCallback() { @Override protected void performAsserts(Response response) { assertNotNull(response); GraphObject retrievedPhoto = response.getGraphObject(); assertNotNull(retrievedPhoto); assertEquals(image1Size, retrievedPhoto.getProperty("width")); } }); Request getRequest2 = new Request(session, "{result=uploadRequest2:$.id}", null, null, new ExpectSuccessCallback() { @Override protected void performAsserts(Response response) { assertNotNull(response); GraphObject retrievedPhoto = response.getGraphObject(); assertNotNull(retrievedPhoto); assertEquals(image2Size, retrievedPhoto.getProperty("width")); } }); TestRequestAsyncTask task = new TestRequestAsyncTask(uploadRequest1, uploadRequest2, getRequest1, getRequest2); task.executeOnBlockerThread(); // Wait on 3 signals: getRequest1, getRequest2, and task will all signal. waitAndAssertSuccess(3); } @MediumTest @LargeTest public void testShortTimeoutCausesFailure() { TestSession session = openTestSessionWithSharedUser(); Request request = new Request(session, "me/likes", null, null, new ExpectFailureCallback()); RequestBatch requestBatch = new RequestBatch(request); // 1 millisecond timeout should be too short for response from server. requestBatch.setTimeout(1); TestRequestAsyncTask task = new TestRequestAsyncTask(requestBatch); task.executeOnBlockerThread(); // Note: plus 1, because the overall async task signals as well. waitAndAssertSuccess(2); } @LargeTest public void testLongTimeoutAllowsSuccess() { TestSession session = openTestSessionWithSharedUser(); Request request = new Request(session, "me", null, null, new ExpectSuccessCallback()); RequestBatch requestBatch = new RequestBatch(request); // 10 second timeout should be long enough for successful response from server. requestBatch.setTimeout(10000); TestRequestAsyncTask task = new TestRequestAsyncTask(requestBatch); task.executeOnBlockerThread(); // Note: plus 1, because the overall async task signals as well. waitAndAssertSuccess(2); } }