Index: chrome/android/javatests_shell/src/org/chromium/chrome/browser/sync/DelayedSyncControllerTest.java |
diff --git a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/sync/DelayedSyncControllerTest.java b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/sync/DelayedSyncControllerTest.java |
index d08621a29cfb1f41c233fd3b369ae924c17e1ce3..aaa4b13fd8bef296e33b2cbff75fe38ecc8d95e4 100644 |
--- a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/sync/DelayedSyncControllerTest.java |
+++ b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/sync/DelayedSyncControllerTest.java |
@@ -18,32 +18,54 @@ import org.chromium.base.ApplicationStatus; |
import org.chromium.base.VisibleForTesting; |
import org.chromium.base.test.util.Feature; |
import org.chromium.chrome.shell.ChromeShellTestBase; |
+import org.chromium.components.invalidation.PendingInvalidation; |
import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
-import org.chromium.sync.signin.AccountManagerHelper; |
+import java.util.List; |
+ |
+/** |
+ * Tests for DelayedSyncController. |
+ */ |
public class DelayedSyncControllerTest extends ChromeShellTestBase { |
- private static final Account TEST_ACCOUNT = |
- AccountManagerHelper.createAccountFromName("something@gmail.com"); |
+ private static final String TEST_ACCOUNT = "something@gmail.com"; |
private static final long WAIT_FOR_LAUNCHER_MS = scaleTimeout(10 * 1000); |
private static final long POLL_INTERVAL_MS = 100; |
- private TestDelayedSyncController mController; |
- private static class TestDelayedSyncController extends DelayedSyncController { |
- private boolean mSyncRequested; |
+ private static final String OBJECT_ID = "object_id"; |
+ private static final int OBJECT_SRC = 4; |
+ private static final long VERSION = 1L; |
+ private static final String PAYLOAD = "payload"; |
+ |
+ private static final String OBJECT_ID_2 = "object_id_2"; |
+ private static final int OBJECT_SRC_2 = 5; |
+ private static final long VERSION_2 = 2L; |
+ private static final String PAYLOAD_2 = "payload_2"; |
+ |
+ private MockDelayedSyncController mController; |
+ |
+ /** |
+ * Mocks {@link DelayedSyncController} for testing. |
+ * It intercepts access to the Android Sync Adapter. |
+ */ |
+ private static class MockDelayedSyncController extends DelayedSyncController { |
+ private boolean mInvalidated = false; |
+ private List<Bundle> mBundles = null; |
- private TestDelayedSyncController() {} |
+ private MockDelayedSyncController() {} |
@Override |
- void requestSyncOnBackgroundThread(Context context, Account account) { |
- mSyncRequested = true; |
+ void notifyInvalidationsOnBackgroundThread( |
+ Context context, Account account, List<Bundle> bundles) { |
+ mInvalidated = true; |
+ mBundles = bundles; |
} |
} |
@Override |
protected void setUp() throws Exception { |
super.setUp(); |
- mController = new TestDelayedSyncController(); |
+ mController = new MockDelayedSyncController(); |
launchChromeShellWithBlankPage(); |
} |
@@ -54,20 +76,19 @@ public class DelayedSyncControllerTest extends ChromeShellTestBase { |
assertTrue(isActivityResumed()); |
Bundle extras = new Bundle(); |
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); |
- assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); |
+ assertTrue(mController.shouldNotifyInvalidation(extras)); |
// Sync should trigger for manual requests when Chrome is in the background. |
sendChromeToBackground(getActivity()); |
extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); |
- assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); |
+ assertTrue(mController.shouldNotifyInvalidation(extras)); |
} |
@SmallTest |
@Feature({"Sync"}) |
public void testSyncRequestsShouldTriggerSyncWhenChromeIsInForeground() { |
assertTrue(isActivityResumed()); |
- Bundle extras = new Bundle(); |
- assertTrue(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); |
+ assertTrue(mController.shouldNotifyInvalidation(new Bundle())); |
} |
@SmallTest |
@@ -75,26 +96,73 @@ public class DelayedSyncControllerTest extends ChromeShellTestBase { |
public void testSyncRequestsWhenChromeIsInBackgroundShouldBeDelayed() |
throws InterruptedException { |
sendChromeToBackground(getActivity()); |
- Bundle extras = new Bundle(); |
- assertFalse(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); |
+ assertFalse(mController.shouldNotifyInvalidation(new Bundle())); |
} |
@SmallTest |
@Feature({"Sync"}) |
- public void testDelayedSyncRequestsShouldBeTriggeredOnResume() throws InterruptedException { |
- // First make sure there are no delayed syncs. |
- mController.clearDelayedSyncs(getActivity()); |
- assertFalse(mController.resumeDelayedSyncs(getActivity())); |
- assertFalse(mController.mSyncRequested); |
+ public void testOnlySpecificInvalidationsTriggeredOnResume() throws InterruptedException { |
+ // First make sure there are no pending invalidations. |
+ mController.clearPendingInvalidations(getActivity()); |
+ assertFalse(mController.notifyPendingInvalidations(getActivity())); |
+ assertFalse(mController.mInvalidated); |
+ |
+ // Create some invalidations. |
+ PendingInvalidation firstInv = |
+ new PendingInvalidation(OBJECT_ID, OBJECT_SRC, VERSION, PAYLOAD); |
+ PendingInvalidation secondInv = |
+ new PendingInvalidation(OBJECT_ID_2, OBJECT_SRC_2, VERSION_2, PAYLOAD_2); |
+ |
+ // Can't invalidate while Chrome is in the background. |
+ sendChromeToBackground(getActivity()); |
+ assertFalse(mController.shouldNotifyInvalidation(new Bundle())); |
+ |
+ // Add multiple pending invalidations. |
+ mController.addPendingInvalidation(getActivity(), TEST_ACCOUNT, firstInv); |
+ mController.addPendingInvalidation(getActivity(), TEST_ACCOUNT, secondInv); |
- // Trying to perform sync when Chrome is in the background should create a delayed sync. |
+ // Make sure there are pending invalidations. |
+ assertTrue(mController.notifyPendingInvalidations(getActivity())); |
+ assertTrue(mController.mInvalidated); |
+ |
+ // Ensure only specific invalidations are being notified. |
+ assertEquals(2, mController.mBundles.size()); |
+ assertEquals(firstInv, new PendingInvalidation(mController.mBundles.get(0))); |
+ assertEquals(secondInv, new PendingInvalidation(mController.mBundles.get(1))); |
+ } |
+ |
+ @SmallTest |
+ @Feature({"Sync"}) |
+ public void testAllInvalidationsTriggeredOnResume() throws InterruptedException { |
+ // First make sure there are no pending invalidations. |
+ mController.clearPendingInvalidations(getActivity()); |
+ assertFalse(mController.notifyPendingInvalidations(getActivity())); |
+ assertFalse(mController.mInvalidated); |
+ |
+ // Create some invalidations. |
+ PendingInvalidation firstInv = |
+ new PendingInvalidation(OBJECT_ID, OBJECT_SRC, VERSION, PAYLOAD); |
+ PendingInvalidation secondInv = |
+ new PendingInvalidation(OBJECT_ID_2, OBJECT_SRC_2, VERSION_2, PAYLOAD_2); |
+ PendingInvalidation allInvalidations = new PendingInvalidation(new Bundle()); |
+ assertEquals(allInvalidations.mObjectSource, 0); |
+ |
+ // Can't invalidate while Chrome is in the background. |
sendChromeToBackground(getActivity()); |
- Bundle extras = new Bundle(); |
- assertFalse(mController.shouldPerformSync(getActivity(), extras, TEST_ACCOUNT)); |
+ assertFalse(mController.shouldNotifyInvalidation(new Bundle())); |
+ |
+ // Add multiple pending invalidations. |
+ mController.addPendingInvalidation(getActivity(), TEST_ACCOUNT, firstInv); |
+ mController.addPendingInvalidation(getActivity(), TEST_ACCOUNT, allInvalidations); |
+ mController.addPendingInvalidation(getActivity(), TEST_ACCOUNT, secondInv); |
+ |
+ // Make sure there are pending invalidations. |
+ assertTrue(mController.notifyPendingInvalidations(getActivity())); |
+ assertTrue(mController.mInvalidated); |
- // Make sure the delayed sync can be resumed. |
- assertTrue(mController.resumeDelayedSyncs(getActivity())); |
- assertTrue(mController.mSyncRequested); |
+ // As Invalidation for all ids has been received, it will supersede all other invalidations. |
+ assertEquals(1, mController.mBundles.size()); |
+ assertEquals(allInvalidations, new PendingInvalidation(mController.mBundles.get(0))); |
} |
@VisibleForTesting |