Chromium Code Reviews| 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 |