|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 package org.mozilla.gecko.background.healthreport; |
|
5 |
|
6 import org.mozilla.gecko.background.helpers.DBHelpers; |
|
7 import org.mozilla.gecko.background.helpers.FakeProfileTestCase; |
|
8 |
|
9 import android.content.ContentValues; |
|
10 import android.database.Cursor; |
|
11 import android.database.sqlite.SQLiteDatabase; |
|
12 import android.database.sqlite.SQLiteException; |
|
13 |
|
14 public class TestHealthReportSQLiteOpenHelper extends FakeProfileTestCase { |
|
15 private MockHealthReportSQLiteOpenHelper helper; |
|
16 |
|
17 @Override |
|
18 protected void setUp() throws Exception { |
|
19 super.setUp(); |
|
20 helper = null; |
|
21 } |
|
22 |
|
23 @Override |
|
24 protected void tearDown() throws Exception { |
|
25 if (helper != null) { |
|
26 helper.close(); |
|
27 helper = null; |
|
28 } |
|
29 super.tearDown(); |
|
30 } |
|
31 |
|
32 private MockHealthReportSQLiteOpenHelper createHelper(String name) { |
|
33 return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name); |
|
34 } |
|
35 |
|
36 private MockHealthReportSQLiteOpenHelper createHelper(String name, int version) { |
|
37 return new MockHealthReportSQLiteOpenHelper(context, fakeProfileDirectory, name, version); |
|
38 } |
|
39 |
|
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 } |
|
50 |
|
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 } |
|
61 |
|
62 public void testInit() { |
|
63 helper = createHelper("health-" + System.currentTimeMillis() + ".db"); |
|
64 SQLiteDatabase db = helper.getWritableDatabase(); |
|
65 assertTrue(db.isOpen()); |
|
66 |
|
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"); |
|
75 |
|
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 } |
|
87 |
|
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;"); |
|
95 |
|
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); |
|
102 |
|
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); |
|
111 |
|
112 v = new ContentValues(); |
|
113 v.put("name", "measurement"); |
|
114 v.put("version", 1); |
|
115 final long measurementID = db.insert("measurements", null, v); |
|
116 |
|
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); |
|
125 |
|
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); |
|
133 |
|
134 v.put("env", orphanedEnvID); |
|
135 v.put("field", fieldID); |
|
136 db.insert(table, null, v); |
|
137 |
|
138 v.put("env", envID); |
|
139 v.put("field", orphanedFieldID); |
|
140 db.insert(table, null, v); |
|
141 |
|
142 v.put("env", orphanedEnvID); |
|
143 v.put("field", orphanedFieldID); |
|
144 db.insert(table, null, v); |
|
145 } |
|
146 |
|
147 db.setTransactionSuccessful(); |
|
148 } finally { |
|
149 db.endTransaction(); |
|
150 helper.close(); |
|
151 } |
|
152 |
|
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(); |
|
158 |
|
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 } |