| Index: components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManagerTest.java
|
| diff --git a/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManagerTest.java b/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManagerTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f354c5f39f1c7df04400d378d2f56d747083a32f
|
| --- /dev/null
|
| +++ b/components/background_task_scheduler/android/junit/src/org/chromium/components/background_task_scheduler/BackgroundTaskSchedulerGcmNetworkManagerTest.java
|
| @@ -0,0 +1,291 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.components.background_task_scheduler;
|
| +
|
| +import static org.junit.Assert.assertEquals;
|
| +import static org.junit.Assert.assertFalse;
|
| +import static org.junit.Assert.assertNotNull;
|
| +import static org.junit.Assert.assertNull;
|
| +import static org.junit.Assert.assertTrue;
|
| +
|
| +import android.os.Bundle;
|
| +
|
| +import com.google.android.gms.common.ConnectionResult;
|
| +import com.google.android.gms.common.GoogleApiAvailability;
|
| +import com.google.android.gms.gcm.GcmNetworkManager;
|
| +import com.google.android.gms.gcm.OneoffTask;
|
| +import com.google.android.gms.gcm.PeriodicTask;
|
| +import com.google.android.gms.gcm.Task;
|
| +import com.google.android.gms.gcm.TaskParams;
|
| +
|
| +import org.junit.Before;
|
| +import org.junit.Test;
|
| +import org.junit.runner.RunWith;
|
| +import org.robolectric.RuntimeEnvironment;
|
| +import org.robolectric.annotation.Config;
|
| +import org.robolectric.internal.ShadowExtractor;
|
| +import org.robolectric.shadows.gms.Shadows;
|
| +import org.robolectric.shadows.gms.common.ShadowGoogleApiAvailability;
|
| +
|
| +import org.chromium.base.ContextUtils;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.testing.local.LocalRobolectricTestRunner;
|
| +
|
| +import java.util.concurrent.TimeUnit;
|
| +
|
| +/** Unit tests for {@link BackgroundTaskSchedulerGcmNetworkManager}. */
|
| +@RunWith(LocalRobolectricTestRunner.class)
|
| +@Config(manifest = Config.NONE,
|
| + shadows = {ShadowGcmNetworkManager.class, ShadowGoogleApiAvailability.class})
|
| +public class BackgroundTaskSchedulerGcmNetworkManagerTest {
|
| + private static class TestBackgroundTaskNoPublicConstructor extends TestBackgroundTask {
|
| + protected TestBackgroundTaskNoPublicConstructor() {}
|
| + }
|
| +
|
| + ShadowGcmNetworkManager mGcmNetworkManager;
|
| +
|
| + @Before
|
| + public void setUp() {
|
| + ContextUtils.initApplicationContextForTests(RuntimeEnvironment.application);
|
| +
|
| + Shadows.shadowOf(GoogleApiAvailability.getInstance())
|
| + .setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS);
|
| + mGcmNetworkManager = (ShadowGcmNetworkManager) ShadowExtractor.extract(
|
| + GcmNetworkManager.getInstance(ContextUtils.getApplicationContext()));
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testOneOffTaskInfoWithDeadlineConversion() {
|
| + TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.MINUTES.toMillis(200))
|
| + .build();
|
| + Task task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(oneOffTask);
|
| + assertTrue(task instanceof OneoffTask);
|
| + assertEquals(Integer.toString(oneOffTask.getTaskId()), task.getTag());
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(oneOffTask.getOneOffInfo().getWindowEndTimeMs()),
|
| + ((OneoffTask) task).getWindowEnd());
|
| + assertEquals(0, ((OneoffTask) task).getWindowStart());
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testOneOffTaskInfoWithWindowConversion() {
|
| + TaskInfo oneOffTask =
|
| + TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.MINUTES.toMillis(100), TimeUnit.MINUTES.toMillis(200))
|
| + .build();
|
| + Task task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(oneOffTask);
|
| + assertTrue(task instanceof OneoffTask);
|
| + assertEquals(Integer.toString(oneOffTask.getTaskId()), task.getTag());
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(oneOffTask.getOneOffInfo().getWindowEndTimeMs()),
|
| + ((OneoffTask) task).getWindowEnd());
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(oneOffTask.getOneOffInfo().getWindowStartTimeMs()),
|
| + ((OneoffTask) task).getWindowStart());
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testPeriodicTaskInfoWithoutFlexConversion() {
|
| + TaskInfo periodicTask = TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.MINUTES.toMillis(200))
|
| + .build();
|
| + Task task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(periodicTask);
|
| + assertEquals(Integer.toString(periodicTask.getTaskId()), task.getTag());
|
| + assertTrue(task instanceof PeriodicTask);
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(periodicTask.getPeriodicInfo().getIntervalMs()),
|
| + ((PeriodicTask) task).getPeriod());
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testPeriodicTaskInfoWithFlexConversion() {
|
| + TaskInfo periodicTask =
|
| + TaskInfo.createPeriodicTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.MINUTES.toMillis(200), TimeUnit.MINUTES.toMillis(50))
|
| + .build();
|
| + Task task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(periodicTask);
|
| + assertEquals(Integer.toString(periodicTask.getTaskId()), task.getTag());
|
| + assertTrue(task instanceof PeriodicTask);
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(periodicTask.getPeriodicInfo().getIntervalMs()),
|
| + ((PeriodicTask) task).getPeriod());
|
| + assertEquals(TimeUnit.MILLISECONDS.toSeconds(periodicTask.getPeriodicInfo().getFlexMs()),
|
| + ((PeriodicTask) task).getFlex());
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testTaskInfoWithExtras() {
|
| + Bundle userExtras = new Bundle();
|
| + userExtras.putString("foo", "bar");
|
| + userExtras.putBoolean("bools", true);
|
| + userExtras.putLong("longs", 1342543L);
|
| + TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.MINUTES.toMillis(200))
|
| + .setExtras(userExtras)
|
| + .build();
|
| + Task task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(oneOffTask);
|
| + assertEquals(Integer.toString(oneOffTask.getTaskId()), task.getTag());
|
| + assertTrue(task instanceof OneoffTask);
|
| +
|
| + Bundle taskExtras = task.getExtras();
|
| + Bundle bundle = taskExtras.getBundle(
|
| + BackgroundTaskSchedulerGcmNetworkManager.BACKGROUND_TASK_EXTRAS_KEY);
|
| + assertEquals(userExtras.keySet().size(), bundle.keySet().size());
|
| + assertEquals(userExtras.getString("foo"), bundle.getString("foo"));
|
| + assertEquals(userExtras.getBoolean("bools"), bundle.getBoolean("bools"));
|
| + assertEquals(userExtras.getLong("longs"), bundle.getLong("longs"));
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testTaskInfoWithManyConstraints() {
|
| + TaskInfo.Builder taskBuilder = TaskInfo.createOneOffTask(
|
| + TaskIds.TEST, TestBackgroundTask.class, TimeUnit.MINUTES.toMillis(200));
|
| +
|
| + Task task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(
|
| + taskBuilder.setIsPersisted(true).build());
|
| + assertTrue(task.isPersisted());
|
| +
|
| + task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(
|
| + taskBuilder.setRequiredNetworkType(TaskInfo.NETWORK_TYPE_UNMETERED).build());
|
| + assertEquals(Task.NETWORK_STATE_UNMETERED, task.getRequiredNetwork());
|
| +
|
| + task = BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(
|
| + taskBuilder.setRequiresCharging(true).build());
|
| + assertTrue(task.getRequiresCharging());
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testGetTaskParametersFromTaskParams() {
|
| + Bundle extras = new Bundle();
|
| + Bundle taskExtras = new Bundle();
|
| + taskExtras.putString("foo", "bar");
|
| + extras.putBundle(
|
| + BackgroundTaskSchedulerGcmNetworkManager.BACKGROUND_TASK_EXTRAS_KEY, taskExtras);
|
| +
|
| + TaskParams params = new TaskParams(Integer.toString(TaskIds.TEST), extras);
|
| +
|
| + TaskParameters parameters =
|
| + BackgroundTaskSchedulerGcmNetworkManager.getTaskParametersFromTaskParams(params);
|
| + assertEquals(parameters.getTaskId(), TaskIds.TEST);
|
| + assertEquals(parameters.getExtras().getString("foo"), "bar");
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testGetBackgroundTaskFromTaskParams() {
|
| + Bundle extras = new Bundle();
|
| + extras.putString(BackgroundTaskSchedulerGcmNetworkManager.BACKGROUND_TASK_CLASS_KEY,
|
| + TestBackgroundTask.class.getName());
|
| +
|
| + TaskParams params = new TaskParams(Integer.toString(TaskIds.TEST), extras);
|
| + BackgroundTask backgroundTask =
|
| + BackgroundTaskSchedulerGcmNetworkManager.getBackgroundTaskFromTaskParams(params);
|
| +
|
| + assertNotNull(backgroundTask);
|
| + assertTrue(backgroundTask instanceof TestBackgroundTask);
|
| + }
|
| +
|
| + @Test
|
| + @Feature({"BackgroundTaskScheduler"})
|
| + public void testSchedule() {
|
| + TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.DAYS.toMillis(1))
|
| + .build();
|
| +
|
| + assertNull(mGcmNetworkManager.getScheduledTask());
|
| +
|
| + BackgroundTaskSchedulerDelegate delegate = new BackgroundTaskSchedulerGcmNetworkManager();
|
| +
|
| + assertTrue(delegate.schedule(ContextUtils.getApplicationContext(), oneOffTask));
|
| +
|
| + // Check that a task was scheduled using GCM Network Manager.
|
| + assertNotNull(mGcmNetworkManager.getScheduledTask());
|
| +
|
| + // Verify details of the scheduled task.
|
| + Task scheduledTask = mGcmNetworkManager.getScheduledTask();
|
| +
|
| + assertEquals(Integer.toString(oneOffTask.getTaskId()), scheduledTask.getTag());
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(oneOffTask.getOneOffInfo().getWindowEndTimeMs()),
|
| + ((OneoffTask) scheduledTask).getWindowEnd());
|
| + assertEquals(
|
| + TimeUnit.MILLISECONDS.toSeconds(oneOffTask.getOneOffInfo().getWindowStartTimeMs()),
|
| + ((OneoffTask) scheduledTask).getWindowStart());
|
| + }
|
| +
|
| + @Test
|
| + @Feature("BackgroundTaskScheduler")
|
| + public void testScheduleNoPublicConstructor() {
|
| + TaskInfo oneOffTask =
|
| + TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTaskNoPublicConstructor.class,
|
| + TimeUnit.DAYS.toMillis(1))
|
| + .build();
|
| +
|
| + assertFalse(new BackgroundTaskSchedulerGcmNetworkManager().schedule(
|
| + ContextUtils.getApplicationContext(), oneOffTask));
|
| + }
|
| +
|
| + @Test
|
| + @Feature("BackgroundTaskScheduler")
|
| + public void testScheduleNoGooglePlayServices() {
|
| + Shadows.shadowOf(GoogleApiAvailability.getInstance())
|
| + .setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_MISSING);
|
| +
|
| + TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.DAYS.toMillis(1))
|
| + .build();
|
| +
|
| + assertFalse(new BackgroundTaskSchedulerGcmNetworkManager().schedule(
|
| + ContextUtils.getApplicationContext(), oneOffTask));
|
| + }
|
| +
|
| + @Test
|
| + @Feature("BackgroundTaskScheduler")
|
| + public void testCancel() {
|
| + TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.DAYS.toMillis(1))
|
| + .build();
|
| +
|
| + BackgroundTaskSchedulerDelegate delegate = new BackgroundTaskSchedulerGcmNetworkManager();
|
| +
|
| + assertTrue(delegate.schedule(ContextUtils.getApplicationContext(), oneOffTask));
|
| + delegate.cancel(ContextUtils.getApplicationContext(), oneOffTask.getTaskId());
|
| +
|
| + Task canceledTask = mGcmNetworkManager.getCanceledTask();
|
| + assertEquals(Integer.toString(oneOffTask.getTaskId()), canceledTask.getTag());
|
| + }
|
| +
|
| + @Test
|
| + @Feature("BackgroundTaskScheduler")
|
| + public void testCancelNoGooglePlayServices() {
|
| + // This simulates situation where Google Play Services is uninstalled.
|
| + Shadows.shadowOf(GoogleApiAvailability.getInstance())
|
| + .setIsGooglePlayServicesAvailable(ConnectionResult.SERVICE_MISSING);
|
| +
|
| + TaskInfo oneOffTask = TaskInfo.createOneOffTask(TaskIds.TEST, TestBackgroundTask.class,
|
| + TimeUnit.DAYS.toMillis(1))
|
| + .build();
|
| +
|
| + // Ensure there was a previously scheduled task.
|
| + mGcmNetworkManager.schedule(
|
| + BackgroundTaskSchedulerGcmNetworkManager.createTaskFromTaskInfo(oneOffTask));
|
| +
|
| + BackgroundTaskSchedulerDelegate delegate = new BackgroundTaskSchedulerGcmNetworkManager();
|
| +
|
| + // This call is expected to have no effect on GCM Network Manager, because Play Services are
|
| + // not available.
|
| + delegate.cancel(ContextUtils.getApplicationContext(), oneOffTask.getTaskId());
|
| + assertNull(mGcmNetworkManager.getCanceledTask());
|
| + assertNotNull(mGcmNetworkManager.getScheduledTask());
|
| + }
|
| +}
|
|
|