@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 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);
  }
  @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);
  }
  @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);
  }
  @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) {
    }
  }
  @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) {
    }
  }
  @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);
  }
  @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 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);
  }