Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerTest.java

Issue 2830843002: [Offline pages] Updates to background scheduling to use BTS (Closed)
Patch Set: Move code from BackgroundOfflinerTask to OfflineBackgroundTask Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698