/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.gecko.sync.repositories.test;
import java.net.URISyntaxException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Assert;
import org.junit.Test;
import org.mozilla.android.sync.test.helpers.HTTPServerTestHelper;
import org.mozilla.android.sync.test.helpers.MockServer;
import org.mozilla.android.sync.test.helpers.WaitHelper;
import org.mozilla.gecko.sync.CredentialsSource;
import org.mozilla.gecko.sync.JSONRecordFetcher;
import org.mozilla.gecko.sync.repositories.RepositorySession;
import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionCreationDelegate;
import org.mozilla.gecko.sync.stage.SafeConstrainedServer11Repository;
import org.simpleframework.http.Request;
import org.simpleframework.http.Response;
public class TestSafeConstrainedServer11Repository implements CredentialsSource {
private static final int TEST_PORT = HTTPServerTestHelper.getTestPort();
private static final String TEST_SERVER = "http://localhost:" + TEST_PORT + "/";
private static final String TEST_USERNAME = "c6o7dvmr2c4ud2fyv6woz2u4zi22bcyd";
private static final String TEST_BASE_PATH = "/1.1/" + TEST_USERNAME + "/";
@Override
public String credentials() {
return null;
}
private class CountsMockServer extends MockServer {
public final AtomicInteger count = new AtomicInteger(0);
public final AtomicBoolean error = new AtomicBoolean(false);
@Override
public void handle(Request request, Response response) {
final String path = request.getPath().getPath();
if (error.get()) {
super.handle(request, response, 503, "Unavailable.");
return;
}
if (!path.startsWith(TEST_BASE_PATH)) {
super.handle(request, response, 404, "Not Found");
return;
}
if (path.endsWith("info/collections")) {
super.handle(request, response, 200, "{\"rotary\": 123456789}");
return;
}
if (path.endsWith("info/collection_counts")) {
super.handle(request, response, 200, "{\"rotary\": " + count.get() + "}");
return;
}
super.handle(request, response);
}
}
/**
* Ensure that a {@link SafeConstrainedServer11Repository} will advise
* skipping if the reported collection counts are higher than its limit.
*/
@Test
public void testShouldSkip() throws URISyntaxException {
final HTTPServerTestHelper data = new HTTPServerTestHelper();
final CountsMockServer server = new CountsMockServer();
data.startHTTPServer(server);
try {
String countsURL = TEST_SERVER + TEST_BASE_PATH + "info/collection_counts";
JSONRecordFetcher countFetcher = new JSONRecordFetcher(countsURL, this.credentials());
String sort = "sortindex";
CredentialsSource credentialsSource = this;
String collection = "rotary";
final int TEST_LIMIT = 1000;
final SafeConstrainedServer11Repository repo = new SafeConstrainedServer11Repository(
TEST_SERVER, TEST_USERNAME, collection, credentialsSource, TEST_LIMIT, sort, countFetcher);
final AtomicBoolean shouldSkipLots = new AtomicBoolean(false);
final AtomicBoolean shouldSkipFew = new AtomicBoolean(true);
final AtomicBoolean shouldSkip503 = new AtomicBoolean (false);
WaitHelper.getTestWaiter().performWait(2000, new Runnable() {
@Override
public void run() {
repo.createSession(new RepositorySessionCreationDelegate() {
@Override
public void onSessionCreated(RepositorySession session) {
// Try with too many items.
server.count.set(TEST_LIMIT + 1);
shouldSkipLots.set(session.shouldSkip());
// … and few enough that we should sync.
server.count.set(TEST_LIMIT - 1);
shouldSkipFew.set(session.shouldSkip());
// Now try with an error response. We advise skipping if we can't
// fetch counts, because we'll try again later.
server.error.set(true);
shouldSkip503.set(session.shouldSkip());
WaitHelper.getTestWaiter().performNotify();
}
@Override
public void onSessionCreateFailed(Exception ex) {
WaitHelper.getTestWaiter().performNotify(ex);
}
@Override
public RepositorySessionCreationDelegate deferredCreationDelegate() {
return this;
}
}, null);
}
});
Assert.assertTrue(shouldSkipLots.get());
Assert.assertFalse(shouldSkipFew.get());
Assert.assertTrue(shouldSkip503.get());
} finally {
data.stopHTTPServer();
}
}
}