/** Test that handleHTTPError does in fact backoff. */
  @Test
  public void testBackoffCalledByHandleHTTPError() {
    try {
      final MockGlobalSessionCallback callback = new MockGlobalSessionCallback(TEST_CLUSTER_URL);
      SyncConfiguration config =
          new SyncConfiguration(
              TEST_USERNAME,
              new BasicAuthHeaderProvider(TEST_USERNAME, TEST_PASSWORD),
              new MockSharedPreferences(),
              new KeyBundle(TEST_USERNAME, TEST_SYNC_KEY));
      final GlobalSession session = new MockGlobalSession(config, callback);

      final HttpResponse response =
          new BasicHttpResponse(
              new BasicStatusLine(
                  new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
      response.addHeader(
          "X-Weave-Backoff", Long.toString(TEST_BACKOFF_IN_SECONDS)); // Backoff given in seconds.

      getTestWaiter()
          .performWait(
              WaitHelper.onThreadRunnable(
                  new Runnable() {
                    @Override
                    public void run() {
                      session.handleHTTPError(
                          new SyncStorageResponse(response), "Illegal method/protocol");
                    }
                  }));

      assertEquals(false, callback.calledSuccess);
      assertEquals(true, callback.calledError);
      assertEquals(false, callback.calledAborted);
      assertEquals(true, callback.calledRequestBackoff);
      assertEquals(
          TEST_BACKOFF_IN_SECONDS * 1000,
          callback.weaveBackoff); // Backoff returned in milliseconds.
    } catch (Exception e) {
      e.printStackTrace();
      fail("Got exception.");
    }
  }