/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.android.sync.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.util.ArrayList;
import org.junit.Test;
import org.mozilla.android.sync.test.SynchronizerHelpers.BatchFailStoreWBORepository;
import org.mozilla.android.sync.test.SynchronizerHelpers.BeginErrorWBORepository;
import org.mozilla.android.sync.test.SynchronizerHelpers.BeginFailedException;
import org.mozilla.android.sync.test.SynchronizerHelpers.FailFetchWBORepository;
import org.mozilla.android.sync.test.SynchronizerHelpers.FinishErrorWBORepository;
import org.mozilla.android.sync.test.SynchronizerHelpers.FinishFailedException;
import org.mozilla.android.sync.test.SynchronizerHelpers.SerialFailStoreWBORepository;
import org.mozilla.android.sync.test.SynchronizerHelpers.TrackingWBORepository;
import org.mozilla.android.sync.test.helpers.WBORepository;
import org.mozilla.android.sync.test.helpers.WaitHelper;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.repositories.FetchFailedException;
import org.mozilla.gecko.sync.repositories.StoreFailedException;
import org.mozilla.gecko.sync.repositories.domain.BookmarkRecord;
import org.mozilla.gecko.sync.synchronizer.ServerLocalSynchronizer;
import org.mozilla.gecko.sync.synchronizer.Synchronizer;
import org.mozilla.gecko.sync.synchronizer.SynchronizerDelegate;
public class TestServerLocalSynchronizer {
public static final String LOG_TAG = "TestServLocSync";
protected Synchronizer getSynchronizer(WBORepository remote, WBORepository local) {
BookmarkRecord[] inbounds = new BookmarkRecord[] {
new BookmarkRecord("inboundSucc1", "bookmarks", 1, false),
new BookmarkRecord("inboundSucc2", "bookmarks", 1, false),
new BookmarkRecord("inboundFail1", "bookmarks", 1, false),
new BookmarkRecord("inboundSucc3", "bookmarks", 1, false),
new BookmarkRecord("inboundFail2", "bookmarks", 1, false),
new BookmarkRecord("inboundFail3", "bookmarks", 1, false),
};
BookmarkRecord[] outbounds = new BookmarkRecord[] {
new BookmarkRecord("outboundFail1", "bookmarks", 1, false),
new BookmarkRecord("outboundFail2", "bookmarks", 1, false),
new BookmarkRecord("outboundFail3", "bookmarks", 1, false),
new BookmarkRecord("outboundFail4", "bookmarks", 1, false),
new BookmarkRecord("outboundFail5", "bookmarks", 1, false),
new BookmarkRecord("outboundFail6", "bookmarks", 1, false),
};
for (BookmarkRecord inbound : inbounds) {
remote.wbos.put(inbound.guid, inbound);
}
for (BookmarkRecord outbound : outbounds) {
local.wbos.put(outbound.guid, outbound);
}
final Synchronizer synchronizer = new ServerLocalSynchronizer();
synchronizer.repositoryA = remote;
synchronizer.repositoryB = local;
return synchronizer;
}
protected static Exception doSynchronize(final Synchronizer synchronizer) {
final ArrayList<Exception> a = new ArrayList<Exception>();
WaitHelper.getTestWaiter().performWait(new Runnable() {
@Override
public void run() {
synchronizer.synchronize(null, new SynchronizerDelegate() {
@Override
public void onSynchronized(Synchronizer synchronizer) {
Logger.trace(LOG_TAG, "Got onSynchronized.");
a.add(null);
WaitHelper.getTestWaiter().performNotify();
}
@Override
public void onSynchronizeFailed(Synchronizer synchronizer, Exception lastException, String reason) {
Logger.trace(LOG_TAG, "Got onSynchronizedFailed.");
a.add(lastException);
WaitHelper.getTestWaiter().performNotify();
}
});
}
});
assertEquals(1, a.size()); // Should not be called multiple times!
return a.get(0);
}
@Test
public void testNoErrors() {
WBORepository remote = new TrackingWBORepository();
WBORepository local = new TrackingWBORepository();
Synchronizer synchronizer = getSynchronizer(remote, local);
assertNull(doSynchronize(synchronizer));
assertEquals(12, local.wbos.size());
assertEquals(12, remote.wbos.size());
}
@Test
public void testLocalFetchErrors() {
WBORepository remote = new TrackingWBORepository();
WBORepository local = new FailFetchWBORepository();
Synchronizer synchronizer = getSynchronizer(remote, local);
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(FetchFailedException.class, e.getClass());
// Neither session gets finished successfully, so all records are dropped.
assertEquals(6, local.wbos.size());
assertEquals(6, remote.wbos.size());
}
@Test
public void testRemoteFetchErrors() {
WBORepository remote = new FailFetchWBORepository();
WBORepository local = new TrackingWBORepository();
Synchronizer synchronizer = getSynchronizer(remote, local);
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(FetchFailedException.class, e.getClass());
// Neither session gets finished successfully, so all records are dropped.
assertEquals(6, local.wbos.size());
assertEquals(6, remote.wbos.size());
}
@Test
public void testLocalSerialStoreErrorsAreIgnored() {
WBORepository remote = new TrackingWBORepository();
WBORepository local = new SerialFailStoreWBORepository();
Synchronizer synchronizer = getSynchronizer(remote, local);
assertNull(doSynchronize(synchronizer));
assertEquals(9, local.wbos.size());
assertEquals(12, remote.wbos.size());
}
@Test
public void testLocalBatchStoreErrorsAreIgnored() {
final int BATCH_SIZE = 3;
Synchronizer synchronizer = getSynchronizer(new TrackingWBORepository(), new BatchFailStoreWBORepository(BATCH_SIZE));
Exception e = doSynchronize(synchronizer);
assertNull(e);
}
@Test
public void testRemoteSerialStoreErrorsAreNotIgnored() throws Exception {
Synchronizer synchronizer = getSynchronizer(new SerialFailStoreWBORepository(), new TrackingWBORepository()); // Tracking so we don't send incoming records back.
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(StoreFailedException.class, e.getClass());
}
@Test
public void testRemoteBatchStoreErrorsAreNotIgnoredManyBatches() throws Exception {
final int BATCH_SIZE = 3;
Synchronizer synchronizer = getSynchronizer(new BatchFailStoreWBORepository(BATCH_SIZE), new TrackingWBORepository()); // Tracking so we don't send incoming records back.
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(StoreFailedException.class, e.getClass());
}
@Test
public void testRemoteBatchStoreErrorsAreNotIgnoredOneBigBatch() throws Exception {
final int BATCH_SIZE = 20;
Synchronizer synchronizer = getSynchronizer(new BatchFailStoreWBORepository(BATCH_SIZE), new TrackingWBORepository()); // Tracking so we don't send incoming records back.
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(StoreFailedException.class, e.getClass());
}
@Test
public void testSessionRemoteBeginError() {
Synchronizer synchronizer = getSynchronizer(new BeginErrorWBORepository(), new TrackingWBORepository());
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(BeginFailedException.class, e.getClass());
}
@Test
public void testSessionLocalBeginError() {
Synchronizer synchronizer = getSynchronizer(new TrackingWBORepository(), new BeginErrorWBORepository());
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(BeginFailedException.class, e.getClass());
}
@Test
public void testSessionRemoteFinishError() {
Synchronizer synchronizer = getSynchronizer(new FinishErrorWBORepository(), new TrackingWBORepository());
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(FinishFailedException.class, e.getClass());
}
@Test
public void testSessionLocalFinishError() {
Synchronizer synchronizer = getSynchronizer(new TrackingWBORepository(), new FinishErrorWBORepository());
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(FinishFailedException.class, e.getClass());
}
@Test
public void testSessionBothBeginError() {
Synchronizer synchronizer = getSynchronizer(new BeginErrorWBORepository(), new BeginErrorWBORepository());
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(BeginFailedException.class, e.getClass());
}
@Test
public void testSessionBothFinishError() {
Synchronizer synchronizer = getSynchronizer(new FinishErrorWBORepository(), new FinishErrorWBORepository());
Exception e = doSynchronize(synchronizer);
assertNotNull(e);
assertEquals(FinishFailedException.class, e.getClass());
}
}