OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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.offlinepages; | 5 package org.chromium.chrome.browser.offlinepages; |
6 | 6 |
7 import static org.junit.Assert.assertEquals; | 7 import static org.junit.Assert.assertEquals; |
8 import static org.junit.Assert.assertNotNull; | 8 import static org.junit.Assert.assertFalse; |
9 import static org.junit.Assert.assertNull; | |
10 import static org.junit.Assert.assertTrue; | 9 import static org.junit.Assert.assertTrue; |
11 | 10 import static org.mockito.Mockito.doNothing; |
12 import android.content.Context; | 11 import static org.mockito.Mockito.doReturn; |
13 | 12 import static org.mockito.Mockito.eq; |
14 import com.google.android.gms.common.ConnectionResult; | 13 import static org.mockito.Mockito.times; |
15 import com.google.android.gms.common.GoogleApiAvailability; | 14 import static org.mockito.Mockito.verify; |
16 import com.google.android.gms.gcm.GcmNetworkManager; | |
17 import com.google.android.gms.gcm.Task; | |
18 | 15 |
19 import org.junit.Before; | 16 import org.junit.Before; |
20 import org.junit.Test; | 17 import org.junit.Test; |
21 import org.junit.runner.RunWith; | 18 import org.junit.runner.RunWith; |
| 19 import org.mockito.ArgumentCaptor; |
| 20 import org.mockito.Captor; |
| 21 import org.mockito.Mock; |
| 22 import org.mockito.MockitoAnnotations; |
22 import org.robolectric.RuntimeEnvironment; | 23 import org.robolectric.RuntimeEnvironment; |
23 import org.robolectric.annotation.Config; | 24 import org.robolectric.annotation.Config; |
24 import org.robolectric.internal.ShadowExtractor; | |
25 import org.robolectric.shadows.gms.Shadows; | |
26 import org.robolectric.shadows.gms.common.ShadowGoogleApiAvailability; | |
27 | 25 |
28 import org.chromium.base.BaseChromiumApplication; | 26 import org.chromium.base.ContextUtils; |
29 import org.chromium.base.test.util.Feature; | 27 import org.chromium.base.test.util.Feature; |
| 28 import org.chromium.components.background_task_scheduler.BackgroundTaskScheduler
; |
| 29 import org.chromium.components.background_task_scheduler.BackgroundTaskScheduler
Factory; |
| 30 import org.chromium.components.background_task_scheduler.TaskIds; |
| 31 import org.chromium.components.background_task_scheduler.TaskInfo; |
30 import org.chromium.testing.local.LocalRobolectricTestRunner; | 32 import org.chromium.testing.local.LocalRobolectricTestRunner; |
31 | 33 |
32 /** | 34 /** |
33 * Unit tests for BackgroundScheduler. | 35 * Unit tests for BackgroundScheduler. |
34 */ | 36 */ |
35 @RunWith(LocalRobolectricTestRunner.class) | 37 @RunWith(LocalRobolectricTestRunner.class) |
36 @Config(manifest = Config.NONE, application = BaseChromiumApplication.class, sdk
= 21, | 38 @Config(manifest = Config.NONE) |
37 shadows = {ShadowGcmNetworkManager.class, ShadowGoogleApiAvailability.cl
ass}) | |
38 public class BackgroundSchedulerTest { | 39 public class BackgroundSchedulerTest { |
39 private Context mContext; | |
40 private TriggerConditions mConditions1 = new TriggerConditions( | 40 private TriggerConditions mConditions1 = new TriggerConditions( |
41 true /* power */, 10 /* battery percentage */, false /* unmetered */
); | 41 true /* power */, 10 /* battery percentage */, true /* requires unme
tered */); |
42 private TriggerConditions mConditions2 = new TriggerConditions( | 42 private TriggerConditions mConditions2 = new TriggerConditions( |
43 false /* power */, 0 /* battery percentage */, false /* unmetered */
); | 43 false /* power */, 0 /* battery percentage */, false /* does not req
uire unmetered */); |
44 private ShadowGcmNetworkManager mGcmNetworkManager; | 44 |
| 45 @Mock |
| 46 private BackgroundTaskScheduler mTaskScheduler; |
| 47 @Captor |
| 48 ArgumentCaptor<TaskInfo> mTaskInfo; |
45 | 49 |
46 @Before | 50 @Before |
47 public void setUp() throws Exception { | 51 public void setUp() throws Exception { |
48 Shadows.shadowOf(GoogleApiAvailability.getInstance()) | 52 MockitoAnnotations.initMocks(this); |
49 .setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS); | 53 ContextUtils.initApplicationContextForTests(RuntimeEnvironment.applicati
on); |
| 54 BackgroundTaskSchedulerFactory.setSchedulerForTesting(mTaskScheduler); |
| 55 doReturn(true) |
| 56 .when(mTaskScheduler) |
| 57 .schedule(eq(RuntimeEnvironment.application), mTaskInfo.capture(
)); |
| 58 } |
50 | 59 |
51 mContext = RuntimeEnvironment.application; | 60 private void verifyFixedTaskInfoValues(TaskInfo info) { |
52 mGcmNetworkManager = (ShadowGcmNetworkManager) ShadowExtractor.extract( | 61 assertEquals(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID, info.getTaskId()); |
53 GcmNetworkManager.getInstance(mContext)); | 62 assertEquals(OfflineBackgroundTask.class, info.getBackgroundTaskClass())
; |
54 mGcmNetworkManager.clear(); | 63 assertTrue(info.isPersisted()); |
| 64 assertFalse(info.isPeriodic()); |
| 65 assertEquals(BackgroundScheduler.ONE_WEEK_IN_MILLISECONDS, |
| 66 info.getOneOffInfo().getWindowEndTimeMs()); |
| 67 assertTrue(info.getOneOffInfo().hasWindowStartTimeConstraint()); |
| 68 |
| 69 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(info.ge
tExtras()); |
| 70 assertTrue(scheduledTimeMillis > 0L); |
55 } | 71 } |
56 | 72 |
57 @Test | 73 @Test |
58 @Feature({"OfflinePages"}) | 74 @Feature({"OfflinePages"}) |
59 public void testSchedule() { | 75 public void testScheduleUnmeteredAndCharging() { |
60 assertNull(mGcmNetworkManager.getScheduledTask()); | 76 BackgroundScheduler.getInstance().schedule(mConditions1); |
61 BackgroundScheduler.getInstance(mContext).schedule(mConditions1); | 77 verify(mTaskScheduler, times(1)) |
62 // Check with gcmNetworkManagerShadow that schedule got called. | 78 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa
lue())); |
63 assertNotNull(mGcmNetworkManager.getScheduledTask()); | |
64 | 79 |
65 // Verify details of the scheduled task. | 80 TaskInfo info = mTaskInfo.getValue(); |
66 Task task = mGcmNetworkManager.getScheduledTask(); | 81 verifyFixedTaskInfoValues(info); |
67 assertEquals(OfflinePageUtils.TASK_TAG, task.getTag()); | 82 |
68 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(task.ge
tExtras()); | 83 assertEquals(TaskInfo.NETWORK_TYPE_UNMETERED, info.getRequiredNetworkTyp
e()); |
69 assertTrue(scheduledTimeMillis > 0L); | 84 assertTrue(info.requiresCharging()); |
| 85 |
| 86 assertTrue(info.shouldUpdateCurrent()); |
| 87 assertEquals(BackgroundScheduler.NO_DELAY, info.getOneOffInfo().getWindo
wStartTimeMs()); |
| 88 |
70 assertEquals( | 89 assertEquals( |
71 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle
(task.getExtras())); | 90 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle
(info.getExtras())); |
| 91 } |
| 92 |
| 93 @Test |
| 94 @Feature({"OfflinePages"}) |
| 95 public void testScheduleMeteredAndNotCharging() { |
| 96 BackgroundScheduler.getInstance().schedule(mConditions2); |
| 97 verify(mTaskScheduler, times(1)) |
| 98 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa
lue())); |
| 99 |
| 100 TaskInfo info = mTaskInfo.getValue(); |
| 101 verifyFixedTaskInfoValues(info); |
| 102 |
| 103 assertEquals(TaskInfo.NETWORK_TYPE_ANY, info.getRequiredNetworkType()); |
| 104 assertFalse(info.requiresCharging()); |
| 105 |
| 106 assertTrue(info.shouldUpdateCurrent()); |
| 107 assertEquals(BackgroundScheduler.NO_DELAY, info.getOneOffInfo().getWindo
wStartTimeMs()); |
| 108 |
| 109 assertEquals( |
| 110 mConditions2, TaskExtrasPacker.unpackTriggerConditionsFromBundle
(info.getExtras())); |
| 111 } |
| 112 |
| 113 @Test |
| 114 @Feature({"OfflinePages"}) |
| 115 public void testScheduleBackup() { |
| 116 BackgroundScheduler.getInstance().scheduleBackup( |
| 117 mConditions1, BackgroundScheduler.FIVE_MINUTES_IN_MILLISECONDS); |
| 118 verify(mTaskScheduler, times(1)) |
| 119 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa
lue())); |
| 120 |
| 121 TaskInfo info = mTaskInfo.getValue(); |
| 122 verifyFixedTaskInfoValues(info); |
| 123 |
| 124 assertEquals(TaskInfo.NETWORK_TYPE_UNMETERED, info.getRequiredNetworkTyp
e()); |
| 125 assertTrue(info.requiresCharging()); |
| 126 |
| 127 assertFalse(info.shouldUpdateCurrent()); |
| 128 assertEquals(BackgroundScheduler.FIVE_MINUTES_IN_MILLISECONDS, |
| 129 info.getOneOffInfo().getWindowStartTimeMs()); |
| 130 |
| 131 assertEquals( |
| 132 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle
(info.getExtras())); |
72 } | 133 } |
73 | 134 |
74 @Test | 135 @Test |
75 @Feature({"OfflinePages"}) | 136 @Feature({"OfflinePages"}) |
76 public void testCancel() { | 137 public void testCancel() { |
77 assertNull(mGcmNetworkManager.getScheduledTask()); | 138 BackgroundScheduler.getInstance().schedule(mConditions1); |
78 BackgroundScheduler.getInstance(mContext).schedule(mConditions1); | 139 verify(mTaskScheduler, times(1)) |
79 assertNotNull(mGcmNetworkManager.getScheduledTask()); | 140 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa
lue())); |
80 | 141 |
81 assertNull(mGcmNetworkManager.getCanceledTask()); | 142 doNothing() |
82 BackgroundScheduler.getInstance(mContext).cancel(); | 143 .when(mTaskScheduler) |
83 assertNotNull(mGcmNetworkManager.getCanceledTask()); | 144 .cancel(eq(RuntimeEnvironment.application), |
84 } | 145 eq(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID)); |
85 | 146 BackgroundScheduler.getInstance().cancel(); |
86 @Test | 147 verify(mTaskScheduler, times(1)) |
87 @Feature({"OfflinePages"}) | 148 .cancel(eq(RuntimeEnvironment.application), |
88 public void testReschedulOnUpgrade() { | 149 eq(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID)); |
89 assertNull(mGcmNetworkManager.getScheduledTask()); | |
90 BackgroundScheduler.getInstance(mContext).rescheduleOfflinePagesTasksOnU
pgrade(); | |
91 // Check with gcmNetworkManagerShadow that schedule got called. | |
92 assertNotNull(mGcmNetworkManager.getScheduledTask()); | |
93 | |
94 // Verify details of the scheduled task. | |
95 Task task = mGcmNetworkManager.getScheduledTask(); | |
96 assertEquals(OfflinePageUtils.TASK_TAG, task.getTag()); | |
97 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(task.ge
tExtras()); | |
98 assertTrue(scheduledTimeMillis > 0L); | |
99 assertEquals( | |
100 mConditions2, TaskExtrasPacker.unpackTriggerConditionsFromBundle
(task.getExtras())); | |
101 } | 150 } |
102 } | 151 } |
OLD | NEW |