michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: package org.mozilla.gecko.background.healthreport; michael@0: michael@0: import org.mozilla.gecko.background.helpers.DBHelpers; michael@0: import org.mozilla.gecko.background.helpers.FakeProfileTestCase; michael@0: michael@0: import android.content.ContentValues; michael@0: import android.database.Cursor; michael@0: import android.database.sqlite.SQLiteDatabase; michael@0: import android.database.sqlite.SQLiteException; michael@0: michael@0: public class TestHealthReportSQLiteOpenHelper extends FakeProfileTestCase { michael@0: private MockHealthReportSQLiteOpenHelper helper; michael@0: michael@0: @Override michael@0: protected void setUp() throws Exception { michael@0: super.setUp(); michael@0: helper = null; michael@0: } michael@0: michael@0: @Override michael@0: protected void tearDown() throws Exception { michael@0: if (helper != null) { michael@0: helper.close(); michael@0: helper = null; michael@0: } michael@0: super.tearDown(); michael@0: } michael@0: michael@0: private MockHealthReportSQLiteOpenHelper createHelper(String name) { michael@0: return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name); michael@0: } michael@0: michael@0: private MockHealthReportSQLiteOpenHelper createHelper(String name, int version) { michael@0: return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name, version); michael@0: } michael@0: michael@0: public void testOpening() { michael@0: helper = createHelper("health.db"); michael@0: SQLiteDatabase db = helper.getWritableDatabase(); michael@0: assertTrue(db.isOpen()); michael@0: db.beginTransaction(); michael@0: db.setTransactionSuccessful(); michael@0: db.endTransaction(); michael@0: helper.close(); michael@0: assertFalse(db.isOpen()); michael@0: } michael@0: michael@0: private void assertEmptyTable(SQLiteDatabase db, String table, String column) { michael@0: Cursor c = db.query(table, new String[] { column }, michael@0: null, null, null, null, null); michael@0: assertNotNull(c); michael@0: try { michael@0: assertFalse(c.moveToFirst()); michael@0: } finally { michael@0: c.close(); michael@0: } michael@0: } michael@0: michael@0: public void testInit() { michael@0: helper = createHelper("health-" + System.currentTimeMillis() + ".db"); michael@0: SQLiteDatabase db = helper.getWritableDatabase(); michael@0: assertTrue(db.isOpen()); michael@0: michael@0: db.beginTransaction(); michael@0: try { michael@0: // DB starts empty with correct tables. michael@0: assertEmptyTable(db, "fields", "name"); michael@0: assertEmptyTable(db, "measurements", "name"); michael@0: assertEmptyTable(db, "events_textual", "field"); michael@0: assertEmptyTable(db, "events_integer", "field"); michael@0: assertEmptyTable(db, "events", "field"); michael@0: michael@0: // Throws for tables that don't exist. michael@0: try { michael@0: assertEmptyTable(db, "foobarbaz", "name"); michael@0: } catch (SQLiteException e) { michael@0: // Expected. michael@0: } michael@0: db.setTransactionSuccessful(); michael@0: } finally { michael@0: db.endTransaction(); michael@0: } michael@0: } michael@0: michael@0: public void testUpgradeDatabaseFrom4To5() throws Exception { michael@0: final String dbName = "health-4To5.db"; michael@0: helper = createHelper(dbName, 4); michael@0: SQLiteDatabase db = helper.getWritableDatabase(); michael@0: db.beginTransaction(); michael@0: try { michael@0: db.execSQL("PRAGMA foreign_keys=OFF;"); michael@0: michael@0: // Despite being referenced, this addon should be deleted because it is NULL. michael@0: ContentValues v = new ContentValues(); michael@0: v.put("body", (String) null); michael@0: final long orphanedAddonID = db.insert("addons", null, v); michael@0: v.put("body", "addon"); michael@0: final long addonID = db.insert("addons", null, v); michael@0: michael@0: // environments -> addons michael@0: v = new ContentValues(); michael@0: v.put("hash", "orphanedEnv"); michael@0: v.put("addonsID", orphanedAddonID); michael@0: final long orphanedEnvID = db.insert("environments", null, v); michael@0: v.put("hash", "env"); michael@0: v.put("addonsID", addonID); michael@0: final long envID = db.insert("environments", null, v); michael@0: michael@0: v = new ContentValues(); michael@0: v.put("name", "measurement"); michael@0: v.put("version", 1); michael@0: final long measurementID = db.insert("measurements", null, v); michael@0: michael@0: // fields -> measurements michael@0: v = new ContentValues(); michael@0: v.put("name", "orphanedField"); michael@0: v.put("measurement", DBHelpers.getNonExistentID(db, "measurements")); michael@0: final long orphanedFieldID = db.insert("fields", null, v); michael@0: v.put("name", "field"); michael@0: v.put("measurement", measurementID); michael@0: final long fieldID = db.insert("fields", null, v); michael@0: michael@0: // events -> environments, fields michael@0: final String[] eventTables = {"events_integer", "events_textual"}; michael@0: for (String table : eventTables) { michael@0: v = new ContentValues(); michael@0: v.put("env", envID); michael@0: v.put("field", fieldID); michael@0: db.insert(table, null, v); michael@0: michael@0: v.put("env", orphanedEnvID); michael@0: v.put("field", fieldID); michael@0: db.insert(table, null, v); michael@0: michael@0: v.put("env", envID); michael@0: v.put("field", orphanedFieldID); michael@0: db.insert(table, null, v); michael@0: michael@0: v.put("env", orphanedEnvID); michael@0: v.put("field", orphanedFieldID); michael@0: db.insert(table, null, v); michael@0: } michael@0: michael@0: db.setTransactionSuccessful(); michael@0: } finally { michael@0: db.endTransaction(); michael@0: helper.close(); michael@0: } michael@0: michael@0: // Upgrade. michael@0: helper = createHelper(dbName, 5); michael@0: // Despite only reading from it, open a writable database so we can better replicate what michael@0: // might happen in production (most notably, this should enable foreign keys). michael@0: db = helper.getWritableDatabase(); michael@0: michael@0: assertEquals(1, DBHelpers.getRowCount(db, "addons")); michael@0: assertEquals(1, DBHelpers.getRowCount(db, "measurements")); michael@0: assertEquals(1, DBHelpers.getRowCount(db, "fields")); michael@0: assertEquals(1, DBHelpers.getRowCount(db, "events_integer")); michael@0: assertEquals(1, DBHelpers.getRowCount(db, "events_textual")); michael@0: } michael@0: }