package org.mozilla.android.sync.net.test;
import java.util.Date;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.mozilla.gecko.sync.net.SyncResponse;
import ch.boye.httpclientandroidlib.HttpResponse;
import ch.boye.httpclientandroidlib.ProtocolVersion;
import ch.boye.httpclientandroidlib.impl.cookie.DateUtils;
import ch.boye.httpclientandroidlib.message.BasicHttpResponse;
import ch.boye.httpclientandroidlib.message.BasicStatusLine;
public class TestRetryAfter {
private int TEST_SECONDS = 120;
@Test
public void testRetryAfterParsesSeconds() {
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
response.addHeader("Retry-After", Long.toString(TEST_SECONDS)); // Retry-After given in seconds.
final SyncResponse syncResponse = new SyncResponse(response);
assertEquals(TEST_SECONDS, syncResponse.retryAfterInSeconds());
}
@Test
public void testRetryAfterParsesHTTPDate() {
Date future = new Date(System.currentTimeMillis() + TEST_SECONDS * 1000);
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
response.addHeader("Retry-After", DateUtils.formatDate(future));
final SyncResponse syncResponse = new SyncResponse(response);
assertTrue(syncResponse.retryAfterInSeconds() > TEST_SECONDS - 15);
assertTrue(syncResponse.retryAfterInSeconds() < TEST_SECONDS + 15);
}
@SuppressWarnings("static-method")
@Test
public void testRetryAfterParsesMalformed() {
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
response.addHeader("Retry-After", "10X");
final SyncResponse syncResponse = new SyncResponse(response);
assertEquals(-1, syncResponse.retryAfterInSeconds());
}
@SuppressWarnings("static-method")
@Test
public void testRetryAfterParsesNeither() {
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
final SyncResponse syncResponse = new SyncResponse(response);
assertEquals(-1, syncResponse.retryAfterInSeconds());
}
@Test
public void testRetryAfterParsesLargerRetryAfter() {
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
response.addHeader("Retry-After", Long.toString(TEST_SECONDS + 1));
response.addHeader("X-Weave-Backoff", Long.toString(TEST_SECONDS));
final SyncResponse syncResponse = new SyncResponse(response);
assertEquals(1000 * (TEST_SECONDS + 1), syncResponse.totalBackoffInMilliseconds());
}
@Test
public void testRetryAfterParsesLargerXWeaveBackoff() {
final HttpResponse response = new BasicHttpResponse(
new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 503, "Illegal method/protocol"));
response.addHeader("Retry-After", Long.toString(TEST_SECONDS));
response.addHeader("X-Weave-Backoff", Long.toString(TEST_SECONDS + 1));
final SyncResponse syncResponse = new SyncResponse(response);
assertEquals(1000 * (TEST_SECONDS + 1), syncResponse.totalBackoffInMilliseconds());
}
}