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.precache; | 5 package org.chromium.chrome.browser.precache; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 import android.content.Intent; | 8 import android.content.Intent; |
9 import android.content.SharedPreferences.Editor; | 9 import android.content.SharedPreferences.Editor; |
| 10 import android.support.test.InstrumentationRegistry; |
| 11 import android.support.test.annotation.UiThreadTest; |
10 import android.support.test.filters.SmallTest; | 12 import android.support.test.filters.SmallTest; |
11 import android.test.InstrumentationTestCase; | 13 import android.support.test.rule.UiThreadTestRule; |
12 | 14 |
13 import com.google.android.gms.gcm.GcmNetworkManager; | 15 import com.google.android.gms.gcm.GcmNetworkManager; |
14 import com.google.android.gms.gcm.Task; | 16 import com.google.android.gms.gcm.Task; |
15 | 17 |
| 18 import org.junit.After; |
| 19 import org.junit.Assert; |
| 20 import org.junit.Before; |
| 21 import org.junit.Rule; |
| 22 import org.junit.Test; |
| 23 import org.junit.runner.RunWith; |
| 24 |
16 import org.chromium.base.ContextUtils; | 25 import org.chromium.base.ContextUtils; |
17 import org.chromium.base.metrics.RecordHistogram; | 26 import org.chromium.base.metrics.RecordHistogram; |
18 import org.chromium.base.test.util.AdvancedMockContext; | 27 import org.chromium.base.test.util.AdvancedMockContext; |
19 import org.chromium.base.test.util.Feature; | 28 import org.chromium.base.test.util.Feature; |
20 import org.chromium.base.test.util.RetryOnFailure; | 29 import org.chromium.base.test.util.RetryOnFailure; |
| 30 import org.chromium.chrome.test.ChromeJUnit4ClassRunner; |
21 import org.chromium.components.precache.MockDeviceState; | 31 import org.chromium.components.precache.MockDeviceState; |
22 | 32 |
23 /** | 33 /** |
24 * Tests of {@link PrecacheController}. | 34 * Tests of {@link PrecacheController}. |
25 */ | 35 */ |
26 public class PrecacheControllerTest extends InstrumentationTestCase { | 36 @RunWith(ChromeJUnit4ClassRunner.class) |
| 37 public class PrecacheControllerTest { |
27 private Context mContext; | 38 private Context mContext; |
28 private MockPrecacheLauncher mPrecacheLauncher; | 39 private MockPrecacheLauncher mPrecacheLauncher; |
29 private MockPrecacheController mPrecacheController; | 40 private MockPrecacheController mPrecacheController; |
30 private MockPrecacheTaskScheduler mPrecacheTaskScheduler; | 41 private MockPrecacheTaskScheduler mPrecacheTaskScheduler; |
31 | 42 |
| 43 @Rule |
| 44 public UiThreadTestRule mRule = new UiThreadTestRule(); |
| 45 |
32 /** | 46 /** |
33 * Mock of the {@link PrecacheLauncher}. | 47 * Mock of the {@link PrecacheLauncher}. |
34 */ | 48 */ |
35 static class MockPrecacheLauncher extends PrecacheLauncher { | 49 static class MockPrecacheLauncher extends PrecacheLauncher { |
36 | 50 |
37 private MockPrecacheController mController; | 51 private MockPrecacheController mController; |
38 | 52 |
39 public int destroyCnt = 0; | 53 public int destroyCnt = 0; |
40 public int startCnt = 0; | 54 public int startCnt = 0; |
41 public int cancelCnt = 0; | 55 public int cancelCnt = 0; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 boolean cancelTask(Context context, String tag) { | 105 boolean cancelTask(Context context, String tag) { |
92 if (PrecacheController.PERIODIC_TASK_TAG.equals(tag)) { | 106 if (PrecacheController.PERIODIC_TASK_TAG.equals(tag)) { |
93 cancelPeriodicCnt++; | 107 cancelPeriodicCnt++; |
94 } else if (PrecacheController.CONTINUATION_TASK_TAG.equals(tag)) { | 108 } else if (PrecacheController.CONTINUATION_TASK_TAG.equals(tag)) { |
95 cancelContinuationCnt++; | 109 cancelContinuationCnt++; |
96 } | 110 } |
97 return true; | 111 return true; |
98 } | 112 } |
99 } | 113 } |
100 | 114 |
101 @Override | 115 @Before |
102 protected void setUp() throws Exception { | 116 public void setUp() throws Exception { |
103 super.setUp(); | 117 mContext = new AdvancedMockContext( |
104 mContext = new AdvancedMockContext(getInstrumentation().getTargetContext
()); | 118 InstrumentationRegistry.getInstrumentation().getTargetContext())
; |
105 mPrecacheLauncher = new MockPrecacheLauncher(); | 119 mPrecacheLauncher = new MockPrecacheLauncher(); |
106 mPrecacheController = new MockPrecacheController(mContext); | 120 mPrecacheController = new MockPrecacheController(mContext); |
107 mPrecacheTaskScheduler = new MockPrecacheTaskScheduler(); | 121 mPrecacheTaskScheduler = new MockPrecacheTaskScheduler(); |
108 mPrecacheLauncher.setController(mPrecacheController); | 122 mPrecacheLauncher.setController(mPrecacheController); |
109 mPrecacheController.setPrecacheLauncher(mPrecacheLauncher); | 123 mPrecacheController.setPrecacheLauncher(mPrecacheLauncher); |
110 PrecacheController.setTaskScheduler(mPrecacheTaskScheduler); | 124 PrecacheController.setTaskScheduler(mPrecacheTaskScheduler); |
111 RecordHistogram.setDisabledForTests(true); | 125 RecordHistogram.setDisabledForTests(true); |
112 Editor editor = ContextUtils.getAppSharedPreferences().edit(); | 126 Editor editor = ContextUtils.getAppSharedPreferences().edit(); |
113 editor.putBoolean(PrecacheController.PREF_IS_PRECACHING_ENABLED, false); | 127 editor.putBoolean(PrecacheController.PREF_IS_PRECACHING_ENABLED, false); |
114 editor.apply(); | 128 editor.apply(); |
115 } | 129 } |
116 | 130 |
117 @Override | 131 @After |
118 public void tearDown() throws Exception { | 132 public void tearDown() throws Exception { |
119 super.tearDown(); | |
120 RecordHistogram.setDisabledForTests(false); | 133 RecordHistogram.setDisabledForTests(false); |
121 } | 134 } |
122 | 135 |
123 protected void verifyScheduledAndCanceledCounts( | 136 protected void verifyScheduledAndCanceledCounts( |
124 int expectedPeriodicScheduled, int expectedContinuationScheduled, | 137 int expectedPeriodicScheduled, int expectedContinuationScheduled, |
125 int expectedPeriodicCanceled, int expectedContinuationCanceled) { | 138 int expectedPeriodicCanceled, int expectedContinuationCanceled) { |
126 if (!mPrecacheTaskScheduler.canScheduleTasks(mContext)) { | 139 if (!mPrecacheTaskScheduler.canScheduleTasks(mContext)) { |
127 expectedPeriodicScheduled = 0; | 140 expectedPeriodicScheduled = 0; |
128 expectedContinuationScheduled = 0; | 141 expectedContinuationScheduled = 0; |
129 } | 142 } |
130 assertEquals(expectedPeriodicScheduled, mPrecacheTaskScheduler.scheduleP
eriodicCnt); | 143 Assert.assertEquals(expectedPeriodicScheduled, mPrecacheTaskScheduler.sc
hedulePeriodicCnt); |
131 assertEquals(expectedContinuationScheduled, mPrecacheTaskScheduler.sched
uleContinuationCnt); | 144 Assert.assertEquals( |
132 assertEquals(expectedPeriodicCanceled, mPrecacheTaskScheduler.cancelPeri
odicCnt); | 145 expectedContinuationScheduled, mPrecacheTaskScheduler.scheduleCo
ntinuationCnt); |
133 assertEquals(expectedContinuationCanceled, mPrecacheTaskScheduler.cancel
ContinuationCnt); | 146 Assert.assertEquals(expectedPeriodicCanceled, mPrecacheTaskScheduler.can
celPeriodicCnt); |
| 147 Assert.assertEquals( |
| 148 expectedContinuationCanceled, mPrecacheTaskScheduler.cancelConti
nuationCnt); |
134 } | 149 } |
135 | 150 |
136 protected void verifyLockCounts(int expectedAcquired, int expectedReleased)
{ | 151 protected void verifyLockCounts(int expectedAcquired, int expectedReleased)
{ |
137 assertEquals(expectedAcquired, mPrecacheController.acquiredLockCnt); | 152 Assert.assertEquals(expectedAcquired, mPrecacheController.acquiredLockCn
t); |
138 assertEquals(expectedReleased, mPrecacheController.releasedLockCnt); | 153 Assert.assertEquals(expectedReleased, mPrecacheController.releasedLockCn
t); |
139 } | 154 } |
140 | 155 |
141 protected void verifyBeginPrecaching() { | 156 protected void verifyBeginPrecaching() { |
142 PrecacheController.setIsPrecachingEnabled(mContext, true); | 157 PrecacheController.setIsPrecachingEnabled(mContext, true); |
143 assertEquals(GcmNetworkManager.RESULT_SUCCESS, | 158 Assert.assertEquals(GcmNetworkManager.RESULT_SUCCESS, |
144 mPrecacheController.precache(PrecacheController.PERIODIC_TASK_TA
G)); | 159 mPrecacheController.precache(PrecacheController.PERIODIC_TASK_TA
G)); |
145 assertTrue(mPrecacheController.isPrecaching()); | 160 Assert.assertTrue(mPrecacheController.isPrecaching()); |
146 verifyLockCounts(1, 0); | 161 verifyLockCounts(1, 0); |
147 // Any existing completion tasks are canceled. | 162 // Any existing completion tasks are canceled. |
148 verifyScheduledAndCanceledCounts(1, 0, 0, 1); | 163 verifyScheduledAndCanceledCounts(1, 0, 0, 1); |
149 assertEquals(1, mPrecacheLauncher.startCnt); | 164 Assert.assertEquals(1, mPrecacheLauncher.startCnt); |
150 } | 165 } |
151 | 166 |
152 protected void verifyContinuationGetsPreemptedByPeriodicTask() { | 167 protected void verifyContinuationGetsPreemptedByPeriodicTask() { |
153 PrecacheController.setIsPrecachingEnabled(mContext, true); | 168 PrecacheController.setIsPrecachingEnabled(mContext, true); |
154 assertEquals(GcmNetworkManager.RESULT_SUCCESS, | 169 Assert.assertEquals(GcmNetworkManager.RESULT_SUCCESS, |
155 mPrecacheController.precache(PrecacheController.CONTINUATION_TAS
K_TAG)); | 170 mPrecacheController.precache(PrecacheController.CONTINUATION_TAS
K_TAG)); |
156 assertTrue(mPrecacheController.isPrecaching()); | 171 Assert.assertTrue(mPrecacheController.isPrecaching()); |
157 verifyLockCounts(1, 0); | 172 verifyLockCounts(1, 0); |
158 // Any existing completion tasks are canceled. | 173 // Any existing completion tasks are canceled. |
159 verifyScheduledAndCanceledCounts(1, 0, 0, 1); | 174 verifyScheduledAndCanceledCounts(1, 0, 0, 1); |
160 assertEquals(1, mPrecacheLauncher.startCnt); | 175 Assert.assertEquals(1, mPrecacheLauncher.startCnt); |
161 } | 176 } |
162 | 177 |
| 178 @Test |
163 @SmallTest | 179 @SmallTest |
164 @Feature({"Precache"}) | 180 @Feature({"Precache"}) |
| 181 @UiThreadTest |
165 public void testStartPrecachingNotEnabled() { | 182 public void testStartPrecachingNotEnabled() { |
166 PrecacheController.setIsPrecachingEnabled(mContext, false); | 183 PrecacheController.setIsPrecachingEnabled(mContext, false); |
167 verifyScheduledAndCanceledCounts(0, 0, 0, 0); | 184 verifyScheduledAndCanceledCounts(0, 0, 0, 0); |
168 assertEquals(0, mPrecacheLauncher.startCnt); | 185 Assert.assertEquals(0, mPrecacheLauncher.startCnt); |
169 assertTrue(mPrecacheController.precache(PrecacheController.PERIODIC_TASK
_TAG) | 186 Assert.assertTrue(mPrecacheController.precache(PrecacheController.PERIOD
IC_TASK_TAG) |
170 == GcmNetworkManager.RESULT_SUCCESS); | 187 == GcmNetworkManager.RESULT_SUCCESS); |
171 assertFalse(mPrecacheController.isPrecaching()); | 188 Assert.assertFalse(mPrecacheController.isPrecaching()); |
172 verifyLockCounts(0, 0); | 189 verifyLockCounts(0, 0); |
173 // All tasks are canceled. | 190 // All tasks are canceled. |
174 verifyScheduledAndCanceledCounts(0, 0, 1, 1); | 191 verifyScheduledAndCanceledCounts(0, 0, 1, 1); |
175 assertEquals(0, mPrecacheLauncher.startCnt); | 192 Assert.assertEquals(0, mPrecacheLauncher.startCnt); |
176 } | 193 } |
177 | 194 |
| 195 @Test |
178 @SmallTest | 196 @SmallTest |
179 @Feature({"Precache"}) | 197 @Feature({"Precache"}) |
| 198 @UiThreadTest |
180 public void testStartPrecachingEnabled() { | 199 public void testStartPrecachingEnabled() { |
181 verifyBeginPrecaching(); | 200 verifyBeginPrecaching(); |
182 | 201 |
183 mPrecacheLauncher.onPrecacheCompleted(true); | 202 mPrecacheLauncher.onPrecacheCompleted(true); |
184 assertFalse(mPrecacheController.isPrecaching()); | 203 Assert.assertFalse(mPrecacheController.isPrecaching()); |
185 // A continuation task is scheduled. | 204 // A continuation task is scheduled. |
186 verifyScheduledAndCanceledCounts(1, 1, 0, 1); | 205 verifyScheduledAndCanceledCounts(1, 1, 0, 1); |
187 verifyLockCounts(1, 1); | 206 verifyLockCounts(1, 1); |
188 } | 207 } |
189 | 208 |
| 209 @Test |
190 @SmallTest | 210 @SmallTest |
191 @Feature({"Precache"}) | 211 @Feature({"Precache"}) |
| 212 @UiThreadTest |
192 @RetryOnFailure | 213 @RetryOnFailure |
193 public void testStartWhenAlreadyStarted() { | 214 public void testStartWhenAlreadyStarted() { |
194 verifyBeginPrecaching(); | 215 verifyBeginPrecaching(); |
195 | 216 |
196 assertEquals(GcmNetworkManager.RESULT_FAILURE, | 217 Assert.assertEquals(GcmNetworkManager.RESULT_FAILURE, |
197 mPrecacheController.precache(PrecacheController.PERIODIC_TASK_TA
G)); | 218 mPrecacheController.precache(PrecacheController.PERIODIC_TASK_TA
G)); |
198 assertTrue(mPrecacheController.isPrecaching()); | 219 Assert.assertTrue(mPrecacheController.isPrecaching()); |
199 // No additional tasks are scheduled or canceled. | 220 // No additional tasks are scheduled or canceled. |
200 verifyScheduledAndCanceledCounts(1, 0, 0, 1); | 221 verifyScheduledAndCanceledCounts(1, 0, 0, 1); |
201 verifyLockCounts(1, 0); | 222 verifyLockCounts(1, 0); |
202 } | 223 } |
203 | 224 |
| 225 @Test |
204 @SmallTest | 226 @SmallTest |
205 @Feature({"Precache"}) | 227 @Feature({"Precache"}) |
| 228 @UiThreadTest |
206 @RetryOnFailure | 229 @RetryOnFailure |
207 public void testDeviceStateChangeCancels() { | 230 public void testDeviceStateChangeCancels() { |
208 verifyBeginPrecaching(); | 231 verifyBeginPrecaching(); |
209 | 232 |
210 mPrecacheController.setDeviceState(new MockDeviceState(0, true, false)); | 233 mPrecacheController.setDeviceState(new MockDeviceState(0, true, false)); |
211 mPrecacheController.getDeviceStateReceiver().onReceive(mContext, new Int
ent()); | 234 mPrecacheController.getDeviceStateReceiver().onReceive(mContext, new Int
ent()); |
212 assertFalse(mPrecacheController.isPrecaching()); | 235 Assert.assertFalse(mPrecacheController.isPrecaching()); |
213 // A continuation task is scheduled. | 236 // A continuation task is scheduled. |
214 verifyScheduledAndCanceledCounts(1, 1, 0, 1); | 237 verifyScheduledAndCanceledCounts(1, 1, 0, 1); |
215 verifyLockCounts(1, 1); | 238 verifyLockCounts(1, 1); |
216 } | 239 } |
217 | 240 |
| 241 @Test |
218 @SmallTest | 242 @SmallTest |
219 @Feature({"Precache"}) | 243 @Feature({"Precache"}) |
| 244 @UiThreadTest |
220 public void testDeviceStateChangeDoesNotCancel() { | 245 public void testDeviceStateChangeDoesNotCancel() { |
221 verifyBeginPrecaching(); | 246 verifyBeginPrecaching(); |
222 | 247 |
223 mPrecacheController.setDeviceState(new MockDeviceState(0, true, true)); | 248 mPrecacheController.setDeviceState(new MockDeviceState(0, true, true)); |
224 mPrecacheController.getDeviceStateReceiver().onReceive(mContext, new Int
ent()); | 249 mPrecacheController.getDeviceStateReceiver().onReceive(mContext, new Int
ent()); |
225 assertTrue(mPrecacheController.isPrecaching()); | 250 Assert.assertTrue(mPrecacheController.isPrecaching()); |
226 // No additional tasks are scheduled or canceled. | 251 // No additional tasks are scheduled or canceled. |
227 verifyScheduledAndCanceledCounts(1, 0, 0, 1); | 252 verifyScheduledAndCanceledCounts(1, 0, 0, 1); |
228 verifyLockCounts(1, 0); | 253 verifyLockCounts(1, 0); |
229 } | 254 } |
230 | 255 |
| 256 @Test |
231 @SmallTest | 257 @SmallTest |
232 @Feature({"Precache"}) | 258 @Feature({"Precache"}) |
| 259 @UiThreadTest |
233 @RetryOnFailure | 260 @RetryOnFailure |
234 public void testDeviceStateChangeWhenNotPrecaching() { | 261 public void testDeviceStateChangeWhenNotPrecaching() { |
235 assertFalse(mPrecacheController.isPrecaching()); | 262 Assert.assertFalse(mPrecacheController.isPrecaching()); |
236 mPrecacheController.setDeviceState(new MockDeviceState(0, false, true)); | 263 mPrecacheController.setDeviceState(new MockDeviceState(0, false, true)); |
237 mPrecacheController.getDeviceStateReceiver().onReceive(mContext, new Int
ent()); | 264 mPrecacheController.getDeviceStateReceiver().onReceive(mContext, new Int
ent()); |
238 assertFalse(mPrecacheController.isPrecaching()); | 265 Assert.assertFalse(mPrecacheController.isPrecaching()); |
239 // No tasks are scheduled or canceled. | 266 // No tasks are scheduled or canceled. |
240 verifyScheduledAndCanceledCounts(0, 0, 0, 0); | 267 verifyScheduledAndCanceledCounts(0, 0, 0, 0); |
241 verifyLockCounts(0, 0); | 268 verifyLockCounts(0, 0); |
242 // device state change when not running has no effect (maybe unregisters
) | 269 // device state change when not running has no effect (maybe unregisters
) |
243 } | 270 } |
244 | 271 |
| 272 @Test |
245 @SmallTest | 273 @SmallTest |
246 @Feature({"Precache"}) | 274 @Feature({"Precache"}) |
| 275 @UiThreadTest |
247 @RetryOnFailure | 276 @RetryOnFailure |
248 public void testTimeoutCancelsPrecaching() { | 277 public void testTimeoutCancelsPrecaching() { |
249 verifyBeginPrecaching(); | 278 verifyBeginPrecaching(); |
250 | 279 |
251 mPrecacheController.getTimeoutRunnable().run(); | 280 mPrecacheController.getTimeoutRunnable().run(); |
252 assertFalse(mPrecacheController.isPrecaching()); | 281 Assert.assertFalse(mPrecacheController.isPrecaching()); |
253 // A continuation task is scheduled. | 282 // A continuation task is scheduled. |
254 verifyScheduledAndCanceledCounts(1, 1, 0, 1); | 283 verifyScheduledAndCanceledCounts(1, 1, 0, 1); |
255 verifyLockCounts(1, 1); | 284 verifyLockCounts(1, 1); |
256 } | 285 } |
257 | 286 |
| 287 @Test |
258 @SmallTest | 288 @SmallTest |
259 @Feature({"Precache"}) | 289 @Feature({"Precache"}) |
| 290 @UiThreadTest |
260 @RetryOnFailure | 291 @RetryOnFailure |
261 public void testTimeoutDoesNotCancelIfNotPrecaching() { | 292 public void testTimeoutDoesNotCancelIfNotPrecaching() { |
262 assertFalse(mPrecacheController.isPrecaching()); | 293 Assert.assertFalse(mPrecacheController.isPrecaching()); |
263 | 294 |
264 mPrecacheController.getTimeoutRunnable().run(); | 295 mPrecacheController.getTimeoutRunnable().run(); |
265 assertFalse(mPrecacheController.isPrecaching()); | 296 Assert.assertFalse(mPrecacheController.isPrecaching()); |
266 // No tasks are scheduled or canceled. | 297 // No tasks are scheduled or canceled. |
267 verifyScheduledAndCanceledCounts(0, 0, 0, 0); | 298 verifyScheduledAndCanceledCounts(0, 0, 0, 0); |
268 verifyLockCounts(0, 0); | 299 verifyLockCounts(0, 0); |
269 } | 300 } |
270 | 301 |
| 302 @Test |
271 @SmallTest | 303 @SmallTest |
272 @Feature({"Precache"}) | 304 @Feature({"Precache"}) |
| 305 @UiThreadTest |
273 @RetryOnFailure | 306 @RetryOnFailure |
274 public void testPrecachingEnabledPreferences() { | 307 public void testPrecachingEnabledPreferences() { |
275 // Initial enable will schedule a periodic task. | 308 // Initial enable will schedule a periodic task. |
276 PrecacheController.setIsPrecachingEnabled(mContext, true); | 309 PrecacheController.setIsPrecachingEnabled(mContext, true); |
277 verifyScheduledAndCanceledCounts(1, 0, 0, 0); | 310 verifyScheduledAndCanceledCounts(1, 0, 0, 0); |
278 // Subsequent enable will not schedule or cancel tasks. | 311 // Subsequent enable will not schedule or cancel tasks. |
279 PrecacheController.setIsPrecachingEnabled(mContext, true); | 312 PrecacheController.setIsPrecachingEnabled(mContext, true); |
280 verifyScheduledAndCanceledCounts(1, 0, 0, 0); | 313 verifyScheduledAndCanceledCounts(1, 0, 0, 0); |
281 | 314 |
282 // Disabling will cancel periodic and one-off tasks. | 315 // Disabling will cancel periodic and one-off tasks. |
283 PrecacheController.setIsPrecachingEnabled(mContext, false); | 316 PrecacheController.setIsPrecachingEnabled(mContext, false); |
284 verifyScheduledAndCanceledCounts(1, 0, 1, 1); | 317 verifyScheduledAndCanceledCounts(1, 0, 1, 1); |
285 // Subsequent disable will not schedule or cancel tasks. | 318 // Subsequent disable will not schedule or cancel tasks. |
286 PrecacheController.setIsPrecachingEnabled(mContext, false); | 319 PrecacheController.setIsPrecachingEnabled(mContext, false); |
287 verifyScheduledAndCanceledCounts(1, 0, 1, 1); | 320 verifyScheduledAndCanceledCounts(1, 0, 1, 1); |
288 } | 321 } |
289 } | 322 } |
OLD | NEW |