Index: components/invalidation/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java |
diff --git a/components/invalidation/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java b/components/invalidation/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java |
deleted file mode 100644 |
index a4fd8e3ad762b19dc28a0adc5ed117a4b0046944..0000000000000000000000000000000000000000 |
--- a/components/invalidation/android/javatests/src/org/chromium/components/invalidation/InvalidationClientServiceTest.java |
+++ /dev/null |
@@ -1,858 +0,0 @@ |
-// Copyright 2013 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.components.invalidation; |
- |
-import android.accounts.Account; |
-import android.content.ComponentName; |
-import android.content.Intent; |
-import android.test.ServiceTestCase; |
-import android.test.suitebuilder.annotation.SmallTest; |
- |
-import com.google.ipc.invalidation.external.client.InvalidationListener.RegistrationState; |
-import com.google.ipc.invalidation.external.client.contrib.AndroidListener; |
-import com.google.ipc.invalidation.external.client.types.ErrorInfo; |
-import com.google.ipc.invalidation.external.client.types.Invalidation; |
-import com.google.ipc.invalidation.external.client.types.ObjectId; |
- |
-import org.chromium.base.CollectionUtil; |
-import org.chromium.base.test.util.AdvancedMockContext; |
-import org.chromium.base.test.util.Feature; |
-import org.chromium.sync.internal_api.pub.base.ModelType; |
-import org.chromium.sync.notifier.InvalidationIntentProtocol; |
-import org.chromium.sync.notifier.InvalidationPreferences; |
-import org.chromium.sync.notifier.InvalidationPreferences.EditContext; |
-import org.chromium.sync.signin.AccountManagerHelper; |
- |
-import java.util.ArrayList; |
-import java.util.Arrays; |
-import java.util.EnumSet; |
-import java.util.HashSet; |
-import java.util.List; |
-import java.util.Set; |
- |
-/** |
- * Tests for the {@link InvalidationClientService}. |
- * |
- * @author dsmyers@google.com (Daniel Myers) |
- */ |
-public class InvalidationClientServiceTest extends |
- ServiceTestCase<TestableInvalidationClientService> { |
- /** Id used when creating clients. */ |
- private static final byte[] CLIENT_ID = new byte[]{0, 4, 7}; |
- |
- /** Intents provided to {@link #startService}. */ |
- private List<Intent> mStartServiceIntents; |
- |
- public InvalidationClientServiceTest() { |
- super(TestableInvalidationClientService.class); |
- } |
- |
- @Override |
- public void setUp() throws Exception { |
- super.setUp(); |
- mStartServiceIntents = new ArrayList<Intent>(); |
- setContext(new AdvancedMockContext(getContext()) { |
- @Override |
- public ComponentName startService(Intent intent) { |
- mStartServiceIntents.add(intent); |
- return new ComponentName(this, InvalidationClientServiceTest.class); |
- } |
- }); |
- setupService(); |
- } |
- |
- @Override |
- public void tearDown() throws Exception { |
- if (InvalidationClientService.getIsClientStartedForTest()) { |
- Intent stopIntent = createStopIntent(); |
- getService().onHandleIntent(stopIntent); |
- } |
- assertFalse(InvalidationClientService.getIsClientStartedForTest()); |
- super.tearDown(); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testComputeRegistrationOps() { |
- /* |
- * Test plan: compute the set of registration operations resulting from various combinations |
- * of existing and desired registrations. Verifying that they are correct. |
- */ |
- Set<ObjectId> regAccumulator = new HashSet<ObjectId>(); |
- Set<ObjectId> unregAccumulator = new HashSet<ObjectId>(); |
- |
- // Empty existing and desired registrations should yield empty operation sets. |
- InvalidationClientService.computeRegistrationOps( |
- ModelType.modelTypesToObjectIds( |
- CollectionUtil.newHashSet(ModelType.BOOKMARK, ModelType.SESSION)), |
- ModelType.modelTypesToObjectIds( |
- CollectionUtil.newHashSet(ModelType.BOOKMARK, ModelType.SESSION)), |
- regAccumulator, unregAccumulator); |
- assertEquals(0, regAccumulator.size()); |
- assertEquals(0, unregAccumulator.size()); |
- |
- // Equal existing and desired registrations should yield empty operation sets. |
- InvalidationClientService.computeRegistrationOps(new HashSet<ObjectId>(), |
- new HashSet<ObjectId>(), regAccumulator, unregAccumulator); |
- assertEquals(0, regAccumulator.size()); |
- assertEquals(0, unregAccumulator.size()); |
- |
- // Empty existing and non-empty desired registrations should yield desired registrations |
- // as the registration operations to do and no unregistrations. |
- Set<ObjectId> desiredTypes = |
- CollectionUtil.newHashSet( |
- ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()); |
- InvalidationClientService.computeRegistrationOps( |
- new HashSet<ObjectId>(), |
- desiredTypes, |
- regAccumulator, unregAccumulator); |
- assertEquals( |
- CollectionUtil.newHashSet( |
- ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()), |
- new HashSet<ObjectId>(regAccumulator)); |
- assertEquals(0, unregAccumulator.size()); |
- regAccumulator.clear(); |
- |
- // Unequal existing and desired registrations should yield both registrations and |
- // unregistrations. We should unregister TYPED_URL and register BOOKMARK, keeping SESSION. |
- InvalidationClientService.computeRegistrationOps( |
- CollectionUtil.newHashSet( |
- ModelType.SESSION.toObjectId(), ModelType.TYPED_URL.toObjectId()), |
- CollectionUtil.newHashSet( |
- ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()), |
- regAccumulator, unregAccumulator); |
- assertEquals(CollectionUtil.newHashSet(ModelType.BOOKMARK.toObjectId()), regAccumulator); |
- assertEquals(CollectionUtil.newHashSet(ModelType.TYPED_URL.toObjectId()), |
- unregAccumulator); |
- regAccumulator.clear(); |
- unregAccumulator.clear(); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testReady() { |
- /** |
- * Test plan: call ready. Verify that the service sets the client id correctly and reissues |
- * pending registrations. |
- */ |
- |
- // Persist some registrations. |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- EditContext editContext = invPrefs.edit(); |
- invPrefs.setSyncTypes(editContext, CollectionUtil.newArrayList("BOOKMARK", "SESSION")); |
- ObjectId objectId = ObjectId.newInstance(1, "obj".getBytes()); |
- invPrefs.setObjectIds(editContext, CollectionUtil.newArrayList(objectId)); |
- assertTrue(invPrefs.commit(editContext)); |
- |
- // Issue ready. |
- getService().ready(CLIENT_ID); |
- assertTrue(Arrays.equals(CLIENT_ID, InvalidationClientService.getClientIdForTest())); |
- byte[] otherCid = "otherCid".getBytes(); |
- getService().ready(otherCid); |
- assertTrue(Arrays.equals(otherCid, InvalidationClientService.getClientIdForTest())); |
- |
- // Verify registrations issued. |
- assertEquals(CollectionUtil.newHashSet( |
- ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId(), objectId), |
- new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testReissueRegistrations() { |
- /* |
- * Test plan: call the reissueRegistrations method of the listener with both empty and |
- * non-empty sets of desired registrations stored in preferences. Verify that no register |
- * intent is set in the first case and that the appropriate register intent is sent in |
- * the second. |
- */ |
- |
- // No persisted registrations. |
- getService().reissueRegistrations(CLIENT_ID); |
- assertTrue(getService().mRegistrations.isEmpty()); |
- |
- // Persist some registrations. |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- EditContext editContext = invPrefs.edit(); |
- invPrefs.setSyncTypes(editContext, CollectionUtil.newArrayList("BOOKMARK", "SESSION")); |
- ObjectId objectId = ObjectId.newInstance(1, "obj".getBytes()); |
- invPrefs.setObjectIds(editContext, CollectionUtil.newArrayList(objectId)); |
- assertTrue(invPrefs.commit(editContext)); |
- |
- // Reissue registrations and verify that the appropriate registrations are issued. |
- getService().reissueRegistrations(CLIENT_ID); |
- assertEquals(1, getService().mRegistrations.size()); |
- assertEquals(CollectionUtil.newHashSet( |
- ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId(), objectId), |
- new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInformRegistrationStatus() { |
- /* |
- * Test plan: call inform registration status under a variety of circumstances and verify |
- * that the appropriate (un)register calls are issued. |
- * |
- * 1. Registration of desired object. No calls issued. |
- * 2. Unregistration of undesired object. No calls issued. |
- * 3. Registration of undesired object. Unregistration issued. |
- * 4. Unregistration of desired object. Registration issued. |
- */ |
- // Initial test setup: persist a single registration into preferences. |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- EditContext editContext = invPrefs.edit(); |
- invPrefs.setSyncTypes(editContext, CollectionUtil.newArrayList("SESSION")); |
- ObjectId desiredObjectId = ObjectId.newInstance(1, "obj1".getBytes()); |
- ObjectId undesiredObjectId = ObjectId.newInstance(1, "obj2".getBytes()); |
- invPrefs.setObjectIds(editContext, CollectionUtil.newArrayList(desiredObjectId)); |
- assertTrue(invPrefs.commit(editContext)); |
- |
- // Cases 1 and 2: calls matching desired state cause no actions. |
- getService().informRegistrationStatus(CLIENT_ID, ModelType.SESSION.toObjectId(), |
- RegistrationState.REGISTERED); |
- getService().informRegistrationStatus(CLIENT_ID, desiredObjectId, |
- RegistrationState.REGISTERED); |
- getService().informRegistrationStatus(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), |
- RegistrationState.UNREGISTERED); |
- getService().informRegistrationStatus(CLIENT_ID, undesiredObjectId, |
- RegistrationState.UNREGISTERED); |
- assertTrue(getService().mRegistrations.isEmpty()); |
- assertTrue(getService().mUnregistrations.isEmpty()); |
- |
- // Case 3: registration of undesired object triggers an unregistration. |
- getService().informRegistrationStatus(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), |
- RegistrationState.REGISTERED); |
- getService().informRegistrationStatus(CLIENT_ID, undesiredObjectId, |
- RegistrationState.REGISTERED); |
- assertEquals(2, getService().mUnregistrations.size()); |
- assertEquals(0, getService().mRegistrations.size()); |
- assertEquals(CollectionUtil.newArrayList(ModelType.BOOKMARK.toObjectId()), |
- getService().mUnregistrations.get(0)); |
- assertEquals(CollectionUtil.newArrayList(undesiredObjectId), |
- getService().mUnregistrations.get(1)); |
- |
- // Case 4: unregistration of a desired object triggers a registration. |
- getService().informRegistrationStatus(CLIENT_ID, ModelType.SESSION.toObjectId(), |
- RegistrationState.UNREGISTERED); |
- getService().informRegistrationStatus(CLIENT_ID, desiredObjectId, |
- RegistrationState.UNREGISTERED); |
- assertEquals(2, getService().mUnregistrations.size()); |
- assertEquals(2, getService().mRegistrations.size()); |
- assertEquals(CollectionUtil.newArrayList(ModelType.SESSION.toObjectId()), |
- getService().mRegistrations.get(0)); |
- assertEquals(CollectionUtil.newArrayList(desiredObjectId), |
- getService().mRegistrations.get(1)); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInformRegistrationFailure() { |
- /* |
- * Test plan: call inform registration failure under a variety of circumstances and verify |
- * that the appropriate (un)register calls are issued. |
- * |
- * 1. Transient registration failure for an object that should be registered. Register |
- * should be called. |
- * 2. Permanent registration failure for an object that should be registered. No calls. |
- * 3. Transient registration failure for an object that should not be registered. Unregister |
- * should be called. |
- * 4. Permanent registration failure for an object should not be registered. No calls. |
- */ |
- |
- // Initial test setup: persist a single registration into preferences. |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- EditContext editContext = invPrefs.edit(); |
- invPrefs.setSyncTypes(editContext, CollectionUtil.newArrayList("SESSION")); |
- ObjectId desiredObjectId = ObjectId.newInstance(1, "obj1".getBytes()); |
- ObjectId undesiredObjectId = ObjectId.newInstance(1, "obj2".getBytes()); |
- invPrefs.setObjectIds(editContext, CollectionUtil.newArrayList(desiredObjectId)); |
- assertTrue(invPrefs.commit(editContext)); |
- |
- // Cases 2 and 4: permanent registration failures never cause calls to be made. |
- getService().informRegistrationFailure(CLIENT_ID, ModelType.SESSION.toObjectId(), false, |
- ""); |
- getService().informRegistrationFailure(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), false, |
- ""); |
- getService().informRegistrationFailure(CLIENT_ID, desiredObjectId, false, ""); |
- getService().informRegistrationFailure(CLIENT_ID, undesiredObjectId, false, ""); |
- assertTrue(getService().mRegistrations.isEmpty()); |
- assertTrue(getService().mUnregistrations.isEmpty()); |
- |
- // Case 1: transient failure of a desired registration results in re-registration. |
- getService().informRegistrationFailure(CLIENT_ID, ModelType.SESSION.toObjectId(), true, ""); |
- getService().informRegistrationFailure(CLIENT_ID, desiredObjectId, true, ""); |
- assertEquals(2, getService().mRegistrations.size()); |
- assertTrue(getService().mUnregistrations.isEmpty()); |
- assertEquals(CollectionUtil.newArrayList(ModelType.SESSION.toObjectId()), |
- getService().mRegistrations.get(0)); |
- assertEquals(CollectionUtil.newArrayList(desiredObjectId), |
- getService().mRegistrations.get(1)); |
- |
- // Case 3: transient failure of an undesired registration results in unregistration. |
- getService().informRegistrationFailure(CLIENT_ID, ModelType.BOOKMARK.toObjectId(), true, |
- ""); |
- getService().informRegistrationFailure(CLIENT_ID, undesiredObjectId, true, ""); |
- assertEquals(2, getService().mRegistrations.size()); |
- assertEquals(2, getService().mUnregistrations.size()); |
- assertEquals(CollectionUtil.newArrayList(ModelType.BOOKMARK.toObjectId()), |
- getService().mUnregistrations.get(0)); |
- assertEquals(CollectionUtil.newArrayList(undesiredObjectId), |
- getService().mUnregistrations.get(1)); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInformError() { |
- /* |
- * Test plan: call informError with both permanent and transient errors. Verify that |
- * the transient error causes no action to be taken and that the permanent error causes |
- * the client to be stopped. |
- */ |
- |
- // Client needs to be started for the permament error to trigger and stop. |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- getService().onHandleIntent(createStartIntent()); |
- getService().mStartedServices.clear(); // Discard start intent. |
- |
- // Transient error. |
- getService().informError(ErrorInfo.newInstance(0, true, "transient", null)); |
- assertTrue(getService().mStartedServices.isEmpty()); |
- |
- // Permanent error. |
- getService().informError(ErrorInfo.newInstance(0, false, "permanent", null)); |
- assertEquals(1, getService().mStartedServices.size()); |
- Intent sentIntent = getService().mStartedServices.get(0); |
- Intent stopIntent = AndroidListener.createStopIntent(getContext()); |
- assertTrue(stopIntent.filterEquals(sentIntent)); |
- assertEquals(stopIntent.getExtras().keySet(), sentIntent.getExtras().keySet()); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testReadWriteState() { |
- /* |
- * Test plan: read, write, and read the internal notification client persistent state. |
- * Verify appropriate return values. |
- */ |
- assertNull(getService().readState()); |
- byte[] writtenState = new byte[]{7, 4, 0}; |
- getService().writeState(writtenState); |
- assertTrue(Arrays.equals(writtenState, getService().readState())); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInvalidateWithPayload() { |
- doTestInvalidate(true); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInvalidateWithoutPayload() { |
- doTestInvalidate(false); |
- } |
- |
- private void doTestInvalidate(boolean hasPayload) { |
- /* |
- * Test plan: call invalidate() with an invalidation that may or may not have a payload. |
- * Verify the produced bundle has the correct fields. |
- */ |
- // Call invalidate. |
- int version = 4747; |
- int objectSource = 55; |
- String objectName = "BOOKMARK"; |
- ObjectId objectId = ObjectId.newInstance(objectSource, objectName.getBytes()); |
- final String payload = "testInvalidate-" + hasPayload; |
- Invalidation invalidation = hasPayload |
- ? Invalidation.newInstance(objectId, version, payload.getBytes()) |
- : Invalidation.newInstance(objectId, version); |
- byte[] ackHandle = ("testInvalidate-" + hasPayload).getBytes(); |
- getService().invalidate(invalidation, ackHandle); |
- |
- // Validate bundle. |
- assertEquals(1, getService().mRequestedSyncs.size()); |
- PendingInvalidation request = new PendingInvalidation(getService().mRequestedSyncs.get(0)); |
- assertEquals(objectSource, request.mObjectSource); |
- assertEquals(objectName, request.mObjectId); |
- assertEquals(version, request.mVersion); |
- assertEquals(hasPayload ? payload : null, request.mPayload); |
- |
- // Ensure acknowledged. |
- assertSingleAcknowledgement(ackHandle); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInvalidateUnknownVersion() { |
- /* |
- * Test plan: call invalidateUnknownVersion(). Verify the produced bundle has the correct |
- * fields. |
- */ |
- int objectSource = 55; |
- String objectName = "BOOKMARK"; |
- ObjectId objectId = ObjectId.newInstance(objectSource, objectName.getBytes()); |
- byte[] ackHandle = "testInvalidateUV".getBytes(); |
- getService().invalidateUnknownVersion(objectId, ackHandle); |
- |
- // Validate bundle. |
- assertEquals(1, getService().mRequestedSyncs.size()); |
- PendingInvalidation request = new PendingInvalidation(getService().mRequestedSyncs.get(0)); |
- assertEquals(objectSource, request.mObjectSource); |
- assertEquals(objectName, request.mObjectId); |
- assertEquals(0, request.mVersion); |
- assertEquals(null, request.mPayload); |
- |
- // Ensure acknowledged. |
- assertSingleAcknowledgement(ackHandle); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testInvalidateAll() { |
- /* |
- * Test plan: call invalidateAll(). Verify the produced bundle has the correct fields. |
- */ |
- byte[] ackHandle = "testInvalidateAll".getBytes(); |
- getService().invalidateAll(ackHandle); |
- |
- // Validate bundle. |
- assertEquals(1, getService().mRequestedSyncs.size()); |
- PendingInvalidation request = new PendingInvalidation(getService().mRequestedSyncs.get(0)); |
- assertEquals(0, request.mObjectSource); |
- |
- // Ensure acknowledged. |
- assertSingleAcknowledgement(ackHandle); |
- } |
- |
- /** Asserts that the service received a single acknowledgement with handle {@code ackHandle}. */ |
- private void assertSingleAcknowledgement(byte[] ackHandle) { |
- assertEquals(1, getService().mAcknowledgements.size()); |
- assertTrue(Arrays.equals(ackHandle, getService().mAcknowledgements.get(0))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testShouldClientBeRunning() { |
- /* |
- * Test plan: call shouldClientBeRunning with various combinations of |
- * in-foreground/sync-enabled. Verify appropriate return values. |
- */ |
- getService().setShouldRunStates(false, false); |
- assertFalse(getService().shouldClientBeRunning()); |
- |
- getService().setShouldRunStates(false, true); |
- assertFalse(getService().shouldClientBeRunning()); |
- |
- getService().setShouldRunStates(true, false); |
- assertFalse(getService().shouldClientBeRunning()); |
- |
- // Should only be running if both in the foreground and sync is enabled. |
- getService().setShouldRunStates(true, true); |
- assertTrue(getService().shouldClientBeRunning()); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testStartAndStopClient() { |
- /* |
- * Test plan: with Chrome configured so that the client should run, send it an empty |
- * intent. Even though no owning account is known, the client should still start. Send |
- * it a stop intent and verify that it stops. |
- */ |
- |
- // Note: we are manipulating the service object directly, rather than through startService, |
- // because otherwise we would need to handle the asynchronous execution model of the |
- // underlying IntentService. |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- Intent startIntent = createStartIntent(); |
- getService().onHandleIntent(startIntent); |
- assertTrue(InvalidationClientService.getIsClientStartedForTest()); |
- |
- Intent stopIntent = createStopIntent(); |
- getService().onHandleIntent(stopIntent); |
- assertFalse(InvalidationClientService.getIsClientStartedForTest()); |
- |
- // The issued intents should have been an AndroidListener start intent followed by an |
- // AndroidListener stop intent. |
- assertEquals(2, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- assertTrue(isAndroidListenerStopIntent(mStartServiceIntents.get(1))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testClientStopsWhenShouldNotBeRunning() { |
- /* |
- * Test plan: start the client. Then, change the configuration so that Chrome should not |
- * be running. Send an intent to the service and verify that it stops. |
- */ |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- // Start the service. |
- Intent startIntent = createStartIntent(); |
- getService().onHandleIntent(startIntent); |
- assertTrue(InvalidationClientService.getIsClientStartedForTest()); |
- |
- // Change configuration. |
- getService().setShouldRunStates(false, false); |
- |
- // Send an Intent and verify that the service stops. |
- getService().onHandleIntent(startIntent); |
- assertFalse(InvalidationClientService.getIsClientStartedForTest()); |
- |
- // The issued intents should have been an AndroidListener start intent followed by an |
- // AndroidListener stop intent. |
- assertEquals(2, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- assertTrue(isAndroidListenerStopIntent(mStartServiceIntents.get(1))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testRegistrationIntent() { |
- /* |
- * Test plan: send a registration-change intent. Verify that it starts the client and |
- * sets both the account and registrations in shared preferences. |
- */ |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- // Send register Intent. |
- Set<ModelType> desiredRegistrations = CollectionUtil.newHashSet( |
- ModelType.BOOKMARK, ModelType.SESSION); |
- Account account = AccountManagerHelper.createAccountFromName("test@example.com"); |
- Intent registrationIntent = createRegisterIntent(account, false, desiredRegistrations); |
- getService().onHandleIntent(registrationIntent); |
- |
- // Verify client started and state written. |
- assertTrue(InvalidationClientService.getIsClientStartedForTest()); |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- assertEquals(account, invPrefs.getSavedSyncedAccount()); |
- assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), |
- invPrefs.getSavedSyncedTypes()); |
- assertNull(invPrefs.getSavedObjectIds()); |
- assertEquals(1, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- |
- // Send another registration-change intent, this type with all-types set to true, and |
- // verify that the on-disk state is updated and that no addition Intents are issued. |
- getService().onHandleIntent(createRegisterIntent(account, true, null)); |
- assertEquals(account, invPrefs.getSavedSyncedAccount()); |
- assertEquals(CollectionUtil.newHashSet(ModelType.ALL_TYPES_TYPE), |
- invPrefs.getSavedSyncedTypes()); |
- assertEquals(1, mStartServiceIntents.size()); |
- |
- // Finally, send one more registration-change intent, this time with a different account, |
- // and verify that it both updates the account, stops thye existing client, and |
- // starts a new client. |
- Account account2 = AccountManagerHelper.createAccountFromName("test2@example.com"); |
- getService().onHandleIntent(createRegisterIntent(account2, true, null)); |
- assertEquals(account2, invPrefs.getSavedSyncedAccount()); |
- assertEquals(3, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- assertTrue(isAndroidListenerStopIntent(mStartServiceIntents.get(1))); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(2))); |
- } |
- |
- /** |
- * Determines if the correct object ids have been written to preferences and registered with the |
- * invalidation client. |
- * |
- * @param expectedTypes The Sync types expected to be registered. |
- * @param expectedObjectIds The additional object ids expected to be registered. |
- * @param isReady Whether the client is ready to register/unregister. |
- */ |
- private boolean expectedObjectIdsRegistered(Set<ModelType> expectedTypes, |
- Set<ObjectId> expectedObjectIds, boolean isReady) { |
- // Get synced types saved to preferences. |
- Set<String> expectedSyncTypes = ModelType.modelTypesToSyncTypesForTest(expectedTypes); |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- Set<String> actualSyncTypes = invPrefs.getSavedSyncedTypes(); |
- if (actualSyncTypes == null) { |
- actualSyncTypes = new HashSet<String>(); |
- } |
- |
- // Get object ids saved to preferences. |
- Set<ObjectId> actualObjectIds = invPrefs.getSavedObjectIds(); |
- if (actualObjectIds == null) { |
- actualObjectIds = new HashSet<ObjectId>(); |
- } |
- |
- // Get expected registered object ids. |
- Set<ObjectId> expectedRegisteredIds = new HashSet<ObjectId>(); |
- if (isReady) { |
- expectedRegisteredIds.addAll(ModelType.modelTypesToObjectIds(expectedTypes)); |
- expectedRegisteredIds.addAll(expectedObjectIds); |
- } |
- |
- return actualSyncTypes.equals(expectedSyncTypes) |
- && actualObjectIds.equals(expectedObjectIds) |
- && getService().mCurrentRegistrations.equals(expectedRegisteredIds); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testRegistrationIntentWithTypesAndObjectIds() { |
- /* |
- * Test plan: send a mix of registration-change intents: some for Sync types and some for |
- * object ids. Verify that registering for Sync types does not interfere with object id |
- * registration and vice-versa. |
- */ |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- Account account = AccountManagerHelper.createAccountFromName("test@example.com"); |
- Set<ObjectId> objectIds = new HashSet<ObjectId>(); |
- Set<ModelType> types = new HashSet<ModelType>(); |
- |
- // Register for some object ids. |
- objectIds.add(ObjectId.newInstance(1, "obj1".getBytes())); |
- objectIds.add(ObjectId.newInstance(2, "obj2".getBytes())); |
- Intent registrationIntent = |
- createRegisterIntent(account, new int[] {1, 2}, new String[] {"obj1", "obj2"}); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, false /* isReady */)); |
- |
- // Register for some types. |
- types.add(ModelType.BOOKMARK); |
- types.add(ModelType.SESSION); |
- registrationIntent = createRegisterIntent(account, false, types); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, false /* isReady */)); |
- |
- // Set client to be ready and verify registrations. |
- getService().ready(CLIENT_ID); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- |
- // Change object id registration with types registered. |
- objectIds.add(ObjectId.newInstance(3, "obj3".getBytes())); |
- registrationIntent = createRegisterIntent( |
- account, new int[] {1, 2, 3}, new String[] {"obj1", "obj2", "obj3"}); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- |
- // Change type registration with object ids registered. |
- types.remove(ModelType.BOOKMARK); |
- registrationIntent = createRegisterIntent(account, false, types); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- |
- // Unregister all types. |
- types.clear(); |
- registrationIntent = createRegisterIntent(account, false, types); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- |
- // Change object id registration with no types registered. |
- objectIds.remove(ObjectId.newInstance(2, "obj2".getBytes())); |
- registrationIntent = createRegisterIntent( |
- account, new int[] {1, 3}, new String[] {"obj1", "obj3"}); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- |
- // Unregister all object ids. |
- objectIds.clear(); |
- registrationIntent = createRegisterIntent(account, new int[0], new String[0]); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- |
- // Change type registration with no object ids registered. |
- types.add(ModelType.BOOKMARK); |
- types.add(ModelType.PASSWORD); |
- registrationIntent = createRegisterIntent(account, false, types); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testRegistrationIntentNoProxyTabsUsingReady() { |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- // Send register Intent. |
- Account account = AccountManagerHelper.createAccountFromName("test@example.com"); |
- Intent registrationIntent = createRegisterIntent(account, true, null); |
- getService().onHandleIntent(registrationIntent); |
- |
- // Verify client started and state written. |
- assertTrue(InvalidationClientService.getIsClientStartedForTest()); |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- assertEquals(account, invPrefs.getSavedSyncedAccount()); |
- assertEquals(CollectionUtil.newHashSet(ModelType.ALL_TYPES_TYPE), |
- invPrefs.getSavedSyncedTypes()); |
- assertEquals(1, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- |
- // Set client to be ready. This triggers registrations. |
- getService().ready(CLIENT_ID); |
- assertTrue(Arrays.equals(CLIENT_ID, InvalidationClientService.getClientIdForTest())); |
- |
- // Ensure registrations are correct. |
- Set<ObjectId> expectedTypes = |
- ModelType.modelTypesToObjectIds(EnumSet.allOf(ModelType.class)); |
- assertEquals(expectedTypes, new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testRegistrationIntentNoProxyTabsAlreadyWithClientId() { |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- // Send register Intent with no desired types. |
- Account account = AccountManagerHelper.createAccountFromName("test@example.com"); |
- Intent registrationIntent = createRegisterIntent(account, false, new HashSet<ModelType>()); |
- getService().onHandleIntent(registrationIntent); |
- |
- // Verify client started and state written. |
- assertTrue(InvalidationClientService.getIsClientStartedForTest()); |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- assertEquals(account, invPrefs.getSavedSyncedAccount()); |
- assertEquals(new HashSet<String>(), invPrefs.getSavedSyncedTypes()); |
- assertEquals(1, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- |
- // Make sure client is ready. |
- getService().ready(CLIENT_ID); |
- assertTrue(Arrays.equals(CLIENT_ID, InvalidationClientService.getClientIdForTest())); |
- |
- // Choose to register for all types in an already ready client. |
- registrationIntent = createRegisterIntent(account, true, null); |
- getService().onHandleIntent(registrationIntent); |
- |
- // Ensure registrations are correct. |
- assertEquals(1, getService().mRegistrations.size()); |
- Set<ObjectId> expectedTypes = |
- ModelType.modelTypesToObjectIds(EnumSet.allOf(ModelType.class)); |
- assertEquals(expectedTypes, new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testRegistrationIntentWhenClientShouldNotBeRunning() { |
- /* |
- * Test plan: send a registration change event when the client should not be running. |
- * Verify that the service updates the on-disk state but does not start the client. |
- */ |
- getService().onCreate(); |
- |
- // Send register Intent. |
- Account account = AccountManagerHelper.createAccountFromName("test@example.com"); |
- Set<ModelType> desiredRegistrations = CollectionUtil.newHashSet( |
- ModelType.BOOKMARK, ModelType.SESSION); |
- Intent registrationIntent = createRegisterIntent(account, false, desiredRegistrations); |
- getService().onHandleIntent(registrationIntent); |
- |
- // Verify state written but client not started. |
- assertFalse(InvalidationClientService.getIsClientStartedForTest()); |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- assertEquals(account, invPrefs.getSavedSyncedAccount()); |
- assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), |
- invPrefs.getSavedSyncedTypes()); |
- assertEquals(0, mStartServiceIntents.size()); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testDeferredRegistrationsIssued() { |
- /* |
- * Test plan: send a registration-change intent. Verify that the client issues a start |
- * intent but makes no registration calls. Issue a reissueRegistrations call and verify |
- * that the client does issue the appropriate registrations. |
- */ |
- getService().setShouldRunStates(true, true); |
- getService().onCreate(); |
- |
- // Send register Intent. Verify client started but no registrations issued. |
- Account account = AccountManagerHelper.createAccountFromName("test@example.com"); |
- Set<ModelType> desiredRegistrations = CollectionUtil.newHashSet( |
- ModelType.BOOKMARK, ModelType.SESSION); |
- Set<ObjectId> desiredObjectIds = ModelType.modelTypesToObjectIds(desiredRegistrations); |
- |
- Intent registrationIntent = createRegisterIntent(account, false, desiredRegistrations); |
- getService().onHandleIntent(registrationIntent); |
- assertTrue(InvalidationClientService.getIsClientStartedForTest()); |
- assertEquals(1, mStartServiceIntents.size()); |
- assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
- InvalidationPreferences invPrefs = new InvalidationPreferences(getContext()); |
- assertEquals(ModelType.modelTypesToSyncTypesForTest(desiredRegistrations), |
- invPrefs.getSavedSyncedTypes()); |
- assertEquals(desiredObjectIds, getService().readRegistrationsFromPrefs()); |
- |
- // Issue reissueRegistrations; verify registration intent issues. |
- getService().reissueRegistrations(CLIENT_ID); |
- assertEquals(2, mStartServiceIntents.size()); |
- Intent expectedRegisterIntent = AndroidListener.createRegisterIntent( |
- getContext(), |
- CLIENT_ID, |
- desiredObjectIds); |
- Intent actualRegisterIntent = mStartServiceIntents.get(1); |
- assertTrue(expectedRegisterIntent.filterEquals(actualRegisterIntent)); |
- assertEquals(expectedRegisterIntent.getExtras().keySet(), |
- actualRegisterIntent.getExtras().keySet()); |
- assertEquals( |
- desiredObjectIds, |
- new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
- } |
- |
- @SmallTest |
- @Feature({"Sync"}) |
- public void testRegistrationRetries() { |
- /* |
- * Test plan: validate that the alarm receiver used by the AndroidListener underlying |
- * InvalidationClientService is correctly configured in the manifest and retries |
- * registrations with exponential backoff. May need to be implemented as a downstream |
- * Chrome for Android test. |
- */ |
- // TODO(dsmyers): implement. |
- // Bug: https://code.google.com/p/chromium/issues/detail?id=172398 |
- } |
- |
- /** Creates an intent to start the InvalidationClientService. */ |
- private Intent createStartIntent() { |
- Intent intent = new Intent(); |
- return intent; |
- } |
- |
- /** Creates an intent to stop the InvalidationClientService. */ |
- private Intent createStopIntent() { |
- Intent intent = new Intent(); |
- intent.putExtra(InvalidationIntentProtocol.EXTRA_STOP, true); |
- return intent; |
- } |
- |
- /** Creates an intent to register some types with the InvalidationClientService. */ |
- private Intent createRegisterIntent(Account account, boolean allTypes, Set<ModelType> types) { |
- Intent intent = InvalidationIntentProtocol.createRegisterIntent(account, allTypes, types); |
- return intent; |
- } |
- |
- /** Creates an intent to register some types with the InvalidationClientService. */ |
- private Intent createRegisterIntent( |
- Account account, int[] objectSources, String[] objectNames) { |
- Intent intent = InvalidationIntentProtocol.createRegisterIntent( |
- account, objectSources, objectNames); |
- return intent; |
- } |
- |
- /** Returns whether {@code intent} is an {@link AndroidListener} start intent. */ |
- private boolean isAndroidListenerStartIntent(Intent intent) { |
- Intent startIntent = AndroidListener.createStartIntent(getContext(), |
- InvalidationClientService.CLIENT_TYPE, "unused".getBytes()); |
- return intent.getExtras().keySet().equals(startIntent.getExtras().keySet()); |
- } |
- |
- /** Returns whether {@code intent} is an {@link AndroidListener} stop intent. */ |
- private boolean isAndroidListenerStopIntent(Intent intent) { |
- Intent stopIntent = AndroidListener.createStopIntent(getContext()); |
- return intent.getExtras().keySet().equals(stopIntent.getExtras().keySet()); |
- } |
-} |