1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mobile/android/tests/background/junit3/src/healthreport/TestHealthReportSQLiteOpenHelper.java Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,165 @@ 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.healthreport; 1.8 + 1.9 +import org.mozilla.gecko.background.helpers.DBHelpers; 1.10 +import org.mozilla.gecko.background.helpers.FakeProfileTestCase; 1.11 + 1.12 +import android.content.ContentValues; 1.13 +import android.database.Cursor; 1.14 +import android.database.sqlite.SQLiteDatabase; 1.15 +import android.database.sqlite.SQLiteException; 1.16 + 1.17 +public class TestHealthReportSQLiteOpenHelper extends FakeProfileTestCase { 1.18 + private MockHealthReportSQLiteOpenHelper helper; 1.19 + 1.20 + @Override 1.21 + protected void setUp() throws Exception { 1.22 + super.setUp(); 1.23 + helper = null; 1.24 + } 1.25 + 1.26 + @Override 1.27 + protected void tearDown() throws Exception { 1.28 + if (helper != null) { 1.29 + helper.close(); 1.30 + helper = null; 1.31 + } 1.32 + super.tearDown(); 1.33 + } 1.34 + 1.35 + private MockHealthReportSQLiteOpenHelper createHelper(String name) { 1.36 + return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name); 1.37 + } 1.38 + 1.39 + private MockHealthReportSQLiteOpenHelper createHelper(String name, int version) { 1.40 + return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name, version); 1.41 + } 1.42 + 1.43 + public void testOpening() { 1.44 + helper = createHelper("health.db"); 1.45 + SQLiteDatabase db = helper.getWritableDatabase(); 1.46 + assertTrue(db.isOpen()); 1.47 + db.beginTransaction(); 1.48 + db.setTransactionSuccessful(); 1.49 + db.endTransaction(); 1.50 + helper.close(); 1.51 + assertFalse(db.isOpen()); 1.52 + } 1.53 + 1.54 + private void assertEmptyTable(SQLiteDatabase db, String table, String column) { 1.55 + Cursor c = db.query(table, new String[] { column }, 1.56 + null, null, null, null, null); 1.57 + assertNotNull(c); 1.58 + try { 1.59 + assertFalse(c.moveToFirst()); 1.60 + } finally { 1.61 + c.close(); 1.62 + } 1.63 + } 1.64 + 1.65 + public void testInit() { 1.66 + helper = createHelper("health-" + System.currentTimeMillis() + ".db"); 1.67 + SQLiteDatabase db = helper.getWritableDatabase(); 1.68 + assertTrue(db.isOpen()); 1.69 + 1.70 + db.beginTransaction(); 1.71 + try { 1.72 + // DB starts empty with correct tables. 1.73 + assertEmptyTable(db, "fields", "name"); 1.74 + assertEmptyTable(db, "measurements", "name"); 1.75 + assertEmptyTable(db, "events_textual", "field"); 1.76 + assertEmptyTable(db, "events_integer", "field"); 1.77 + assertEmptyTable(db, "events", "field"); 1.78 + 1.79 + // Throws for tables that don't exist. 1.80 + try { 1.81 + assertEmptyTable(db, "foobarbaz", "name"); 1.82 + } catch (SQLiteException e) { 1.83 + // Expected. 1.84 + } 1.85 + db.setTransactionSuccessful(); 1.86 + } finally { 1.87 + db.endTransaction(); 1.88 + } 1.89 + } 1.90 + 1.91 + public void testUpgradeDatabaseFrom4To5() throws Exception { 1.92 + final String dbName = "health-4To5.db"; 1.93 + helper = createHelper(dbName, 4); 1.94 + SQLiteDatabase db = helper.getWritableDatabase(); 1.95 + db.beginTransaction(); 1.96 + try { 1.97 + db.execSQL("PRAGMA foreign_keys=OFF;"); 1.98 + 1.99 + // Despite being referenced, this addon should be deleted because it is NULL. 1.100 + ContentValues v = new ContentValues(); 1.101 + v.put("body", (String) null); 1.102 + final long orphanedAddonID = db.insert("addons", null, v); 1.103 + v.put("body", "addon"); 1.104 + final long addonID = db.insert("addons", null, v); 1.105 + 1.106 + // environments -> addons 1.107 + v = new ContentValues(); 1.108 + v.put("hash", "orphanedEnv"); 1.109 + v.put("addonsID", orphanedAddonID); 1.110 + final long orphanedEnvID = db.insert("environments", null, v); 1.111 + v.put("hash", "env"); 1.112 + v.put("addonsID", addonID); 1.113 + final long envID = db.insert("environments", null, v); 1.114 + 1.115 + v = new ContentValues(); 1.116 + v.put("name", "measurement"); 1.117 + v.put("version", 1); 1.118 + final long measurementID = db.insert("measurements", null, v); 1.119 + 1.120 + // fields -> measurements 1.121 + v = new ContentValues(); 1.122 + v.put("name", "orphanedField"); 1.123 + v.put("measurement", DBHelpers.getNonExistentID(db, "measurements")); 1.124 + final long orphanedFieldID = db.insert("fields", null, v); 1.125 + v.put("name", "field"); 1.126 + v.put("measurement", measurementID); 1.127 + final long fieldID = db.insert("fields", null, v); 1.128 + 1.129 + // events -> environments, fields 1.130 + final String[] eventTables = {"events_integer", "events_textual"}; 1.131 + for (String table : eventTables) { 1.132 + v = new ContentValues(); 1.133 + v.put("env", envID); 1.134 + v.put("field", fieldID); 1.135 + db.insert(table, null, v); 1.136 + 1.137 + v.put("env", orphanedEnvID); 1.138 + v.put("field", fieldID); 1.139 + db.insert(table, null, v); 1.140 + 1.141 + v.put("env", envID); 1.142 + v.put("field", orphanedFieldID); 1.143 + db.insert(table, null, v); 1.144 + 1.145 + v.put("env", orphanedEnvID); 1.146 + v.put("field", orphanedFieldID); 1.147 + db.insert(table, null, v); 1.148 + } 1.149 + 1.150 + db.setTransactionSuccessful(); 1.151 + } finally { 1.152 + db.endTransaction(); 1.153 + helper.close(); 1.154 + } 1.155 + 1.156 + // Upgrade. 1.157 + helper = createHelper(dbName, 5); 1.158 + // Despite only reading from it, open a writable database so we can better replicate what 1.159 + // might happen in production (most notably, this should enable foreign keys). 1.160 + db = helper.getWritableDatabase(); 1.161 + 1.162 + assertEquals(1, DBHelpers.getRowCount(db, "addons")); 1.163 + assertEquals(1, DBHelpers.getRowCount(db, "measurements")); 1.164 + assertEquals(1, DBHelpers.getRowCount(db, "fields")); 1.165 + assertEquals(1, DBHelpers.getRowCount(db, "events_integer")); 1.166 + assertEquals(1, DBHelpers.getRowCount(db, "events_textual")); 1.167 + } 1.168 +}