/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.android.sync.test.helpers;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import junit.framework.AssertionFailedError;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.repositories.delegates.DeferredRepositorySessionFetchRecordsDelegate;
import org.mozilla.gecko.sync.repositories.delegates.RepositorySessionFetchRecordsDelegate;
import org.mozilla.gecko.sync.repositories.domain.Record;
public class DefaultFetchDelegate extends DefaultDelegate implements RepositorySessionFetchRecordsDelegate {
private static final String LOG_TAG = "DefaultFetchDelegate";
public ArrayList<Record> records = new ArrayList<Record>();
public Set<String> ignore = new HashSet<String>();
@Override
public void onFetchFailed(Exception ex, Record record) {
performNotify("Fetch failed.", ex);
}
protected void onDone(ArrayList<Record> records, HashMap<String, Record> expected, long end) {
Logger.debug(LOG_TAG, "onDone.");
Logger.debug(LOG_TAG, "End timestamp is " + end);
Logger.debug(LOG_TAG, "Expected is " + expected);
Logger.debug(LOG_TAG, "Records is " + records);
Set<String> foundGuids = new HashSet<String>();
try {
int expectedCount = 0;
int expectedFound = 0;
Logger.debug(LOG_TAG, "Counting expected keys.");
for (String key : expected.keySet()) {
if (!ignore.contains(key)) {
expectedCount++;
}
}
Logger.debug(LOG_TAG, "Expected keys: " + expectedCount);
for (Record record : records) {
Logger.debug(LOG_TAG, "Record.");
Logger.debug(LOG_TAG, record.guid);
// Ignore special GUIDs (e.g., for bookmarks).
if (!ignore.contains(record.guid)) {
if (foundGuids.contains(record.guid)) {
fail("Found duplicate guid " + record.guid);
}
Record expect = expected.get(record.guid);
if (expect == null) {
fail("Do not expect to get back a record with guid: " + record.guid); // Caught below
}
Logger.debug(LOG_TAG, "Checking equality.");
try {
assertTrue(expect.equalPayloads(record)); // Caught below
} catch (Exception e) {
Logger.error(LOG_TAG, "ONOZ!", e);
}
Logger.debug(LOG_TAG, "Checked equality.");
expectedFound += 1;
// Track record once we've found it.
foundGuids.add(record.guid);
}
}
assertEquals(expectedCount, expectedFound); // Caught below
Logger.debug(LOG_TAG, "Notifying success.");
performNotify();
} catch (AssertionFailedError e) {
Logger.error(LOG_TAG, "Notifying assertion failure.");
performNotify(e);
} catch (Exception e) {
Logger.error(LOG_TAG, "No!");
performNotify();
}
}
public int recordCount() {
return (this.records == null) ? 0 : this.records.size();
}
@Override
public void onFetchedRecord(Record record) {
Logger.debug(LOG_TAG, "onFetchedRecord(" + record.guid + ")");
records.add(record);
}
@Override
public void onFetchCompleted(final long fetchEnd) {
Logger.debug(LOG_TAG, "onFetchCompleted. Doing nothing.");
}
@Override
public RepositorySessionFetchRecordsDelegate deferredFetchDelegate(final ExecutorService executor) {
return new DeferredRepositorySessionFetchRecordsDelegate(this, executor);
}
}