13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)package org.chromium.chrome.browser.sync; 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.accounts.Account; 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.app.Activity; 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.content.ContentResolver; 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.content.Context; 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.content.Intent; 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.os.Bundle; 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.base.ApplicationStatus; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.base.VisibleForTesting; 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.base.test.util.Feature; 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.chrome.shell.ChromeShellTestBase; 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.content.browser.test.util.Criteria; 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper; 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)import org.chromium.sync.signin.AccountManagerHelper; 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class DelayedSyncControllerTest extends ChromeShellTestBase { 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private static final Account TEST_ACCOUNT = 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) AccountManagerHelper.createAccountFromName("something@gmail.com"); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private static final long WAIT_FOR_LAUNCHER_MS = scaleTimeout(10 * 1000); 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private static final long POLL_INTERVAL_MS = 100; 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private TestDelayedSyncController mController; 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private static class TestDelayedSyncController extends DelayedSyncController { 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private boolean mSyncRequested; 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private TestDelayedSyncController() {} 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Override 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void requestSyncOnBackgroundThread(Context context, Account account) { 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mSyncRequested = true; 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Override 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected void setUp() throws Exception { 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) super.setUp(); 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mController = new TestDelayedSyncController(); 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) launchChromeShellWithBlankPage(); 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @SmallTest 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Feature({"Sync"}) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public void testManualSyncRequestsShouldAlwaysTriggerSync() throws InterruptedException { 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Sync should trigger for manual requests when Chrome is in the foreground. 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(isActivityResumed()); 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Bundle extras = new Bundle(); 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Sync should trigger for manual requests when Chrome is in the background. 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sendChromeToBackground(getActivity()); 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @SmallTest 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Feature({"Sync"}) 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public void testSyncRequestsShouldTriggerSyncWhenChromeIsInForeground() { 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(isActivityResumed()); 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Bundle extras = new Bundle(); 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @SmallTest 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Feature({"Sync"}) 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public void testSyncRequestsWhenChromeIsInBackgroundShouldBeDelayed() 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) throws InterruptedException { 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sendChromeToBackground(getActivity()); 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Bundle extras = new Bundle(); 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertFalse(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @SmallTest 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Feature({"Sync"}) 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public void testDelayedSyncRequestsShouldBeTriggeredOnResume() throws InterruptedException { 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // First make sure there are no delayed syncs. 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mController.clearDelayedSyncs(getActivity()); 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertFalse(mController.resumeDelayedSyncs(getActivity())); 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertFalse(mController.mSyncRequested); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Trying to perform sync when Chrome is in the background should create a delayed sync. 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) sendChromeToBackground(getActivity()); 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Bundle extras = new Bundle(); 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertFalse(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Make sure the delayed sync can be resumed. 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mController.resumeDelayedSyncs(getActivity())); 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue(mController.mSyncRequested); 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @VisibleForTesting 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static void sendChromeToBackground(Activity activity) throws InterruptedException { 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Intent intent = new Intent(Intent.ACTION_MAIN); 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) intent.addCategory(Intent.CATEGORY_HOME); 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) activity.startActivity(intent); 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) assertTrue("Activity should have been resumed", 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CriteriaHelper.pollForCriteria(new Criteria() { 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) @Override 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public boolean isSatisfied() { 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return !isActivityResumed(); 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }, WAIT_FOR_LAUNCHER_MS, POLL_INTERVAL_MS)); 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private static boolean isActivityResumed() { 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return ApplicationStatus.hasVisibleActivities(); 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 119