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