OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.webapps; | 5 package org.chromium.chrome.browser.webapps; |
6 | 6 |
7 import static org.junit.Assert.assertEquals; | 7 import static org.junit.Assert.assertEquals; |
8 import static org.junit.Assert.assertTrue; | 8 import static org.junit.Assert.assertTrue; |
9 | 9 |
10 import android.content.Context; | 10 import android.content.Context; |
11 import android.content.Intent; | 11 import android.content.Intent; |
12 import android.content.SharedPreferences; | 12 import android.content.SharedPreferences; |
13 import android.graphics.Bitmap; | 13 import android.graphics.Bitmap; |
14 import android.os.AsyncTask; | 14 import android.os.AsyncTask; |
15 | 15 |
| 16 import org.junit.After; |
| 17 import org.junit.Before; |
| 18 import org.junit.Test; |
| 19 import org.junit.runner.RunWith; |
| 20 |
| 21 import org.robolectric.RuntimeEnvironment; |
| 22 import org.robolectric.annotation.Config; |
| 23 import org.robolectric.shadows.ShadowLooper; |
| 24 |
16 import org.chromium.base.ContextUtils; | 25 import org.chromium.base.ContextUtils; |
17 import org.chromium.base.test.util.Feature; | 26 import org.chromium.base.test.util.Feature; |
18 import org.chromium.blink_public.platform.WebDisplayMode; | 27 import org.chromium.blink_public.platform.WebDisplayMode; |
19 import org.chromium.chrome.browser.ShortcutHelper; | 28 import org.chromium.chrome.browser.ShortcutHelper; |
20 import org.chromium.testing.local.BackgroundShadowAsyncTask; | 29 import org.chromium.testing.local.BackgroundShadowAsyncTask; |
21 import org.chromium.testing.local.LocalRobolectricTestRunner; | 30 import org.chromium.testing.local.LocalRobolectricTestRunner; |
22 import org.junit.After; | |
23 import org.junit.Before; | |
24 import org.junit.Test; | |
25 import org.junit.runner.RunWith; | |
26 import org.robolectric.RuntimeEnvironment; | |
27 import org.robolectric.annotation.Config; | |
28 import org.robolectric.shadows.ShadowLooper; | |
29 | 31 |
30 import java.util.concurrent.TimeUnit; | 32 import java.util.concurrent.TimeUnit; |
31 | 33 |
32 /** | 34 /** |
33 * Tests the WebappDataStorage class by ensuring that it persists data to | 35 * Tests the WebappDataStorage class by ensuring that it persists data to |
34 * SharedPreferences as expected. | 36 * SharedPreferences as expected. |
35 */ | 37 */ |
36 @RunWith(LocalRobolectricTestRunner.class) | 38 @RunWith(LocalRobolectricTestRunner.class) |
37 @Config(manifest = Config.NONE, shadows = {BackgroundShadowAsyncTask.class}) | 39 @Config(manifest = Config.NONE, shadows = {BackgroundShadowAsyncTask.class}) |
38 public class WebappDataStorageTest { | 40 public class WebappDataStorageTest { |
(...skipping 29 matching lines...) Expand all Loading... |
68 @Override | 70 @Override |
69 public long currentTimeMillis() { | 71 public long currentTimeMillis() { |
70 return mCurrentTime; | 72 return mCurrentTime; |
71 } | 73 } |
72 } | 74 } |
73 | 75 |
74 @Before | 76 @Before |
75 public void setUp() throws Exception { | 77 public void setUp() throws Exception { |
76 ContextUtils.initApplicationContextForTests(RuntimeEnvironment.applicati
on); | 78 ContextUtils.initApplicationContextForTests(RuntimeEnvironment.applicati
on); |
77 mSharedPreferences = ContextUtils.getApplicationContext().getSharedPrefe
rences( | 79 mSharedPreferences = ContextUtils.getApplicationContext().getSharedPrefe
rences( |
78 "webapp_test", Context.MODE_PRIVATE); | 80 WebappDataStorage.SHARED_PREFS_FILE_PREFIX + "test", Context.MOD
E_PRIVATE); |
79 | 81 |
80 // Set the last_used as if the web app had been registered by WebappRegi
stry. | 82 // Set the last_used as if the web app had been registered by WebappRegi
stry. |
81 mSharedPreferences.edit().putLong("last_used", 0).apply(); | 83 mSharedPreferences.edit().putLong(WebappDataStorage.KEY_LAST_USED, 0).ap
ply(); |
82 | 84 |
83 mCallbackCalled = false; | 85 mCallbackCalled = false; |
84 } | 86 } |
85 | 87 |
86 @After | 88 @After |
87 public void tearDown() { | 89 public void tearDown() { |
88 mSharedPreferences.edit().clear().apply(); | 90 mSharedPreferences.edit().clear().apply(); |
89 } | 91 } |
90 | 92 |
91 @Test | 93 @Test |
(...skipping 12 matching lines...) Expand all Loading... |
104 assertEquals("background_color", WebappDataStorage.KEY_BACKGROUND_COLOR)
; | 106 assertEquals("background_color", WebappDataStorage.KEY_BACKGROUND_COLOR)
; |
105 assertEquals("source", WebappDataStorage.KEY_SOURCE); | 107 assertEquals("source", WebappDataStorage.KEY_SOURCE); |
106 assertEquals("action", WebappDataStorage.KEY_ACTION); | 108 assertEquals("action", WebappDataStorage.KEY_ACTION); |
107 assertEquals("is_icon_generated", WebappDataStorage.KEY_IS_ICON_GENERATE
D); | 109 assertEquals("is_icon_generated", WebappDataStorage.KEY_IS_ICON_GENERATE
D); |
108 assertEquals("version", WebappDataStorage.KEY_VERSION); | 110 assertEquals("version", WebappDataStorage.KEY_VERSION); |
109 } | 111 } |
110 | 112 |
111 @Test | 113 @Test |
112 @Feature({"Webapp"}) | 114 @Feature({"Webapp"}) |
113 public void testLastUsedRetrieval() throws Exception { | 115 public void testLastUsedRetrieval() throws Exception { |
114 mSharedPreferences.edit().putLong(WebappDataStorage.KEY_LAST_USED, 100L)
.apply(); | 116 long lastUsed = 100; |
115 | 117 mSharedPreferences.edit().putLong(WebappDataStorage.KEY_LAST_USED, lastU
sed).apply(); |
116 WebappDataStorage.getLastUsedTime("test", new FetchCallback<Long>(new Lo
ng(100L))); | 118 assertEquals(lastUsed, new WebappDataStorage("test").getLastUsedTime()); |
117 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
118 ShadowLooper.runUiThreadTasks(); | |
119 | |
120 assertTrue(mCallbackCalled); | |
121 } | 119 } |
122 | 120 |
123 @Test | 121 @Test |
124 @Feature({"Webapp"}) | 122 @Feature({"Webapp"}) |
125 public void testSplashImageRetrieval() throws Exception { | 123 public void testSplashImageRetrieval() throws Exception { |
126 final Bitmap expected = createBitmap(); | 124 final Bitmap expected = createBitmap(); |
127 mSharedPreferences.edit() | 125 mSharedPreferences.edit() |
128 .putString(WebappDataStorage.KEY_SPLASH_ICON, | 126 .putString(WebappDataStorage.KEY_SPLASH_ICON, |
129 ShortcutHelper.encodeBitmapAsString(expected)) | 127 ShortcutHelper.encodeBitmapAsString(expected)) |
130 .commit(); | 128 .apply(); |
131 WebappDataStorage.open("test") | 129 WebappDataStorage.open("test").getSplashScreenImage( |
132 .getSplashScreenImage(new WebappDataStorage.FetchCallback<Bitmap
>() { | 130 new WebappDataStorage.FetchCallback<Bitmap>() { |
133 @Override | 131 @Override |
134 public void onDataRetrieved(Bitmap actual) { | 132 public void onDataRetrieved(Bitmap actual) { |
135 mCallbackCalled = true; | 133 mCallbackCalled = true; |
136 | 134 |
137 // TODO(lalitm) - once the Robolectric bug is fixed chan
ge to | 135 // TODO(lalitm) - once the Robolectric bug is fixed chan
ge to |
138 // assertTrue(expected.sameAs(actual)). | 136 // assertTrue(expected.sameAs(actual)). |
139 // See bitmapEquals(Bitmap, Bitmap) for more information
. | 137 // See bitmapEquals(Bitmap, Bitmap) for more information
. |
140 assertTrue(bitmapEquals(expected, actual)); | 138 assertTrue(bitmapEquals(expected, actual)); |
141 } | 139 } |
142 }); | 140 }); |
143 BackgroundShadowAsyncTask.runBackgroundTasks(); | 141 BackgroundShadowAsyncTask.runBackgroundTasks(); |
144 ShadowLooper.runUiThreadTasks(); | 142 ShadowLooper.runUiThreadTasks(); |
145 | 143 |
146 assertTrue(mCallbackCalled); | 144 assertTrue(mCallbackCalled); |
147 } | 145 } |
148 | 146 |
149 @Test | 147 @Test |
150 @Feature({"Webapp"}) | 148 @Feature({"Webapp"}) |
151 public void testSplashImageUpdate() throws Exception { | 149 public void testSplashImageUpdate() throws Exception { |
152 final Bitmap expectedImage = createBitmap(); | 150 final Bitmap expectedImage = createBitmap(); |
153 WebappDataStorage.open("test").updateSplashScreenImage(expectedImage); | 151 WebappDataStorage.open("test").updateSplashScreenImage(expectedImage); |
154 BackgroundShadowAsyncTask.runBackgroundTasks(); | 152 BackgroundShadowAsyncTask.runBackgroundTasks(); |
| 153 ShadowLooper.runUiThreadTasks(); |
155 | 154 |
156 assertEquals(ShortcutHelper.encodeBitmapAsString(expectedImage), | 155 assertEquals(ShortcutHelper.encodeBitmapAsString(expectedImage), |
157 mSharedPreferences.getString(WebappDataStorage.KEY_SPLASH_ICON,
null)); | 156 mSharedPreferences.getString(WebappDataStorage.KEY_SPLASH_ICON,
null)); |
158 } | 157 } |
159 | 158 |
160 @Test | 159 @Test |
161 @Feature({"Webapp"}) | 160 @Feature({"Webapp"}) |
162 public void testScopeRetrieval() throws Exception { | 161 public void testScopeRetrieval() throws Exception { |
163 final String scope = "http://drive.google.com"; | 162 String scope = "http://drive.google.com"; |
164 mSharedPreferences.edit().putString(WebappDataStorage.KEY_SCOPE, scope).
apply(); | 163 mSharedPreferences.edit().putString(WebappDataStorage.KEY_SCOPE, scope).
apply(); |
165 | 164 assertEquals(scope, new WebappDataStorage("test").getScope()); |
166 WebappDataStorage.getScope("test", new FetchCallback<String>(scope)); | |
167 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
168 ShadowLooper.runUiThreadTasks(); | |
169 | |
170 assertTrue(mCallbackCalled); | |
171 } | 165 } |
172 | 166 |
173 @Test | 167 @Test |
174 @Feature({"Webapp"}) | 168 @Feature({"Webapp"}) |
175 public void testUrlRetrieval() throws Exception { | 169 public void testUrlRetrieval() throws Exception { |
176 final String url = "https://www.google.com"; | 170 String url = "https://www.google.com"; |
177 mSharedPreferences.edit().putString(WebappDataStorage.KEY_URL, url).appl
y(); | 171 mSharedPreferences.edit().putString(WebappDataStorage.KEY_URL, url).appl
y(); |
178 | 172 assertEquals(url, new WebappDataStorage("test").getUrl()); |
179 WebappDataStorage.getUrl("test", new FetchCallback<String>(url)); | |
180 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
181 ShadowLooper.runUiThreadTasks(); | |
182 | |
183 assertTrue(mCallbackCalled); | |
184 } | 173 } |
185 | 174 |
186 @Test | 175 @Test |
187 @Feature({"Webapp"}) | 176 @Feature({"Webapp"}) |
188 public void testWasLaunchedRecently() throws Exception { | 177 public void testWasLaunchedRecently() throws Exception { |
189 final TestClock clock = new TestClock(System.currentTimeMillis()); | 178 final TestClock clock = new TestClock(System.currentTimeMillis()); |
190 WebappDataStorage.setClockForTests(clock); | 179 WebappDataStorage.setClockForTests(clock); |
191 | 180 |
192 // Opening a data storage doesn't count as a launch. | 181 // Opening a data storage doesn't count as a launch. |
193 WebappDataStorage storage = WebappDataStorage.open("test"); | 182 WebappDataStorage storage = WebappDataStorage.open("test"); |
194 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
195 ShadowLooper.runUiThreadTasks(); | |
196 assertTrue(!storage.wasLaunchedRecently()); | 183 assertTrue(!storage.wasLaunchedRecently()); |
197 | 184 |
198 // When the last used time is updated, then it is a launch. | 185 // When the last used time is updated, then it is a launch. |
199 storage.updateLastUsedTime(); | 186 storage.updateLastUsedTime(); |
200 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
201 ShadowLooper.runUiThreadTasks(); | |
202 assertTrue(storage.wasLaunchedRecently()); | 187 assertTrue(storage.wasLaunchedRecently()); |
203 | 188 |
204 long lastUsedTime = mSharedPreferences.getLong(WebappDataStorage.KEY_LAS
T_USED, | 189 long lastUsedTime = mSharedPreferences.getLong(WebappDataStorage.KEY_LAS
T_USED, |
205 WebappDataStorage.LAST_USED_INVALID); | 190 WebappDataStorage.LAST_USED_INVALID); |
206 | 191 |
207 assertTrue(lastUsedTime != WebappDataStorage.LAST_USED_UNSET); | 192 assertTrue(lastUsedTime != WebappDataStorage.LAST_USED_UNSET); |
208 assertTrue(lastUsedTime != WebappDataStorage.LAST_USED_INVALID); | 193 assertTrue(lastUsedTime != WebappDataStorage.LAST_USED_INVALID); |
209 | 194 |
210 // Move the last used time one day in the past. | 195 // Move the last used time one day in the past. |
211 mSharedPreferences.edit() | 196 mSharedPreferences.edit() |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 protected Intent doInBackground(Void... nothing) { | 241 protected Intent doInBackground(Void... nothing) { |
257 return ShortcutHelper.createWebappShortcutIntent(id, action, url
, scope, name, | 242 return ShortcutHelper.createWebappShortcutIntent(id, action, url
, scope, name, |
258 shortName, icon, ShortcutHelper.WEBAPP_SHORTCUT_VERSION,
displayMode, | 243 shortName, icon, ShortcutHelper.WEBAPP_SHORTCUT_VERSION,
displayMode, |
259 orientation, themeColor, backgroundColor, isIconGenerate
d); | 244 orientation, themeColor, backgroundColor, isIconGenerate
d); |
260 } | 245 } |
261 }; | 246 }; |
262 Intent shortcutIntent = shortcutIntentTask.execute().get(); | 247 Intent shortcutIntent = shortcutIntentTask.execute().get(); |
263 | 248 |
264 WebappDataStorage storage = WebappDataStorage.open("test"); | 249 WebappDataStorage storage = WebappDataStorage.open("test"); |
265 storage.updateFromShortcutIntent(shortcutIntent); | 250 storage.updateFromShortcutIntent(shortcutIntent); |
266 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
267 ShadowLooper.runUiThreadTasks(); | |
268 | 251 |
269 assertEquals(action, mSharedPreferences.getString(WebappDataStorage.KEY_
ACTION, null)); | 252 assertEquals(action, mSharedPreferences.getString(WebappDataStorage.KEY_
ACTION, null)); |
270 assertEquals(url, mSharedPreferences.getString(WebappDataStorage.KEY_URL
, null)); | 253 assertEquals(url, mSharedPreferences.getString(WebappDataStorage.KEY_URL
, null)); |
271 assertEquals(scope, mSharedPreferences.getString(WebappDataStorage.KEY_S
COPE, null)); | 254 assertEquals(scope, mSharedPreferences.getString(WebappDataStorage.KEY_S
COPE, null)); |
272 assertEquals(name, mSharedPreferences.getString(WebappDataStorage.KEY_NA
ME, null)); | 255 assertEquals(name, mSharedPreferences.getString(WebappDataStorage.KEY_NA
ME, null)); |
273 assertEquals(shortName, | 256 assertEquals(shortName, |
274 mSharedPreferences.getString(WebappDataStorage.KEY_SHORT_NAME, n
ull)); | 257 mSharedPreferences.getString(WebappDataStorage.KEY_SHORT_NAME, n
ull)); |
275 assertEquals(ShortcutHelper.encodeBitmapAsString(icon), | 258 assertEquals(ShortcutHelper.encodeBitmapAsString(icon), |
276 mSharedPreferences.getString(WebappDataStorage.KEY_ICON, null)); | 259 mSharedPreferences.getString(WebappDataStorage.KEY_ICON, null)); |
277 assertEquals(ShortcutHelper.WEBAPP_SHORTCUT_VERSION, | 260 assertEquals(ShortcutHelper.WEBAPP_SHORTCUT_VERSION, |
(...skipping 27 matching lines...) Expand all Loading... |
305 assertEquals(null, mSharedPreferences.getString(WebappDataStorage.KEY_IC
ON, null)); | 288 assertEquals(null, mSharedPreferences.getString(WebappDataStorage.KEY_IC
ON, null)); |
306 assertEquals(0, mSharedPreferences.getInt(WebappDataStorage.KEY_VERSION,
0)); | 289 assertEquals(0, mSharedPreferences.getInt(WebappDataStorage.KEY_VERSION,
0)); |
307 assertEquals(0, mSharedPreferences.getInt(WebappDataStorage.KEY_ORIENTAT
ION, 0)); | 290 assertEquals(0, mSharedPreferences.getInt(WebappDataStorage.KEY_ORIENTAT
ION, 0)); |
308 assertEquals(0, mSharedPreferences.getLong(WebappDataStorage.KEY_THEME_C
OLOR, 0)); | 291 assertEquals(0, mSharedPreferences.getLong(WebappDataStorage.KEY_THEME_C
OLOR, 0)); |
309 assertEquals(0, mSharedPreferences.getLong(WebappDataStorage.KEY_BACKGRO
UND_COLOR, 0)); | 292 assertEquals(0, mSharedPreferences.getLong(WebappDataStorage.KEY_BACKGRO
UND_COLOR, 0)); |
310 assertEquals(true, | 293 assertEquals(true, |
311 mSharedPreferences.getBoolean(WebappDataStorage.KEY_IS_ICON_GENE
RATED, true)); | 294 mSharedPreferences.getBoolean(WebappDataStorage.KEY_IS_ICON_GENE
RATED, true)); |
312 | 295 |
313 // Update again from the intent and ensure that the data is restored. | 296 // Update again from the intent and ensure that the data is restored. |
314 storage.updateFromShortcutIntent(shortcutIntent); | 297 storage.updateFromShortcutIntent(shortcutIntent); |
315 BackgroundShadowAsyncTask.runBackgroundTasks(); | |
316 ShadowLooper.runUiThreadTasks(); | |
317 | 298 |
318 assertEquals(action, mSharedPreferences.getString(WebappDataStorage.KEY_
ACTION, null)); | 299 assertEquals(action, mSharedPreferences.getString(WebappDataStorage.KEY_
ACTION, null)); |
319 assertEquals(url, mSharedPreferences.getString(WebappDataStorage.KEY_URL
, null)); | 300 assertEquals(url, mSharedPreferences.getString(WebappDataStorage.KEY_URL
, null)); |
320 assertEquals(scope, mSharedPreferences.getString(WebappDataStorage.KEY_S
COPE, null)); | 301 assertEquals(scope, mSharedPreferences.getString(WebappDataStorage.KEY_S
COPE, null)); |
321 assertEquals(name, mSharedPreferences.getString(WebappDataStorage.KEY_NA
ME, null)); | 302 assertEquals(name, mSharedPreferences.getString(WebappDataStorage.KEY_NA
ME, null)); |
322 assertEquals(shortName, | 303 assertEquals(shortName, |
323 mSharedPreferences.getString(WebappDataStorage.KEY_SHORT_NAME, n
ull)); | 304 mSharedPreferences.getString(WebappDataStorage.KEY_SHORT_NAME, n
ull)); |
324 assertEquals(ShortcutHelper.encodeBitmapAsString(icon), | 305 assertEquals(ShortcutHelper.encodeBitmapAsString(icon), |
325 mSharedPreferences.getString(WebappDataStorage.KEY_ICON, null)); | 306 mSharedPreferences.getString(WebappDataStorage.KEY_ICON, null)); |
326 assertEquals(ShortcutHelper.WEBAPP_SHORTCUT_VERSION, | 307 assertEquals(ShortcutHelper.WEBAPP_SHORTCUT_VERSION, |
(...skipping 20 matching lines...) Expand all Loading... |
347 if (actual.getPixel(i, j) != 0) return false; | 328 if (actual.getPixel(i, j) != 0) return false; |
348 } | 329 } |
349 } | 330 } |
350 return true; | 331 return true; |
351 } | 332 } |
352 | 333 |
353 private static Bitmap createBitmap() { | 334 private static Bitmap createBitmap() { |
354 return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_4444); | 335 return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_4444); |
355 } | 336 } |
356 } | 337 } |
OLD | NEW |