1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/invalidation/invalidation_service_android.h"
6
7#include "chrome/browser/chrome_notification_types.h"
8#include "chrome/browser/invalidation/invalidation_controller_android.h"
9#include "chrome/browser/invalidation/invalidation_service_factory.h"
10#include "chrome/browser/invalidation/invalidation_service_test_template.h"
11#include "chrome/test/base/testing_profile.h"
12#include "content/public/browser/notification_service.h"
13#include "sync/notifier/fake_invalidation_handler.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace invalidation {
17
18class MockInvalidationControllerAndroid : public InvalidationControllerAndroid {
19 public:
20  MockInvalidationControllerAndroid() {}
21  virtual ~MockInvalidationControllerAndroid() {}
22
23  virtual void SetRegisteredObjectIds(const syncer::ObjectIdSet& ids) OVERRIDE {
24    registered_ids_ = ids;
25  }
26
27  syncer::ObjectIdSet registered_ids_;
28};
29
30class InvalidationServiceAndroidTestDelegate {
31 public:
32  InvalidationServiceAndroidTestDelegate() { }
33
34  ~InvalidationServiceAndroidTestDelegate() {
35    DestroyInvalidationService();
36  }
37
38  void CreateInvalidationService() {
39    profile_.reset(new TestingProfile());
40    invalidation_service_android_.reset(
41        new InvalidationServiceAndroid(
42            profile_.get(),
43            new MockInvalidationControllerAndroid()));
44  }
45
46  InvalidationService* GetInvalidationService() {
47    return invalidation_service_android_.get();
48  }
49
50  void DestroyInvalidationService() {
51    invalidation_service_android_->Shutdown();
52  }
53
54  void TriggerOnInvalidatorStateChange(syncer::InvalidatorState state) {
55    invalidation_service_android_->TriggerStateChangeForTest(state);
56  }
57
58  void TriggerOnIncomingInvalidation(
59      const syncer::ObjectIdInvalidationMap& invalidation_map) {
60    content::NotificationService::current()->Notify(
61        chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
62        content::Source<Profile>(profile_.get()),
63        content::Details<const syncer::ObjectIdInvalidationMap>(
64            &invalidation_map));
65  }
66
67  scoped_ptr<TestingProfile> profile_;
68  scoped_ptr<InvalidationServiceAndroid> invalidation_service_android_;
69};
70
71INSTANTIATE_TYPED_TEST_CASE_P(
72    AndroidInvalidationServiceTest, InvalidationServiceTest,
73    InvalidationServiceAndroidTestDelegate);
74
75class InvalidationServiceAndroidRegistrationTest : public testing::Test {
76 protected:
77  InvalidationServiceAndroidRegistrationTest()
78      : invalidation_controller_(new MockInvalidationControllerAndroid()),
79        invalidation_service_(&profile_, invalidation_controller_) {}
80
81  virtual ~InvalidationServiceAndroidRegistrationTest() {
82    invalidation_service_.Shutdown();
83  }
84
85  // Get the invalidation service being tested.
86  InvalidationService& invalidation_service() {
87    return invalidation_service_;
88  }
89
90  // Get the number of objects which are registered.
91  size_t RegisteredObjectCount() {
92    return registered_ids().size();
93  }
94
95  // Determines if the given object id is registered with the invalidation
96  // controller.
97  bool IsRegistered(const invalidation::ObjectId& id) {
98    return registered_ids().find(id) != registered_ids().end();
99  }
100
101 private:
102  // Get the set of objects registered with the invalidation controller.
103  const syncer::ObjectIdSet& registered_ids() {
104    return invalidation_controller_->registered_ids_;
105  }
106
107  TestingProfile profile_;
108  MockInvalidationControllerAndroid* invalidation_controller_;
109  InvalidationServiceAndroid invalidation_service_;
110};
111
112TEST_F(InvalidationServiceAndroidRegistrationTest, NoObjectRegistration) {
113  syncer::FakeInvalidationHandler handler;
114  invalidation_service().RegisterInvalidationHandler(&handler);
115  EXPECT_EQ(0U, RegisteredObjectCount());
116  invalidation_service().UnregisterInvalidationHandler(&handler);
117}
118
119TEST_F(InvalidationServiceAndroidRegistrationTest, UpdateObjectRegistration) {
120  syncer::FakeInvalidationHandler handler;
121  invalidation::ObjectId id1(1, "A");
122  invalidation::ObjectId id2(2, "B");
123  syncer::ObjectIdSet ids;
124  invalidation_service().RegisterInvalidationHandler(&handler);
125
126  // Register for both objects.
127  ids.insert(id1);
128  ids.insert(id2);
129  invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids);
130  EXPECT_EQ(2U, RegisteredObjectCount());
131  EXPECT_TRUE(IsRegistered(id1));
132  EXPECT_TRUE(IsRegistered(id2));
133
134  // Unregister for object 2.
135  ids.erase(id2);
136  invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids);
137  EXPECT_EQ(1U, RegisteredObjectCount());
138  EXPECT_TRUE(IsRegistered(id1));
139
140  // Unregister for object 1.
141  ids.erase(id1);
142  invalidation_service().UpdateRegisteredInvalidationIds(&handler, ids);
143  EXPECT_EQ(0U, RegisteredObjectCount());
144
145  invalidation_service().UnregisterInvalidationHandler(&handler);
146}
147
148#if defined(OS_ANDROID)
149
150class InvalidationServiceAndroidTest : public testing::Test {
151 public:
152  InvalidationServiceAndroidTest()
153      : invalidation_service_(&profile_, new InvalidationControllerAndroid()) {}
154  virtual ~InvalidationServiceAndroidTest() {}
155
156  InvalidationService& invalidation_service() {
157    return invalidation_service_;
158  }
159
160 private:
161  TestingProfile profile_;
162  InvalidationServiceAndroid invalidation_service_;
163};
164
165TEST_F(InvalidationServiceAndroidTest, FetchClientId) {
166  const std::string id1 = invalidation_service().GetInvalidatorClientId();
167  ASSERT_FALSE(id1.empty());
168
169  // If nothing else, the ID should be consistent.
170  const std::string id2 = invalidation_service().GetInvalidatorClientId();
171  ASSERT_EQ(id1, id2);
172}
173
174#endif
175
176}  // namespace invalidation
177