| Index: chrome/browser/invalidation/invalidation_service_android_unittest.cc
|
| diff --git a/chrome/browser/invalidation/invalidation_service_android_unittest.cc b/chrome/browser/invalidation/invalidation_service_android_unittest.cc
|
| index af9de1de1fc10df259056b2058d14d6d90ac1d60..8d4c1eeead5c9fb745ec1488878877abab7bc417 100644
|
| --- a/chrome/browser/invalidation/invalidation_service_android_unittest.cc
|
| +++ b/chrome/browser/invalidation/invalidation_service_android_unittest.cc
|
| @@ -4,11 +4,16 @@
|
|
|
| #include "chrome/browser/invalidation/invalidation_service_android.h"
|
|
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/bind.h"
|
| #include "chrome/browser/chrome_notification_types.h"
|
| #include "chrome/browser/invalidation/invalidation_service_factory.h"
|
| #include "chrome/browser/invalidation/invalidation_service_test_template.h"
|
| #include "chrome/test/base/testing_profile.h"
|
| #include "content/public/browser/notification_service.h"
|
| +#include "sync/notifier/fake_invalidation_handler.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace invalidation {
|
| @@ -56,4 +61,192 @@ INSTANTIATE_TYPED_TEST_CASE_P(
|
| AndroidInvalidationServiceTest, InvalidationServiceTest,
|
| InvalidationServiceAndroidTestDelegate);
|
|
|
| +class InvalidationServiceAndroidRegistrationTest : public testing::Test {
|
| + protected:
|
| + InvalidationServiceAndroidRegistrationTest()
|
| + : invalidation_service_(&profile_),
|
| + object_registration_updated_(false) {
|
| + invalidation_service_.SetUpdateRegistrationCallbackForTest(base::Bind(
|
| + &InvalidationServiceAndroidRegistrationTest::UpdateRegistration,
|
| + base::Unretained(this)));
|
| + OBJECT_SET_A.insert(invalidation::ObjectId(1, "A"));
|
| + OBJECT_SET_A.insert(invalidation::ObjectId(2, "B"));
|
| + OBJECT_SET_A.insert(invalidation::ObjectId(3, "C"));
|
| + OBJECT_SET_B.insert(invalidation::ObjectId(1, "D"));
|
| + OBJECT_SET_B.insert(invalidation::ObjectId(2, "E"));
|
| + OBJECT_SET_C.insert(invalidation::ObjectId(3, "F"));
|
| + OBJECT_SET_SYNC.insert(
|
| + invalidation::ObjectId(ipc::invalidation::ObjectSource::CHROME_SYNC,
|
| + "A"));
|
| + OBJECT_SET_SYNC.insert(
|
| + invalidation::ObjectId(ipc::invalidation::ObjectSource::CHROME_SYNC,
|
| + "B"));
|
| + OBJECT_SET_MIXED.insert(OBJECT_SET_A.begin(), OBJECT_SET_A.end());
|
| + OBJECT_SET_MIXED.insert(OBJECT_SET_SYNC.begin(), OBJECT_SET_SYNC.end());
|
| + }
|
| +
|
| + virtual ~InvalidationServiceAndroidRegistrationTest() {
|
| + invalidation_service_.Shutdown();
|
| + }
|
| +
|
| + // Determines if the object registration was updated since the last time this
|
| + // method was called.
|
| + bool ObjectRegistrationUpdated() {
|
| + bool updated = object_registration_updated_;
|
| + object_registration_updated_ = false;
|
| + return updated;
|
| + }
|
| +
|
| + // Determines if all of the object ids in the given set were registered in
|
| + // the last registration update.
|
| + bool ObjectsRegistered(const syncer::ObjectIdSet& ids) {
|
| + return CheckObjectRegistration(ids, true /* expect_registered */);
|
| + }
|
| +
|
| + // Determines if none of the object ids in the given set were registered in
|
| + // the last registration update.
|
| + bool ObjectsNotRegistered(const syncer::ObjectIdSet& ids) {
|
| + return CheckObjectRegistration(ids, false /* expect_registered */);
|
| + }
|
| +
|
| + // Get the number of objects which are registered.
|
| + size_t RegisteredObjectCount() {
|
| + return registered_object_ids_.size();
|
| + }
|
| +
|
| + // Determines if the given object id was registered in the last registration
|
| + // update.
|
| + bool IsRegistered(const invalidation::ObjectId& id) {
|
| + return registered_object_ids_.find(id) != registered_object_ids_.end();
|
| + }
|
| +
|
| + // Disjoint object id sets containing non-Sync object ids.
|
| + syncer::ObjectIdSet OBJECT_SET_A;
|
| + syncer::ObjectIdSet OBJECT_SET_B;
|
| + syncer::ObjectIdSet OBJECT_SET_C;
|
| +
|
| + // An object id set containing Sync object ids.
|
| + syncer::ObjectIdSet OBJECT_SET_SYNC;
|
| +
|
| + // An object id set comprised of the union of OBJECT_SET_A and
|
| + // OBJECT_SET_SYNC.
|
| + syncer::ObjectIdSet OBJECT_SET_MIXED;
|
| +
|
| + TestingProfile profile_;
|
| +
|
| + // The invalidation service used for testing.
|
| + InvalidationServiceAndroid invalidation_service_;
|
| +
|
| + private:
|
| + // Determines if all of the object ids in the given set have the same
|
| + // registration status.
|
| + bool CheckObjectRegistration(const syncer::ObjectIdSet& ids,
|
| + bool expect_registered) {
|
| + syncer::ObjectIdSet::const_iterator id;
|
| + for (id = ids.begin(); id != ids.end(); ++id)
|
| + if (IsRegistered(*id) != expect_registered)
|
| + return false;
|
| + return true;
|
| + }
|
| +
|
| + // Callback invoked when the invalidation service updates the registration.
|
| + void UpdateRegistration(const std::vector<int>& object_sources,
|
| + const std::vector<std::string>& object_names) {
|
| + object_registration_updated_ = true;
|
| + registered_object_ids_.clear();
|
| + for (size_t i = 0; i < object_sources.size(); ++i) {
|
| + registered_object_ids_.insert(invalidation::ObjectId(
|
| + object_sources[i], object_names[i]));
|
| + }
|
| + }
|
| +
|
| + bool object_registration_updated_;
|
| + syncer::ObjectIdSet registered_object_ids_;
|
| +};
|
| +
|
| +TEST_F(InvalidationServiceAndroidRegistrationTest, NoObjectRegistration) {
|
| + syncer::FakeInvalidationHandler handler;
|
| + invalidation_service_.RegisterInvalidationHandler(&handler);
|
| + EXPECT_EQ(0U, RegisteredObjectCount());
|
| + invalidation_service_.UnregisterInvalidationHandler(&handler);
|
| +}
|
| +
|
| +TEST_F(InvalidationServiceAndroidRegistrationTest, UpdateObjectRegistration) {
|
| + syncer::FakeInvalidationHandler handler1;
|
| + syncer::FakeInvalidationHandler handler2;
|
| + syncer::FakeInvalidationHandler handler3;
|
| + syncer::FakeInvalidationHandler handler4;
|
| + invalidation_service_.RegisterInvalidationHandler(&handler1);
|
| + invalidation_service_.RegisterInvalidationHandler(&handler2);
|
| + invalidation_service_.RegisterInvalidationHandler(&handler3);
|
| + invalidation_service_.RegisterInvalidationHandler(&handler4);
|
| +
|
| + // Register for object set A.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler1,
|
| + OBJECT_SET_A);
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + EXPECT_EQ(OBJECT_SET_A.size(), RegisteredObjectCount());
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_A));
|
| +
|
| + // Register for object sets B and C.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler2,
|
| + OBJECT_SET_B);
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler3,
|
| + OBJECT_SET_C);
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + EXPECT_EQ(OBJECT_SET_A.size() + OBJECT_SET_B.size() + OBJECT_SET_C.size(),
|
| + RegisteredObjectCount());
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_A));
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_B));
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_C));
|
| +
|
| + // Register for sync object set. Expect no registration update.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler4,
|
| + OBJECT_SET_SYNC);
|
| + EXPECT_FALSE(ObjectRegistrationUpdated());
|
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_SYNC));
|
| +
|
| + // Unregister for object set C.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler3,
|
| + syncer::ObjectIdSet());
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_C));
|
| +
|
| + // Unregister for object set A.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler1,
|
| + syncer::ObjectIdSet());
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_A));
|
| +
|
| + // Unregister for sync object set. Expect no registration update.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler4,
|
| + syncer::ObjectIdSet());
|
| + EXPECT_FALSE(ObjectRegistrationUpdated());
|
| +
|
| + // Register for mixed object set. Expect only the objects in set A to be
|
| + // registered.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler3,
|
| + OBJECT_SET_MIXED);
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_A));
|
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_SYNC));
|
| +
|
| + // Unregister the handler mapped to set B. Expect no registration update.
|
| + invalidation_service_.UnregisterInvalidationHandler(&handler2);
|
| + EXPECT_FALSE(ObjectRegistrationUpdated());
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_B));
|
| +
|
| + // Replace object set A with object set C.
|
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler3,
|
| + OBJECT_SET_C);
|
| + EXPECT_TRUE(ObjectRegistrationUpdated());
|
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_A));
|
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_C));
|
| +
|
| + invalidation_service_.UnregisterInvalidationHandler(&handler1);
|
| + invalidation_service_.UnregisterInvalidationHandler(&handler3);
|
| + invalidation_service_.UnregisterInvalidationHandler(&handler4);
|
| +}
|
| +
|
| } // namespace invalidation
|
|
|