/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
package org.mozilla.gecko.sync.repositories.android.test;
import java.io.IOException;
import java.util.ArrayList;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import org.mozilla.android.sync.test.AndroidSyncTestCase;
import org.mozilla.android.sync.test.helpers.HistoryHelpers;
import org.mozilla.gecko.sync.ExtendedJSONObject;
import org.mozilla.gecko.sync.NonArrayJSONException;
import org.mozilla.gecko.sync.NonObjectJSONException;
import org.mozilla.gecko.sync.Utils;
import org.mozilla.gecko.sync.repositories.NullCursorException;
import org.mozilla.gecko.sync.repositories.android.AndroidBrowserHistoryDataExtender;
import org.mozilla.gecko.sync.repositories.android.RepoUtils;
import org.mozilla.gecko.sync.repositories.domain.HistoryRecord;
import android.database.Cursor;
public class AndroidBrowserHistoryDataExtenderTest extends AndroidSyncTestCase {
protected AndroidBrowserHistoryDataExtender extender;
protected static final String LOG_TAG = "SyncHistoryVisitsTest";
public void setUp() {
extender = new AndroidBrowserHistoryDataExtender(getApplicationContext());
extender.wipe();
}
public void tearDown() {
extender.close();
}
public void testStoreFetch() throws NullCursorException, NonObjectJSONException, IOException, ParseException {
String guid = Utils.generateGuid();
extender.store(Utils.generateGuid(), null);
extender.store(guid, null);
extender.store(Utils.generateGuid(), null);
Cursor cur = null;
try {
cur = extender.fetch(guid);
assertEquals(1, cur.getCount());
assertTrue(cur.moveToFirst());
assertEquals(guid, cur.getString(0));
} finally {
if (cur != null) {
cur.close();
}
}
}
public void testVisitsForGUID() throws NonArrayJSONException, NonObjectJSONException, IOException, ParseException, NullCursorException {
String guid = Utils.generateGuid();
JSONArray visits = new ExtendedJSONObject("{ \"visits\": [ { \"key\" : \"value\" } ] }").getArray("visits");
extender.store(Utils.generateGuid(), null);
extender.store(guid, visits);
extender.store(Utils.generateGuid(), null);
JSONArray fetchedVisits = extender.visitsForGUID(guid);
assertEquals(1, fetchedVisits.size());
assertEquals("value", ((JSONObject)fetchedVisits.get(0)).get("key"));
}
public void testDeleteHandlesBadGUIDs() {
String evilGUID = "' or '1'='1";
extender.store(Utils.generateGuid(), null);
extender.store(Utils.generateGuid(), null);
extender.store(evilGUID, null);
extender.delete(evilGUID);
Cursor cur = null;
try {
cur = extender.fetchAll();
assertEquals(cur.getCount(), 2);
assertTrue(cur.moveToFirst());
while (!cur.isAfterLast()) {
String guid = RepoUtils.getStringFromCursor(cur, AndroidBrowserHistoryDataExtender.COL_GUID);
assertFalse(evilGUID.equals(guid));
cur.moveToNext();
}
} catch (NullCursorException e) {
e.printStackTrace();
fail("Should not have null cursor.");
} finally {
if (cur != null) {
cur.close();
}
}
}
public void testStoreFetchHandlesBadGUIDs() {
String evilGUID = "' or '1'='1";
extender.store(Utils.generateGuid(), null);
extender.store(Utils.generateGuid(), null);
extender.store(evilGUID, null);
Cursor cur = null;
try {
cur = extender.fetch(evilGUID);
assertEquals(1, cur.getCount());
assertTrue(cur.moveToFirst());
while (!cur.isAfterLast()) {
String guid = RepoUtils.getStringFromCursor(cur, AndroidBrowserHistoryDataExtender.COL_GUID);
assertEquals(evilGUID, guid);
cur.moveToNext();
}
} catch (NullCursorException e) {
e.printStackTrace();
fail("Should not have null cursor.");
} finally {
if (cur != null) {
cur.close();
}
}
}
public void testBulkInsert() throws NullCursorException {
ArrayList<HistoryRecord> records = new ArrayList<HistoryRecord>();
records.add(HistoryHelpers.createHistory1());
records.add(HistoryHelpers.createHistory2());
extender.bulkInsert(records);
for (HistoryRecord record : records) {
HistoryRecord toCompare = (HistoryRecord) record.copyWithIDs(record.guid, record.androidID);
toCompare.visits = extender.visitsForGUID(record.guid);
assertEquals(record.visits.size(), toCompare.visits.size());
assertTrue(record.equals(toCompare));
}
// Now insert existing records, changing one, and add another record.
records.get(0).title = "test";
records.add(HistoryHelpers.createHistory3());
extender.bulkInsert(records);
for (HistoryRecord record : records) {
HistoryRecord toCompare = (HistoryRecord) record.copyWithIDs(record.guid, record.androidID);
toCompare.visits = extender.visitsForGUID(record.guid);
assertEquals(record.visits.size(), toCompare.visits.size());
assertTrue(record.equals(toCompare));
}
}
}