Chromium Code Reviews| 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..ff23831a074a7de937428b595b7936ec23e9430f 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,188 @@ 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_D.insert( |
| + invalidation::ObjectId(ipc::invalidation::ObjectSource::CHROME_SYNC, |
| + "A")); |
| + OBJECT_SET_D.insert( |
| + invalidation::ObjectId(ipc::invalidation::ObjectSource::CHROME_SYNC, |
| + "B")); |
| + OBJECT_SET_E.insert(OBJECT_SET_A.begin(), OBJECT_SET_A.end()); |
| + OBJECT_SET_E.insert(OBJECT_SET_D.begin(), OBJECT_SET_D.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) { |
| + syncer::ObjectIdSet::const_iterator id; |
|
nyquist
2013/09/05 22:50:08
Nit: Do you want to extract a method, and pass in
Steve Condie
2013/09/06 20:05:22
Done.
|
| + for (id = ids.begin(); id != ids.end(); ++id) |
| + if (!IsRegistered(*id)) |
| + return false; |
| + return true; |
| + } |
| + |
| + // Determines if none of the object ids in the given set were registered in |
| + // the last registration update. |
| + bool ObjectsNotRegistered(const syncer::ObjectIdSet& ids) { |
| + syncer::ObjectIdSet::const_iterator id; |
| + for (id = ids.begin(); id != ids.end(); ++id) |
| + if (IsRegistered(*id)) |
| + return false; |
| + return true; |
| + } |
| + |
| + // 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_D; |
|
nyquist
2013/09/05 22:50:08
Nit: OBJECT_SET_SYNC?
Fine with keeping as is tho
Steve Condie
2013/09/06 20:05:22
Done.
|
| + |
| + // An object id set comprised of the union of OBJECT_SET_A and OBJECT_SET_D. |
| + syncer::ObjectIdSet OBJECT_SET_E; |
|
nyquist
2013/09/05 22:50:08
Nit: OBJECT_SET_A_UNION_D or OBJECT_SET_A_UNION_SY
Steve Condie
2013/09/06 20:05:22
How about OBJECT_SET_MIXED to keep the name a bit
nyquist
2013/09/07 05:10:47
Great idea!
|
| + |
| + TestingProfile profile_; |
| + |
| + // The invalidation service used for testing. |
| + InvalidationServiceAndroid invalidation_service_; |
| + |
| + private: |
| + // 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 object set D. Expect no registration update. |
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler4, |
| + OBJECT_SET_D); |
| + EXPECT_FALSE(ObjectRegistrationUpdated()); |
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_D)); |
| + |
| + // 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 object set D. Expect no registration update. |
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler4, |
| + syncer::ObjectIdSet()); |
| + EXPECT_FALSE(ObjectRegistrationUpdated()); |
| + |
| + // Register for object set E. Expect only the objects in set A to be |
| + // registered. |
| + invalidation_service_.UpdateRegisteredInvalidationIds(&handler3, |
| + OBJECT_SET_E); |
| + EXPECT_TRUE(ObjectRegistrationUpdated()); |
| + EXPECT_TRUE(ObjectsRegistered(OBJECT_SET_A)); |
| + EXPECT_TRUE(ObjectsNotRegistered(OBJECT_SET_D)); |
| + |
| + // 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 |