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

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rw-r--r--

Correct previous dual key logic pending first delivery installment.

     1 /* Any copyright is dedicated to the Public Domain.
     2    http://creativecommons.org/publicdomain/zero/1.0/ */
     4 package org.mozilla.gecko.background.healthreport;
     6 import org.mozilla.gecko.background.helpers.DBHelpers;
     7 import org.mozilla.gecko.background.helpers.FakeProfileTestCase;
     9 import android.content.ContentValues;
    10 import android.database.Cursor;
    11 import android.database.sqlite.SQLiteDatabase;
    12 import android.database.sqlite.SQLiteException;
    14 public class TestHealthReportSQLiteOpenHelper extends FakeProfileTestCase {
    15   private MockHealthReportSQLiteOpenHelper helper;
    17   @Override
    18   protected void setUp() throws Exception {
    19     super.setUp();
    20     helper = null;
    21   }
    23   @Override
    24   protected void tearDown() throws Exception {
    25     if (helper != null) {
    26       helper.close();
    27       helper = null;
    28     }
    29     super.tearDown();
    30   }
    32   private MockHealthReportSQLiteOpenHelper createHelper(String name) {
    33     return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name);
    34   }
    36   private MockHealthReportSQLiteOpenHelper createHelper(String name, int version) {
    37     return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name, version);
    38   }
    40   public void testOpening() {
    41     helper = createHelper("health.db");
    42     SQLiteDatabase db = helper.getWritableDatabase();
    43     assertTrue(db.isOpen());
    44     db.beginTransaction();
    45     db.setTransactionSuccessful();
    46     db.endTransaction();
    47     helper.close();
    48     assertFalse(db.isOpen());
    49   }
    51   private void assertEmptyTable(SQLiteDatabase db, String table, String column) {
    52     Cursor c = db.query(table, new String[] { column },
    53                         null, null, null, null, null);
    54     assertNotNull(c);
    55     try {
    56       assertFalse(c.moveToFirst());
    57     } finally {
    58       c.close();
    59     }
    60   }
    62   public void testInit() {
    63     helper = createHelper("health-" + System.currentTimeMillis() + ".db");
    64     SQLiteDatabase db = helper.getWritableDatabase();
    65     assertTrue(db.isOpen());
    67     db.beginTransaction();
    68     try {
    69       // DB starts empty with correct tables.
    70       assertEmptyTable(db, "fields", "name");
    71       assertEmptyTable(db, "measurements", "name");
    72       assertEmptyTable(db, "events_textual", "field");
    73       assertEmptyTable(db, "events_integer", "field");
    74       assertEmptyTable(db, "events", "field");
    76       // Throws for tables that don't exist.
    77       try {
    78         assertEmptyTable(db, "foobarbaz", "name");
    79       } catch (SQLiteException e) {
    80         // Expected.
    81       }
    82       db.setTransactionSuccessful();
    83     } finally {
    84       db.endTransaction();
    85     }
    86   }
    88   public void testUpgradeDatabaseFrom4To5() throws Exception {
    89     final String dbName = "health-4To5.db";
    90     helper = createHelper(dbName, 4);
    91     SQLiteDatabase db = helper.getWritableDatabase();
    92     db.beginTransaction();
    93     try {
    94       db.execSQL("PRAGMA foreign_keys=OFF;");
    96       // Despite being referenced, this addon should be deleted because it is NULL.
    97       ContentValues v = new ContentValues();
    98       v.put("body", (String) null);
    99       final long orphanedAddonID = db.insert("addons", null, v);
   100       v.put("body", "addon");
   101       final long addonID = db.insert("addons", null, v);
   103       // environments -> addons
   104       v = new ContentValues();
   105       v.put("hash", "orphanedEnv");
   106       v.put("addonsID", orphanedAddonID);
   107       final long orphanedEnvID = db.insert("environments", null, v);
   108       v.put("hash", "env");
   109       v.put("addonsID", addonID);
   110       final long envID = db.insert("environments", null, v);
   112       v = new ContentValues();
   113       v.put("name", "measurement");
   114       v.put("version", 1);
   115       final long measurementID = db.insert("measurements", null, v);
   117       // fields -> measurements
   118       v = new ContentValues();
   119       v.put("name", "orphanedField");
   120       v.put("measurement", DBHelpers.getNonExistentID(db, "measurements"));
   121       final long orphanedFieldID = db.insert("fields", null, v);
   122       v.put("name", "field");
   123       v.put("measurement", measurementID);
   124       final long fieldID = db.insert("fields", null, v);
   126       // events -> environments, fields
   127       final String[] eventTables = {"events_integer", "events_textual"};
   128       for (String table : eventTables) {
   129         v = new ContentValues();
   130         v.put("env", envID);
   131         v.put("field", fieldID);
   132         db.insert(table, null, v);
   134         v.put("env", orphanedEnvID);
   135         v.put("field", fieldID);
   136         db.insert(table, null, v);
   138         v.put("env", envID);
   139         v.put("field", orphanedFieldID);
   140         db.insert(table, null, v);
   142         v.put("env", orphanedEnvID);
   143         v.put("field", orphanedFieldID);
   144         db.insert(table, null, v);
   145       }
   147       db.setTransactionSuccessful();
   148     } finally {
   149       db.endTransaction();
   150       helper.close();
   151     }
   153     // Upgrade.
   154     helper = createHelper(dbName, 5);
   155     // Despite only reading from it, open a writable database so we can better replicate what
   156     // might happen in production (most notably, this should enable foreign keys).
   157     db = helper.getWritableDatabase();
   159     assertEquals(1, DBHelpers.getRowCount(db, "addons"));
   160     assertEquals(1, DBHelpers.getRowCount(db, "measurements"));
   161     assertEquals(1, DBHelpers.getRowCount(db, "fields"));
   162     assertEquals(1, DBHelpers.getRowCount(db, "events_integer"));
   163     assertEquals(1, DBHelpers.getRowCount(db, "events_textual"));
   164   }
   165 }

mercurial