Wed, 31 Dec 2014 07:22:50 +0100
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 }