DelayedSyncControllerTest.java revision 3551c9c881056c480085172ff9840cab31610854
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5package org.chromium.chrome.browser.sync; 6 7import android.accounts.Account; 8import android.app.Activity; 9import android.content.ContentResolver; 10import android.content.Context; 11import android.content.Intent; 12import android.os.Bundle; 13import android.test.suitebuilder.annotation.SmallTest; 14 15import com.google.common.annotations.VisibleForTesting; 16 17import org.chromium.base.ActivityStatus; 18import org.chromium.base.test.util.Feature; 19import org.chromium.chrome.testshell.ChromiumTestShellTestBase; 20import org.chromium.content.browser.test.util.Criteria; 21import org.chromium.content.browser.test.util.CriteriaHelper; 22import org.chromium.sync.signin.AccountManagerHelper; 23 24public class DelayedSyncControllerTest extends ChromiumTestShellTestBase { 25 private static final Account TEST_ACCOUNT = 26 AccountManagerHelper.createAccountFromName("something@gmail.com"); 27 private static final long WAIT_FOR_LAUNCHER_MS = 10 * 1000; 28 private static final long POLL_INTERVAL_MS = 100; 29 private TestDelayedSyncController mController; 30 31 private static class TestDelayedSyncController extends DelayedSyncController { 32 private boolean mSyncRequested; 33 34 private TestDelayedSyncController() {} 35 36 @Override 37 void requestSyncOnBackgroundThread(Context context, Account account) { 38 mSyncRequested = true; 39 } 40 } 41 42 @Override 43 protected void setUp() throws Exception { 44 super.setUp(); 45 mController = new TestDelayedSyncController(); 46 launchChromiumTestShellWithBlankPage(); 47 } 48 49 @SmallTest 50 @Feature({"Sync"}) 51 public void testManualSyncRequestsShouldAlwaysTriggerSync() throws InterruptedException { 52 // Sync should trigger for manual requests when Chrome is in the foreground. 53 assertTrue(isActivityResumed()); 54 Bundle extras = new Bundle(); 55 extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 56 assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 57 58 // Sync should trigger for manual requests when Chrome is in the background. 59 sendChromeToBackground(getActivity()); 60 extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 61 assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 62 } 63 64 @SmallTest 65 @Feature({"Sync"}) 66 public void testSyncRequestsShouldTriggerSyncWhenChromeIsInForeground() { 67 assertTrue(isActivityResumed()); 68 Bundle extras = new Bundle(); 69 assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 70 } 71 72 @SmallTest 73 @Feature({"Sync"}) 74 public void testSyncRequestsWhenChromeIsInBackgroundShouldBeDelayed() 75 throws InterruptedException { 76 sendChromeToBackground(getActivity()); 77 Bundle extras = new Bundle(); 78 assertFalse(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 79 } 80 81 @SmallTest 82 @Feature({"Sync"}) 83 public void testDelayedSyncRequestsShouldBeTriggeredOnResume() throws InterruptedException { 84 // First make sure there are no delayed syncs. 85 mController.clearDelayedSyncs(getActivity()); 86 assertFalse(mController.resumeDelayedSyncs(getActivity())); 87 assertFalse(mController.mSyncRequested); 88 89 // Trying to perform sync when Chrome is in the background should create a delayed sync. 90 sendChromeToBackground(getActivity()); 91 Bundle extras = new Bundle(); 92 assertFalse(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 93 94 // Make sure the delayed sync can be resumed. 95 assertTrue(mController.resumeDelayedSyncs(getActivity())); 96 assertTrue(mController.mSyncRequested); 97 } 98 99 @VisibleForTesting 100 static void sendChromeToBackground(Activity activity) throws InterruptedException { 101 Intent intent = new Intent(Intent.ACTION_MAIN); 102 intent.addCategory(Intent.CATEGORY_HOME); 103 activity.startActivity(intent); 104 105 assertTrue("Activity should have been resumed", 106 CriteriaHelper.pollForCriteria(new Criteria() { 107 @Override 108 public boolean isSatisfied() { 109 return !isActivityResumed(); 110 } 111 }, WAIT_FOR_LAUNCHER_MS, POLL_INTERVAL_MS)); 112 } 113 114 private static boolean isActivityResumed() { 115 return ActivityStatus.getState() == ActivityStatus.RESUMED; 116 } 117} 118