|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 package org.mozilla.gecko.background.db; |
|
5 |
|
6 import org.json.simple.JSONArray; |
|
7 import org.mozilla.gecko.db.BrowserContract; |
|
8 import org.mozilla.gecko.sync.repositories.android.BrowserContractHelpers; |
|
9 |
|
10 import android.app.Activity; |
|
11 import android.content.ContentProviderClient; |
|
12 import android.content.ContentResolver; |
|
13 import android.content.ContentValues; |
|
14 import android.database.Cursor; |
|
15 import android.net.Uri; |
|
16 import android.os.RemoteException; |
|
17 import android.test.ActivityInstrumentationTestCase2; |
|
18 |
|
19 /** |
|
20 * Exercise Fennec's tabs provider. |
|
21 * |
|
22 * @author rnewman |
|
23 * |
|
24 */ |
|
25 public class TestFennecTabsStorage extends ActivityInstrumentationTestCase2<Activity> { |
|
26 public static final String TEST_CLIENT_GUID = "test guid"; // Real GUIDs never contain spaces. |
|
27 public static final String TEST_CLIENT_NAME = "test client name"; |
|
28 |
|
29 public static final String TABS_CLIENT_GUID_IS = BrowserContract.Tabs.CLIENT_GUID + " = ?"; |
|
30 |
|
31 protected Tab testTab1; |
|
32 protected Tab testTab2; |
|
33 protected Tab testTab3; |
|
34 |
|
35 public TestFennecTabsStorage() { |
|
36 super(Activity.class); |
|
37 } |
|
38 |
|
39 protected ContentProviderClient getClientsClient() { |
|
40 final ContentResolver cr = getInstrumentation().getTargetContext().getApplicationContext().getContentResolver(); |
|
41 return cr.acquireContentProviderClient(BrowserContractHelpers.CLIENTS_CONTENT_URI); |
|
42 } |
|
43 |
|
44 protected ContentProviderClient getTabsClient() { |
|
45 final ContentResolver cr = getInstrumentation().getTargetContext().getApplicationContext().getContentResolver(); |
|
46 return cr.acquireContentProviderClient(BrowserContractHelpers.TABS_CONTENT_URI); |
|
47 } |
|
48 |
|
49 protected int deleteAllTestTabs(final ContentProviderClient tabsClient) throws RemoteException { |
|
50 if (tabsClient == null) { |
|
51 return -1; |
|
52 } |
|
53 return tabsClient.delete(BrowserContractHelpers.TABS_CONTENT_URI, TABS_CLIENT_GUID_IS, new String[] { TEST_CLIENT_GUID }); |
|
54 } |
|
55 |
|
56 @Override |
|
57 protected void tearDown() throws Exception { |
|
58 deleteAllTestTabs(getTabsClient()); |
|
59 } |
|
60 |
|
61 @SuppressWarnings("unchecked") |
|
62 protected void insertSomeTestTabs(ContentProviderClient tabsClient) throws RemoteException { |
|
63 final JSONArray history1 = new JSONArray(); |
|
64 history1.add("http://test.com/test1.html"); |
|
65 testTab1 = new Tab("test title 1", "http://test.com/test1.png", history1, 1000); |
|
66 |
|
67 final JSONArray history2 = new JSONArray(); |
|
68 history2.add("http://test.com/test2.html#1"); |
|
69 history2.add("http://test.com/test2.html#2"); |
|
70 history2.add("http://test.com/test2.html#3"); |
|
71 testTab2 = new Tab("test title 2", "http://test.com/test2.png", history2, 2000); |
|
72 |
|
73 final JSONArray history3 = new JSONArray(); |
|
74 history3.add("http://test.com/test3.html#1"); |
|
75 history3.add("http://test.com/test3.html#2"); |
|
76 testTab3 = new Tab("test title 3", "http://test.com/test3.png", history3, 3000); |
|
77 |
|
78 tabsClient.insert(BrowserContractHelpers.TABS_CONTENT_URI, testTab1.toContentValues(TEST_CLIENT_GUID, 0)); |
|
79 tabsClient.insert(BrowserContractHelpers.TABS_CONTENT_URI, testTab2.toContentValues(TEST_CLIENT_GUID, 1)); |
|
80 tabsClient.insert(BrowserContractHelpers.TABS_CONTENT_URI, testTab3.toContentValues(TEST_CLIENT_GUID, 2)); |
|
81 } |
|
82 |
|
83 // Sanity. |
|
84 public void testObtainCP() { |
|
85 final ContentProviderClient clientsClient = getClientsClient(); |
|
86 assertNotNull(clientsClient); |
|
87 clientsClient.release(); |
|
88 |
|
89 final ContentProviderClient tabsClient = getTabsClient(); |
|
90 assertNotNull(tabsClient); |
|
91 tabsClient.release(); |
|
92 } |
|
93 |
|
94 public void testWipeClients() throws RemoteException { |
|
95 final Uri uri = BrowserContractHelpers.CLIENTS_CONTENT_URI; |
|
96 final ContentProviderClient clientsClient = getClientsClient(); |
|
97 |
|
98 // Have to ensure that it's empty… |
|
99 clientsClient.delete(uri, null, null); |
|
100 |
|
101 int deleted = clientsClient.delete(uri, null, null); |
|
102 assertEquals(0, deleted); |
|
103 } |
|
104 |
|
105 public void testWipeTabs() throws RemoteException { |
|
106 final ContentProviderClient tabsClient = getTabsClient(); |
|
107 |
|
108 // Have to ensure that it's empty… |
|
109 deleteAllTestTabs(tabsClient); |
|
110 |
|
111 int deleted = deleteAllTestTabs(tabsClient); |
|
112 assertEquals(0, deleted); |
|
113 } |
|
114 |
|
115 public void testStoreAndRetrieveClients() throws RemoteException { |
|
116 final Uri uri = BrowserContractHelpers.CLIENTS_CONTENT_URI; |
|
117 final ContentProviderClient clientsClient = getClientsClient(); |
|
118 |
|
119 // Have to ensure that it's empty… |
|
120 clientsClient.delete(uri, null, null); |
|
121 |
|
122 final long now = System.currentTimeMillis(); |
|
123 final ContentValues first = new ContentValues(); |
|
124 final ContentValues second = new ContentValues(); |
|
125 first.put(BrowserContract.Clients.GUID, "abcdefghijkl"); |
|
126 first.put(BrowserContract.Clients.NAME, "Frist Psot"); |
|
127 first.put(BrowserContract.Clients.LAST_MODIFIED, now + 1); |
|
128 second.put(BrowserContract.Clients.GUID, "mnopqrstuvwx"); |
|
129 second.put(BrowserContract.Clients.NAME, "Second!!1!"); |
|
130 second.put(BrowserContract.Clients.LAST_MODIFIED, now + 2); |
|
131 |
|
132 ContentValues[] values = new ContentValues[] { first, second }; |
|
133 final int inserted = clientsClient.bulkInsert(uri, values); |
|
134 assertEquals(2, inserted); |
|
135 |
|
136 final String since = BrowserContract.Clients.LAST_MODIFIED + " >= ?"; |
|
137 final String[] nowArg = new String[] { String.valueOf(now) }; |
|
138 final String guidAscending = BrowserContract.Clients.GUID + " ASC"; |
|
139 Cursor cursor = clientsClient.query(uri, null, since, nowArg, guidAscending); |
|
140 |
|
141 assertNotNull(cursor); |
|
142 try { |
|
143 assertTrue(cursor.moveToFirst()); |
|
144 assertEquals(2, cursor.getCount()); |
|
145 |
|
146 final String g1 = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Clients.GUID)); |
|
147 final String n1 = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Clients.NAME)); |
|
148 final long m1 = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Clients.LAST_MODIFIED)); |
|
149 assertEquals(first.get(BrowserContract.Clients.GUID), g1); |
|
150 assertEquals(first.get(BrowserContract.Clients.NAME), n1); |
|
151 assertEquals(now + 1, m1); |
|
152 |
|
153 assertTrue(cursor.moveToNext()); |
|
154 final String g2 = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Clients.GUID)); |
|
155 final String n2 = cursor.getString(cursor.getColumnIndexOrThrow(BrowserContract.Clients.NAME)); |
|
156 final long m2 = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Clients.LAST_MODIFIED)); |
|
157 assertEquals(second.get(BrowserContract.Clients.GUID), g2); |
|
158 assertEquals(second.get(BrowserContract.Clients.NAME), n2); |
|
159 assertEquals(now + 2, m2); |
|
160 |
|
161 assertFalse(cursor.moveToNext()); |
|
162 } finally { |
|
163 cursor.close(); |
|
164 } |
|
165 |
|
166 int deleted = clientsClient.delete(uri, null, null); |
|
167 assertEquals(2, deleted); |
|
168 } |
|
169 |
|
170 public void testTabFromCursor() throws Exception { |
|
171 final ContentProviderClient tabsClient = getTabsClient(); |
|
172 |
|
173 deleteAllTestTabs(tabsClient); |
|
174 insertSomeTestTabs(tabsClient); |
|
175 |
|
176 final String positionAscending = BrowserContract.Tabs.POSITION + " ASC"; |
|
177 Cursor cursor = null; |
|
178 try { |
|
179 cursor = tabsClient.query(BrowserContractHelpers.TABS_CONTENT_URI, null, TABS_CLIENT_GUID_IS, new String[] { TEST_CLIENT_GUID }, positionAscending); |
|
180 assertEquals(3, cursor.getCount()); |
|
181 |
|
182 cursor.moveToFirst(); |
|
183 final Tab parsed1 = Tab.fromCursor(cursor); |
|
184 assertEquals(testTab1, parsed1); |
|
185 |
|
186 cursor.moveToNext(); |
|
187 final Tab parsed2 = Tab.fromCursor(cursor); |
|
188 assertEquals(testTab2, parsed2); |
|
189 |
|
190 cursor.moveToPosition(2); |
|
191 final Tab parsed3 = Tab.fromCursor(cursor); |
|
192 assertEquals(testTab3, parsed3); |
|
193 } finally { |
|
194 cursor.close(); |
|
195 } |
|
196 } |
|
197 } |