Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Unified Diff: sync/android/javatests/src/org/chromium/sync/notifier/InvalidationServiceTest.java

Issue 23643002: Enable invalidations for arbitrary objects on Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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() {

Powered by Google App Engine
This is Rietveld 408576698