/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.android.sync.net.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.mozilla.gecko.sync.GlobalSession;
import org.mozilla.gecko.sync.crypto.KeyBundle;
import ch.boye.httpclientandroidlib.HttpResponse;
import ch.boye.httpclientandroidlib.ProtocolVersion;
import ch.boye.httpclientandroidlib.message.BasicHttpResponse;
import ch.boye.httpclientandroidlib.message.BasicStatusLine;
import org.mozilla.android.sync.test.helpers.MockGlobalSession;
import org.mozilla.android.sync.test.helpers.MockGlobalSessionCallback;
public class TestBackoff {
private final String TEST_CLUSTER_URL = "http://localhost:8080/";
private final String TEST_USERNAME = "johndoe";
private final String TEST_PASSWORD = "password";
private final String TEST_SYNC_KEY = "abcdeabcdeabcdeabcdeabcdea";
private final long TEST_BACKOFF_IN_SECONDS = 1201;
/**
* Test that interpretHTTPFailure calls requestBackoff if
* X-Weave-Backoff is present.
*/
@Test
public void testBackoffCalledIfBackoffHeaderPresent() {
try {
final MockGlobalSessionCallback callback = new MockGlobalSessionCallback();
final GlobalSession session = new MockGlobalSession(TEST_CLUSTER_URL, TEST_USERNAME, TEST_PASSWORD,
new KeyBundle(TEST_USERNAME, TEST_SYNC_KEY), callback);
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
response.addHeader("X-Weave-Backoff", Long.toString(TEST_BACKOFF_IN_SECONDS)); // Backoff given in seconds.
session.interpretHTTPFailure(response); // This is synchronous...
assertEquals(false, callback.calledSuccess); // ... so we can test immediately.
assertEquals(false, 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.");
}
}
/**
* Test that interpretHTTPFailure does not call requestBackoff if
* X-Weave-Backoff is not present.
*/
@Test
public void testBackoffNotCalledIfBackoffHeaderNotPresent() {
try {
final MockGlobalSessionCallback callback = new MockGlobalSessionCallback();
final GlobalSession session = new MockGlobalSession(TEST_CLUSTER_URL, TEST_USERNAME, TEST_PASSWORD,
new KeyBundle(TEST_USERNAME, TEST_SYNC_KEY), callback);
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
session.interpretHTTPFailure(response); // This is synchronous...
assertEquals(false, callback.calledSuccess); // ... so we can test immediately.
assertEquals(false, callback.calledError);
assertEquals(false, callback.calledAborted);
assertEquals(false, callback.calledRequestBackoff);
} catch (Exception e) {
e.printStackTrace();
fail("Got exception.");
}
}
/**
* Test that interpretHTTPFailure calls requestBackoff with the
* largest specified value if X-Weave-Backoff and Retry-After are
* present.
*/
@Test
public void testBackoffCalledIfMultipleBackoffHeadersPresent() {
try {
final MockGlobalSessionCallback callback = new MockGlobalSessionCallback();
final GlobalSession session = new MockGlobalSession(TEST_CLUSTER_URL, TEST_USERNAME, TEST_PASSWORD,
new KeyBundle(TEST_USERNAME, TEST_SYNC_KEY), callback);
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK"));
response.addHeader("Retry-After", Long.toString(TEST_BACKOFF_IN_SECONDS)); // Backoff given in seconds.
response.addHeader("X-Weave-Backoff", Long.toString(TEST_BACKOFF_IN_SECONDS + 1)); // If we now add a second header, the larger should be returned.
session.interpretHTTPFailure(response); // This is synchronous...
assertEquals(false, callback.calledSuccess); // ... so we can test immediately.
assertEquals(false, callback.calledError);
assertEquals(false, callback.calledAborted);
assertEquals(true, callback.calledRequestBackoff);
assertEquals((TEST_BACKOFF_IN_SECONDS + 1) * 1000, callback.weaveBackoff); // Backoff returned in milliseconds.
} catch (Exception e) {
e.printStackTrace();
fail("Got exception.");
}
}
}