1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mobile/android/tests/background/junit3/src/db/TestAndroidBrowserHistoryDataExtender.java Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,149 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +package org.mozilla.gecko.background.db; 1.8 + 1.9 +import java.io.IOException; 1.10 +import java.util.ArrayList; 1.11 + 1.12 +import org.json.simple.JSONArray; 1.13 +import org.json.simple.JSONObject; 1.14 +import org.json.simple.parser.ParseException; 1.15 +import org.mozilla.gecko.background.helpers.AndroidSyncTestCase; 1.16 +import org.mozilla.gecko.background.sync.helpers.HistoryHelpers; 1.17 +import org.mozilla.gecko.sync.ExtendedJSONObject; 1.18 +import org.mozilla.gecko.sync.NonArrayJSONException; 1.19 +import org.mozilla.gecko.sync.NonObjectJSONException; 1.20 +import org.mozilla.gecko.sync.Utils; 1.21 +import org.mozilla.gecko.sync.repositories.NullCursorException; 1.22 +import org.mozilla.gecko.sync.repositories.android.AndroidBrowserHistoryDataExtender; 1.23 +import org.mozilla.gecko.sync.repositories.android.RepoUtils; 1.24 +import org.mozilla.gecko.sync.repositories.domain.HistoryRecord; 1.25 + 1.26 +import android.database.Cursor; 1.27 + 1.28 +public class TestAndroidBrowserHistoryDataExtender extends AndroidSyncTestCase { 1.29 + 1.30 + protected AndroidBrowserHistoryDataExtender extender; 1.31 + protected static final String LOG_TAG = "SyncHistoryVisitsTest"; 1.32 + 1.33 + public void setUp() { 1.34 + extender = new AndroidBrowserHistoryDataExtender(getApplicationContext()); 1.35 + extender.wipe(); 1.36 + } 1.37 + 1.38 + public void tearDown() { 1.39 + extender.close(); 1.40 + } 1.41 + 1.42 + public void testStoreFetch() throws NullCursorException, NonObjectJSONException, IOException, ParseException { 1.43 + String guid = Utils.generateGuid(); 1.44 + extender.store(Utils.generateGuid(), null); 1.45 + extender.store(guid, null); 1.46 + extender.store(Utils.generateGuid(), null); 1.47 + 1.48 + Cursor cur = null; 1.49 + try { 1.50 + cur = extender.fetch(guid); 1.51 + assertEquals(1, cur.getCount()); 1.52 + assertTrue(cur.moveToFirst()); 1.53 + assertEquals(guid, cur.getString(0)); 1.54 + } finally { 1.55 + if (cur != null) { 1.56 + cur.close(); 1.57 + } 1.58 + } 1.59 + } 1.60 + 1.61 + public void testVisitsForGUID() throws NonArrayJSONException, NonObjectJSONException, IOException, ParseException, NullCursorException { 1.62 + String guid = Utils.generateGuid(); 1.63 + JSONArray visits = new ExtendedJSONObject("{ \"visits\": [ { \"key\" : \"value\" } ] }").getArray("visits"); 1.64 + 1.65 + extender.store(Utils.generateGuid(), null); 1.66 + extender.store(guid, visits); 1.67 + extender.store(Utils.generateGuid(), null); 1.68 + 1.69 + JSONArray fetchedVisits = extender.visitsForGUID(guid); 1.70 + assertEquals(1, fetchedVisits.size()); 1.71 + assertEquals("value", ((JSONObject)fetchedVisits.get(0)).get("key")); 1.72 + } 1.73 + 1.74 + public void testDeleteHandlesBadGUIDs() { 1.75 + String evilGUID = "' or '1'='1"; 1.76 + extender.store(Utils.generateGuid(), null); 1.77 + extender.store(Utils.generateGuid(), null); 1.78 + extender.store(evilGUID, null); 1.79 + extender.delete(evilGUID); 1.80 + 1.81 + Cursor cur = null; 1.82 + try { 1.83 + cur = extender.fetchAll(); 1.84 + assertEquals(cur.getCount(), 2); 1.85 + assertTrue(cur.moveToFirst()); 1.86 + while (!cur.isAfterLast()) { 1.87 + String guid = RepoUtils.getStringFromCursor(cur, AndroidBrowserHistoryDataExtender.COL_GUID); 1.88 + assertFalse(evilGUID.equals(guid)); 1.89 + cur.moveToNext(); 1.90 + } 1.91 + } catch (NullCursorException e) { 1.92 + e.printStackTrace(); 1.93 + fail("Should not have null cursor."); 1.94 + } finally { 1.95 + if (cur != null) { 1.96 + cur.close(); 1.97 + } 1.98 + } 1.99 + } 1.100 + 1.101 + public void testStoreFetchHandlesBadGUIDs() { 1.102 + String evilGUID = "' or '1'='1"; 1.103 + extender.store(Utils.generateGuid(), null); 1.104 + extender.store(Utils.generateGuid(), null); 1.105 + extender.store(evilGUID, null); 1.106 + 1.107 + Cursor cur = null; 1.108 + try { 1.109 + cur = extender.fetch(evilGUID); 1.110 + assertEquals(1, cur.getCount()); 1.111 + assertTrue(cur.moveToFirst()); 1.112 + while (!cur.isAfterLast()) { 1.113 + String guid = RepoUtils.getStringFromCursor(cur, AndroidBrowserHistoryDataExtender.COL_GUID); 1.114 + assertEquals(evilGUID, guid); 1.115 + cur.moveToNext(); 1.116 + } 1.117 + } catch (NullCursorException e) { 1.118 + e.printStackTrace(); 1.119 + fail("Should not have null cursor."); 1.120 + } finally { 1.121 + if (cur != null) { 1.122 + cur.close(); 1.123 + } 1.124 + } 1.125 + } 1.126 + 1.127 + public void testBulkInsert() throws NullCursorException { 1.128 + ArrayList<HistoryRecord> records = new ArrayList<HistoryRecord>(); 1.129 + records.add(HistoryHelpers.createHistory1()); 1.130 + records.add(HistoryHelpers.createHistory2()); 1.131 + extender.bulkInsert(records); 1.132 + 1.133 + for (HistoryRecord record : records) { 1.134 + HistoryRecord toCompare = (HistoryRecord) record.copyWithIDs(record.guid, record.androidID); 1.135 + toCompare.visits = extender.visitsForGUID(record.guid); 1.136 + assertEquals(record.visits.size(), toCompare.visits.size()); 1.137 + assertTrue(record.equals(toCompare)); 1.138 + } 1.139 + 1.140 + // Now insert existing records, changing one, and add another record. 1.141 + records.get(0).title = "test"; 1.142 + records.add(HistoryHelpers.createHistory3()); 1.143 + extender.bulkInsert(records); 1.144 + 1.145 + for (HistoryRecord record : records) { 1.146 + HistoryRecord toCompare = (HistoryRecord) record.copyWithIDs(record.guid, record.androidID); 1.147 + toCompare.visits = extender.visitsForGUID(record.guid); 1.148 + assertEquals(record.visits.size(), toCompare.visits.size()); 1.149 + assertTrue(record.equals(toCompare)); 1.150 + } 1.151 + } 1.152 +}