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