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 // These 2 lines are different. | |
Pete Williamson
2017/05/25 17:30:53
This comment can probably be removed now that a co
fgorski
2017/05/25 21:41:50
Done.
| |
104 assertEquals(TaskInfo.NETWORK_TYPE_ANY, info.getRequiredNetworkType()); | |
105 assertFalse(info.requiresCharging()); | |
106 | |
107 assertTrue(info.shouldUpdateCurrent()); | |
108 assertEquals(BackgroundScheduler.NO_DELAY, info.getOneOffInfo().getWindo wStartTimeMs()); | |
109 | |
110 // And the line below. | |
111 assertEquals( | |
112 mConditions2, TaskExtrasPacker.unpackTriggerConditionsFromBundle (info.getExtras())); | |
113 } | |
114 | |
115 @Test | |
116 @Feature({"OfflinePages"}) | |
117 public void testScheduleBackup() { | |
118 BackgroundScheduler.getInstance().scheduleBackup( | |
119 mConditions1, BackgroundScheduler.FIVE_MINUTES_IN_MILLISECONDS); | |
120 verify(mTaskScheduler, times(1)) | |
121 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa lue())); | |
122 | |
123 TaskInfo info = mTaskInfo.getValue(); | |
124 verifyFixedTaskInfoValues(info); | |
125 | |
126 assertEquals(TaskInfo.NETWORK_TYPE_UNMETERED, info.getRequiredNetworkTyp e()); | |
127 assertTrue(info.requiresCharging()); | |
128 | |
129 // These 2 lines are different. | |
130 assertFalse(info.shouldUpdateCurrent()); | |
131 assertEquals(BackgroundScheduler.FIVE_MINUTES_IN_MILLISECONDS, | |
132 info.getOneOffInfo().getWindowStartTimeMs()); | |
133 | |
134 assertEquals( | |
135 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle (info.getExtras())); | |
72 } | 136 } |
73 | 137 |
74 @Test | 138 @Test |
75 @Feature({"OfflinePages"}) | 139 @Feature({"OfflinePages"}) |
76 public void testCancel() { | 140 public void testCancel() { |
77 assertNull(mGcmNetworkManager.getScheduledTask()); | 141 BackgroundScheduler.getInstance().schedule(mConditions1); |
78 BackgroundScheduler.getInstance(mContext).schedule(mConditions1); | 142 verify(mTaskScheduler, times(1)) |
79 assertNotNull(mGcmNetworkManager.getScheduledTask()); | 143 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa lue())); |
80 | 144 |
81 assertNull(mGcmNetworkManager.getCanceledTask()); | 145 doNothing() |
82 BackgroundScheduler.getInstance(mContext).cancel(); | 146 .when(mTaskScheduler) |
83 assertNotNull(mGcmNetworkManager.getCanceledTask()); | 147 .cancel(eq(RuntimeEnvironment.application), |
84 } | 148 eq(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID)); |
85 | 149 BackgroundScheduler.getInstance().cancel(); |
86 @Test | 150 verify(mTaskScheduler, times(1)) |
87 @Feature({"OfflinePages"}) | 151 .cancel(eq(RuntimeEnvironment.application), |
88 public void testReschedulOnUpgrade() { | 152 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 } | 153 } |
102 } | 154 } |
OLD | NEW |