| 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() {
|
|
|