Index: chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java |
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a11e437a2310defe91ed1eb01cc5d037641b89f4 |
--- /dev/null |
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PowerBroadcastReceiverTest.java |
@@ -0,0 +1,201 @@ |
+// Copyright 2015 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.chrome.browser; |
+ |
+import android.content.Context; |
+import android.content.Intent; |
+import android.test.suitebuilder.annotation.MediumTest; |
+ |
+import org.chromium.base.test.util.DisabledTest; |
+import org.chromium.base.test.util.Feature; |
+import org.chromium.chrome.browser.preferences.Preferences; |
+import org.chromium.chrome.test.ChromeTabbedActivityTestBase; |
+import org.chromium.content.browser.test.util.Criteria; |
+import org.chromium.content.browser.test.util.CriteriaHelper; |
+import org.chromium.content.browser.test.util.UiUtils; |
+ |
+/** |
+ * Tests for the PowerBroadcastReceiver. |
+ */ |
+public class PowerBroadcastReceiverTest extends ChromeTabbedActivityTestBase { |
+ private static final long MS_INTERVAL = 1000; |
+ private static final long MS_RUNNABLE_DELAY = 2500; |
+ private static final long MS_TIMEOUT = 5000; |
+ |
+ private static final MockPowerManagerHelper sScreenOff = new MockPowerManagerHelper(false); |
+ private static final MockPowerManagerHelper sScreenOn = new MockPowerManagerHelper(true); |
+ |
+ /** Mocks out PowerBroadcastReceiver.ServiceRunnable. */ |
+ private static class MockServiceRunnable extends PowerBroadcastReceiver.ServiceRunnable { |
+ private boolean mRan; |
+ private final long mDelay; |
+ |
+ MockServiceRunnable(long delay) { |
+ mDelay = delay; |
+ } |
+ |
+ @Override |
+ public long delayToRun() { |
+ return mDelay; |
+ } |
+ |
+ @Override |
+ public void run() { |
+ mRan = true; |
+ } |
+ } |
+ |
+ /** Mocks out PowerBroadcastReceiver.PowerManagerHelper. */ |
+ private static class MockPowerManagerHelper extends PowerBroadcastReceiver.PowerManagerHelper { |
+ private final boolean mScreenIsOn; |
+ |
+ public MockPowerManagerHelper(boolean screenIsOn) { |
+ mScreenIsOn = screenIsOn; |
+ } |
+ |
+ @Override |
+ public boolean isScreenOn(Context context) { |
+ return mScreenIsOn; |
+ } |
+ } |
+ |
+ @Override |
+ public void startMainActivity() throws InterruptedException { |
+ startMainActivityFromLauncher(); |
+ } |
+ |
+ private PowerBroadcastReceiver getPowerBroadcastReceiver() { |
+ ChromeMobileApplication app = (ChromeMobileApplication) getActivity().getApplication(); |
+ return app.getPowerBroadcastReceiver(); |
+ } |
+ |
+ /** |
+ * Replaces the ServiceRunnable and PowerManagerHelper used by the PowerBroadcastReceiver |
+ * with mocked versions. |
+ * @return the MockServiceRunnable created by this function. |
+ */ |
+ private MockServiceRunnable setUpMockRunnable() { |
+ MockServiceRunnable runnable = new MockServiceRunnable(MS_RUNNABLE_DELAY); |
+ getPowerBroadcastReceiver().setServiceRunnableForTests(runnable); |
+ return runnable; |
+ } |
+ |
+ /** |
+ * Pauses (and optionally resumes) Main by starting a different Activity. |
+ * @param resumeAfterPause Resume Main after the pause. |
+ */ |
+ private void pauseMain(boolean resumeAfterPause) throws Exception { |
+ // Bring up the Preferences activity to put the Main activity in the background. |
+ UiUtils.settleDownUI(getInstrumentation()); |
+ Preferences prefActivity = startPreferences(null); |
+ assertNotNull("Could not launch preferences activity.", prefActivity); |
+ |
+ if (resumeAfterPause) { |
+ // Finish the Activity to bring Main back. |
+ UiUtils.settleDownUI(getInstrumentation()); |
+ prefActivity.finish(); |
+ } |
+ } |
+ |
+ /** |
+ * Waits to see if the runnable was run. |
+ */ |
+ public boolean runnableRan(final MockServiceRunnable runnable) throws Exception { |
+ return CriteriaHelper.pollForCriteria( |
+ new Criteria() { |
+ @Override |
+ public boolean isSatisfied() { |
+ return runnable.mRan; |
+ } |
+ }, |
+ MS_TIMEOUT, MS_INTERVAL); |
+ } |
+ |
+ /** |
+ * Check if the runnable is posted and run while the screen is on. |
+ */ |
+ /* |
+ @MediumTest |
+ @Feature({"Omaha", "Sync"}) |
+ Bug http://crbug.com/156745 |
+ */ |
+ @DisabledTest |
+ public void testRunnableRunsWithScreenOn() throws Exception { |
+ // Claim the screen is on. |
+ PowerBroadcastReceiver receiver = getPowerBroadcastReceiver(); |
+ receiver.setPowerManagerHelperForTests(sScreenOn); |
+ |
+ // Switch out the PowerBroadcastReceiver's ServiceRunnable. |
+ MockServiceRunnable runnable = setUpMockRunnable(); |
+ |
+ // Pause & resume to post our mocked runnable. |
+ pauseMain(true); |
+ |
+ // Check to see that the runnable gets run. |
+ assertTrue("MockServiceRunnable didn't run after resuming Chrome.", runnableRan(runnable)); |
+ assertFalse("PowerBroadcastReceiver was still registered.", receiver.isRegistered()); |
+ } |
+ |
+ /** |
+ * Check that the runnable gets posted and canceled when Main is sent to the background. |
+ */ |
+ @MediumTest |
+ @Feature({"Omaha", "Sync"}) |
+ public void testRunnableGetsCanceled() throws Exception { |
+ // Claim the screen is on. |
+ PowerBroadcastReceiver receiver = getPowerBroadcastReceiver(); |
+ receiver.setPowerManagerHelperForTests(sScreenOn); |
+ |
+ // Switch out the PowerBroadcastReceiver's Runnable with a MockServiceRunnable. |
+ MockServiceRunnable runnable = setUpMockRunnable(); |
+ |
+ // Pause & resume to post our mocked runnable, then pause immediately after resuming so that |
+ // Main's handler cancels the runnable. |
+ pauseMain(true); |
+ pauseMain(false); |
+ |
+ // Wait enough time for the runnable to run(), if it's still in the handler. |
+ assertFalse("MockServiceRunnable ran after resuming Chrome.", runnableRan(runnable)); |
+ assertFalse("PowerBroadcastReceiver was still registered.", receiver.isRegistered()); |
+ } |
+ |
+ /** |
+ * Check that the runnable gets run only while the screen is on. |
+ */ |
+ /* |
+ @MediumTest |
+ @Feature({"Omaha", "Sync"}) |
+ Bug http://crbug.com/156745 |
+ */ |
+ @DisabledTest |
+ public void testRunnableGetsRunWhenScreenIsOn() throws Exception { |
+ ChromeTabbedActivity main = getActivity(); |
+ PowerBroadcastReceiver receiver = getPowerBroadcastReceiver(); |
+ |
+ // Claim the screen is off. |
+ receiver.setPowerManagerHelperForTests(sScreenOff); |
+ |
+ // Switch out the PowerBroadcastReceiver's Runnable with a MockServiceRunnable. |
+ MockServiceRunnable runnable = setUpMockRunnable(); |
+ |
+ // Pause & resume to post our mocked runnable. |
+ pauseMain(true); |
+ |
+ // Wait enough time for the runnable to run(), if it's still in the handler. |
+ boolean ranWhileScreenOff = runnableRan(runnable); |
+ assertFalse("MockServiceRunnable ran even though screen was off.", ranWhileScreenOff); |
+ assertTrue("PowerBroadcastReceiver was not registered.", receiver.isRegistered()); |
+ |
+ // Pretend to turn the screen on. |
+ receiver.setPowerManagerHelperForTests(sScreenOn); |
+ Intent intent = new Intent(Intent.ACTION_SCREEN_ON); |
+ receiver.onReceive(main, intent); |
+ |
+ // Wait enough time for the runnable to run(), if it's still in the handler. |
+ boolean ranWhileScreenOn = runnableRan(runnable); |
+ assertTrue("MockServiceRunnable didn't run when screen turned on.", ranWhileScreenOn); |
+ assertFalse("PowerBroadcastReceiver wasn't unregistered.", receiver.isRegistered()); |
+ } |
+} |