1a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// found in the LICENSE file. 4a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/invalidation/invalidation_service_android.h" 6a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/invalidation/invalidation_controller_android.h" 9a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/invalidation/invalidation_service_factory.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/invalidation/invalidation_service_test_template.h" 11a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/public/browser/notification_service.h" 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sync/notifier/fake_invalidation_handler.h" 14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 16a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace invalidation { 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MockInvalidationControllerAndroid : public InvalidationControllerAndroid { 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockInvalidationControllerAndroid() {} 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~MockInvalidationControllerAndroid() {} 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetRegisteredObjectIds(const syncer::ObjectIdSet& ids) OVERRIDE { 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) registered_ids_ = ids; 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::ObjectIdSet registered_ids_; 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class InvalidationServiceAndroidTestDelegate { 31a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) public: 32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) InvalidationServiceAndroidTestDelegate() { } 33a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ~InvalidationServiceAndroidTestDelegate() { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DestroyInvalidationService(); 36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CreateInvalidationService() { 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) profile_.reset(new TestingProfile()); 40a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) invalidation_service_android_.reset( 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InvalidationServiceAndroid( 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) profile_.get(), 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new MockInvalidationControllerAndroid())); 44a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 45a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InvalidationService* GetInvalidationService() { 47a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return invalidation_service_android_.get(); 48a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void DestroyInvalidationService() { 51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) invalidation_service_android_->Shutdown(); 52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 53a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void TriggerOnInvalidatorStateChange(syncer::InvalidatorState state) { 55a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) invalidation_service_android_->TriggerStateChangeForTest(state); 56a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 57a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 58a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void TriggerOnIncomingInvalidation( 59a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const syncer::ObjectIdInvalidationMap& invalidation_map) { 60a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::NotificationService::current()->Notify( 61a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, 62a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::Source<Profile>(profile_.get()), 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::Details<const syncer::ObjectIdInvalidationMap>( 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &invalidation_map)); 65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) } 66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<TestingProfile> profile_; 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<InvalidationServiceAndroid> invalidation_service_android_; 69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}; 70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)INSTANTIATE_TYPED_TEST_CASE_P( 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AndroidInvalidationServiceTest, InvalidationServiceTest, 73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) InvalidationServiceAndroidTestDelegate); 74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class InvalidationServiceAndroidRegistrationTest : public testing::Test { 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InvalidationServiceAndroidRegistrationTest() 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : invalidation_controller_(new MockInvalidationControllerAndroid()), 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service_(&profile_, invalidation_controller_) {} 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~InvalidationServiceAndroidRegistrationTest() { 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service_.Shutdown(); 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Get the invalidation service being tested. 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InvalidationService& invalidation_service() { 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return invalidation_service_; 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Get the number of objects which are registered. 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) size_t RegisteredObjectCount() { 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return registered_ids().size(); 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Determines if the given object id is registered with the invalidation 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // controller. 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsRegistered(const invalidation::ObjectId& id) { 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return registered_ids().find(id) != registered_ids().end(); 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Get the set of objects registered with the invalidation controller. 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const syncer::ObjectIdSet& registered_ids() { 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return invalidation_controller_->registered_ids_; 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestingProfile profile_; 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockInvalidationControllerAndroid* invalidation_controller_; 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InvalidationServiceAndroid invalidation_service_; 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(InvalidationServiceAndroidRegistrationTest, NoObjectRegistration) { 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::FakeInvalidationHandler handler; 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().RegisterInvalidationHandler(&handler); 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0U, RegisteredObjectCount()); 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().UnregisterInvalidationHandler(&handler); 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(InvalidationServiceAndroidRegistrationTest, UpdateObjectRegistration) { 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::FakeInvalidationHandler handler; 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation::ObjectId id1(1, "A"); 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation::ObjectId id2(2, "B"); 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::ObjectIdSet ids; 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().RegisterInvalidationHandler(&handler); 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Register for both objects. 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ids.insert(id1); 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ids.insert(id2); 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids); 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(2U, RegisteredObjectCount()); 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsRegistered(id1)); 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsRegistered(id2)); 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Unregister for object 2. 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ids.erase(id2); 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids); 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(1U, RegisteredObjectCount()); 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsRegistered(id1)); 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Unregister for object 1. 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ids.erase(id1); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(0U, RegisteredObjectCount()); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidation_service().UnregisterInvalidationHandler(&handler); 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_ANDROID) 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class InvalidationServiceAndroidTest : public testing::Test { 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InvalidationServiceAndroidTest() 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : invalidation_service_(&profile_, new InvalidationControllerAndroid()) {} 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~InvalidationServiceAndroidTest() {} 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InvalidationService& invalidation_service() { 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation_service_; 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile profile_; 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InvalidationServiceAndroid invalidation_service_; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(InvalidationServiceAndroidTest, FetchClientId) { 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string id1 = invalidation_service().GetInvalidatorClientId(); 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_FALSE(id1.empty()); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If nothing else, the ID should be consistent. 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string id2 = invalidation_service().GetInvalidatorClientId(); 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(id1, id2); 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace invalidation 177