Chromium Code Reviews| Index: sync/android/javatests/src/org/chromium/sync/notifier/InvalidationServiceTest.java |
| diff --git a/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationServiceTest.java b/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationServiceTest.java |
| index 18d65072464e33b0cf15776bc68b5f2772e64ac2..56832c765cc3d026b9e2bd44e01995a2c451bda2 100644 |
| --- a/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationServiceTest.java |
| +++ b/sync/android/javatests/src/org/chromium/sync/notifier/InvalidationServiceTest.java |
| @@ -141,6 +141,8 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| 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. |
| @@ -152,7 +154,7 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| // Verify registrations issued. |
| assertEquals(CollectionUtil.newHashSet( |
| - ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId()), |
| + ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId(), objectId), |
| new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
| } |
| @@ -174,13 +176,15 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| 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()), |
| + ModelType.BOOKMARK.toObjectId(), ModelType.SESSION.toObjectId(), objectId), |
| new HashSet<ObjectId>(getService().mRegistrations.get(0))); |
| } |
| @@ -200,31 +204,46 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| 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); |
| - assertEquals(1, getService().mUnregistrations.size()); |
| + 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); |
| - assertEquals(1, getService().mUnregistrations.size()); |
| - assertEquals(1, getService().mRegistrations.size()); |
| + 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 |
| @@ -246,6 +265,9 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| 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. |
| @@ -253,23 +275,31 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| ""); |
| 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, ""); |
| - assertEquals(1, getService().mRegistrations.size()); |
| + 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, |
| ""); |
| - assertEquals(1, getService().mRegistrations.size()); |
| - assertEquals(1, getService().mUnregistrations.size()); |
| + 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 |
| @@ -332,7 +362,7 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| */ |
| // Call invalidate. |
| int version = 4747; |
| - ObjectId objectId = ModelType.BOOKMARK.toObjectId(); |
| + ObjectId objectId = ObjectId.newInstance(55, "BOOKMARK".getBytes()); |
| final String payload = "testInvalidate-" + hasPayload; |
| Invalidation invalidation = hasPayload ? |
| Invalidation.newInstance(objectId, version, payload.getBytes()) : |
| @@ -343,6 +373,7 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| // Validate bundle. |
| assertEquals(1, getService().mRequestedSyncs.size()); |
| Bundle syncBundle = getService().mRequestedSyncs.get(0); |
| + assertEquals(55, syncBundle.getInt("objectSource")); |
| assertEquals("BOOKMARK", syncBundle.getString("objectId")); |
| assertEquals(version, syncBundle.getLong("version")); |
| assertEquals(hasPayload ? payload : "", syncBundle.getString("payload")); |
| @@ -358,13 +389,14 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| * Test plan: call invalidateUnknownVersion(). Verify the produced bundle has the correct |
| * fields. |
| */ |
| - ObjectId objectId = ModelType.BOOKMARK.toObjectId(); |
| + ObjectId objectId = ObjectId.newInstance(55, "BOOKMARK".getBytes()); |
| byte[] ackHandle = "testInvalidateUV".getBytes(); |
| getService().invalidateUnknownVersion(objectId, ackHandle); |
| // Validate bundle. |
| assertEquals(1, getService().mRequestedSyncs.size()); |
| Bundle syncBundle = getService().mRequestedSyncs.get(0); |
| + assertEquals(55, syncBundle.getInt("objectSource")); |
| assertEquals("BOOKMARK", syncBundle.getString("objectId")); |
| assertEquals(0, syncBundle.getLong("version")); |
| assertEquals("", syncBundle.getString("payload")); |
| @@ -501,6 +533,7 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| assertEquals(account, invPrefs.getSavedSyncedAccount()); |
| assertEquals(ModelType.modelTypesToSyncTypes(desiredRegistrations), |
| invPrefs.getSavedSyncedTypes()); |
| + assertNull(invPrefs.getSavedObjectIds()); |
| assertEquals(1, mStartServiceIntents.size()); |
| assertTrue(isAndroidListenerStartIntent(mStartServiceIntents.get(0))); |
| @@ -524,6 +557,117 @@ public class InvalidationServiceTest extends ServiceTestCase<TestableInvalidatio |
| 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.modelTypesToSyncTypes(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 = IntentProtocol.createRegisterIntent(account, new int[] { 1, 2 }, |
|
nyquist
2013/09/05 22:50:08
Nit: No spaces after { or before } in array initia
Steve Condie
2013/09/06 20:05:22
Done.
|
| + 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 = IntentProtocol.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 = IntentProtocol.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 = IntentProtocol.createRegisterIntent(account, false, types); |
| + getService().onHandleIntent(registrationIntent); |
| + assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
| + |
| + // Unregister all types. |
| + types.clear(); |
| + registrationIntent = IntentProtocol.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 = IntentProtocol.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 = IntentProtocol.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 = IntentProtocol.createRegisterIntent(account, false, types); |
| + getService().onHandleIntent(registrationIntent); |
| + assertTrue(expectedObjectIdsRegistered(types, objectIds, true /* isReady */)); |
| + } |
| + |
| @SmallTest |
| @Feature({"Sync"}) |
| public void testRegistrationIntentNoProxyTabsUsingReady() { |