mobile/android/tests/background/junit3/src/healthreport/TestHealthReportSQLiteOpenHelper.java

changeset 0
6474c204b198
     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 +}

mercurial