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 /* 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 |