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..fd8e070e935c0b840ab6342b45186a82e1d134d1 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}, |
+ 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() { |