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 /* unmetered */ ); |
Pete Williamson
2017/05/24 21:41:03
Let's clarify this comment - does not require unme
fgorski
2017/05/24 23:10:12
Done.
| |
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); |
50 | 54 BackgroundTaskSchedulerFactory.setSchedulerForTesting(mTaskScheduler); |
51 mContext = RuntimeEnvironment.application; | 55 doReturn(true) |
52 mGcmNetworkManager = (ShadowGcmNetworkManager) ShadowExtractor.extract( | 56 .when(mTaskScheduler) |
53 GcmNetworkManager.getInstance(mContext)); | 57 .schedule(eq(RuntimeEnvironment.application), mTaskInfo.capture( )); |
54 mGcmNetworkManager.clear(); | |
55 } | 58 } |
56 | 59 |
57 @Test | 60 @Test |
58 @Feature({"OfflinePages"}) | 61 @Feature({"OfflinePages"}) |
59 public void testSchedule() { | 62 public void testScheduleUnmetered() { |
60 assertNull(mGcmNetworkManager.getScheduledTask()); | 63 BackgroundScheduler.getInstance().schedule(mConditions1); |
61 BackgroundScheduler.getInstance(mContext).schedule(mConditions1); | 64 verify(mTaskScheduler, times(1)) |
62 // Check with gcmNetworkManagerShadow that schedule got called. | 65 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa lue())); |
63 assertNotNull(mGcmNetworkManager.getScheduledTask()); | |
64 | 66 |
65 // Verify details of the scheduled task. | 67 TaskInfo info = mTaskInfo.getValue(); |
66 Task task = mGcmNetworkManager.getScheduledTask(); | 68 assertEquals(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID, info.getTaskId()); |
67 assertEquals(OfflinePageUtils.TASK_TAG, task.getTag()); | 69 assertEquals(OfflineBackgroundTask.class, info.getBackgroundTaskClass()) ; |
68 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(task.ge tExtras()); | 70 assertTrue(info.isPersisted()); |
71 assertTrue(info.shouldUpdateCurrent()); | |
72 assertEquals(TaskInfo.NETWORK_TYPE_UNMETERED, info.getRequiredNetworkTyp e()); | |
73 assertTrue(info.requiresCharging()); | |
Pete Williamson
2017/05/24 21:41:03
It's a bit unfortunate that we use Charging in som
fgorski
2017/05/24 23:10:12
Good idea. Added a task for that.
| |
74 assertFalse(info.isPeriodic()); | |
75 assertEquals(BackgroundScheduler.NO_DELAY, info.getOneOffInfo().getWindo wStartTimeMs()); | |
76 assertEquals(BackgroundScheduler.ONE_WEEK_IN_MILLISECONDS, | |
77 info.getOneOffInfo().getWindowEndTimeMs()); | |
78 assertTrue(info.getOneOffInfo().hasWindowStartTimeConstraint()); | |
79 | |
80 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(info.ge tExtras()); | |
69 assertTrue(scheduledTimeMillis > 0L); | 81 assertTrue(scheduledTimeMillis > 0L); |
70 assertEquals( | 82 assertEquals( |
71 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle (task.getExtras())); | 83 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle (info.getExtras())); |
84 } | |
85 | |
86 @Test | |
87 @Feature({"OfflinePages"}) | |
88 public void testScheduleMetered() { | |
Pete Williamson
2017/05/24 21:41:03
You're really testing metered and power here, not
fgorski
2017/05/24 23:10:13
Done.
| |
89 BackgroundScheduler.getInstance().schedule(mConditions2); | |
90 verify(mTaskScheduler, times(1)) | |
91 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa lue())); | |
92 | |
93 TaskInfo info = mTaskInfo.getValue(); | |
94 assertEquals(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID, info.getTaskId()); | |
95 assertEquals(OfflineBackgroundTask.class, info.getBackgroundTaskClass()) ; | |
96 assertTrue(info.isPersisted()); | |
97 assertTrue(info.shouldUpdateCurrent()); | |
98 // These 2 lines are different. | |
99 assertEquals(TaskInfo.NETWORK_TYPE_ANY, info.getRequiredNetworkType()); | |
100 assertFalse(info.requiresCharging()); | |
101 assertFalse(info.isPeriodic()); | |
102 assertEquals(BackgroundScheduler.NO_DELAY, info.getOneOffInfo().getWindo wStartTimeMs()); | |
103 assertEquals(BackgroundScheduler.ONE_WEEK_IN_MILLISECONDS, | |
104 info.getOneOffInfo().getWindowEndTimeMs()); | |
105 assertTrue(info.getOneOffInfo().hasWindowStartTimeConstraint()); | |
106 | |
107 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(info.ge tExtras()); | |
108 assertTrue(scheduledTimeMillis > 0L); | |
109 // And the line below. | |
110 assertEquals( | |
111 mConditions2, TaskExtrasPacker.unpackTriggerConditionsFromBundle (info.getExtras())); | |
112 } | |
113 | |
114 @Test | |
115 @Feature({"OfflinePages"}) | |
116 public void testScheduleBackup() { | |
Pete Williamson
2017/05/24 21:41:03
There is a lot of duplication in these tests - can
fgorski
2017/05/24 23:10:13
Done.
Pete Williamson
2017/05/25 17:30:53
The refactoring is good, thanks!
If you wanted, y
fgorski
2017/05/25 21:41:50
I thought about it and decided not to, because I p
| |
117 BackgroundScheduler.getInstance().scheduleBackup( | |
118 mConditions1, BackgroundScheduler.FIVE_MINUTES_IN_MILLISECONDS); | |
119 verify(mTaskScheduler, times(1)) | |
120 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa lue())); | |
121 | |
122 TaskInfo info = mTaskInfo.getValue(); | |
123 assertEquals(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID, info.getTaskId()); | |
124 assertEquals(OfflineBackgroundTask.class, info.getBackgroundTaskClass()) ; | |
125 assertTrue(info.isPersisted()); | |
126 // This line is different. | |
127 assertFalse(info.shouldUpdateCurrent()); | |
128 assertEquals(TaskInfo.NETWORK_TYPE_UNMETERED, info.getRequiredNetworkTyp e()); | |
129 assertTrue(info.requiresCharging()); | |
130 assertFalse(info.isPeriodic()); | |
131 assertEquals(BackgroundScheduler.FIVE_MINUTES_IN_MILLISECONDS, | |
132 info.getOneOffInfo().getWindowStartTimeMs()); | |
133 assertEquals(BackgroundScheduler.ONE_WEEK_IN_MILLISECONDS, | |
134 info.getOneOffInfo().getWindowEndTimeMs()); | |
135 assertTrue(info.getOneOffInfo().hasWindowStartTimeConstraint()); | |
136 | |
137 long scheduledTimeMillis = TaskExtrasPacker.unpackTimeFromBundle(info.ge tExtras()); | |
138 assertTrue(scheduledTimeMillis > 0L); | |
139 assertEquals( | |
140 mConditions1, TaskExtrasPacker.unpackTriggerConditionsFromBundle (info.getExtras())); | |
72 } | 141 } |
73 | 142 |
74 @Test | 143 @Test |
75 @Feature({"OfflinePages"}) | 144 @Feature({"OfflinePages"}) |
76 public void testCancel() { | 145 public void testCancel() { |
77 assertNull(mGcmNetworkManager.getScheduledTask()); | 146 BackgroundScheduler.getInstance().schedule(mConditions1); |
78 BackgroundScheduler.getInstance(mContext).schedule(mConditions1); | 147 verify(mTaskScheduler, times(1)) |
79 assertNotNull(mGcmNetworkManager.getScheduledTask()); | 148 .schedule(eq(RuntimeEnvironment.application), eq(mTaskInfo.getVa lue())); |
80 | 149 |
81 assertNull(mGcmNetworkManager.getCanceledTask()); | 150 doNothing() |
82 BackgroundScheduler.getInstance(mContext).cancel(); | 151 .when(mTaskScheduler) |
83 assertNotNull(mGcmNetworkManager.getCanceledTask()); | 152 .cancel(eq(RuntimeEnvironment.application), |
84 } | 153 eq(TaskIds.OFFLINE_PAGES_BACKGROUND_JOB_ID)); |
85 | 154 BackgroundScheduler.getInstance().cancel(); |
86 @Test | 155 verify(mTaskScheduler, times(1)) |
87 @Feature({"OfflinePages"}) | 156 .cancel(eq(RuntimeEnvironment.application), |
88 public void testReschedulOnUpgrade() { | 157 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 } | 158 } |
102 } | 159 } |
OLD | NEW |