Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / push_messaging / push_messaging_invalidation_handler_unittest.cc
1 // Copyright (c) 2012 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/extensions/api/push_messaging/push_messaging_invalidation_handler.h"
6
7 #include "base/basictypes.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_delegate.h"
10 #include "components/invalidation/invalidation_logger.h"
11 #include "components/invalidation/invalidation_service.h"
12 #include "google/cacheinvalidation/types.pb.h"
13 #include "sync/notifier/object_id_invalidation_map.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using ::testing::NotNull;
18 using ::testing::SaveArg;
19 using ::testing::StrictMock;
20 using ::testing::_;
21
22 namespace extensions {
23
24 namespace {
25
26 class MockInvalidationService : public invalidation::InvalidationService {
27  public:
28   MockInvalidationService();
29   ~MockInvalidationService();
30   MOCK_METHOD1(RegisterInvalidationHandler,
31                void(syncer::InvalidationHandler*));
32   MOCK_METHOD2(UpdateRegisteredInvalidationIds,
33                void(syncer::InvalidationHandler*, const syncer::ObjectIdSet&));
34   MOCK_METHOD1(UnregisterInvalidationHandler,
35                void(syncer::InvalidationHandler*));
36   MOCK_CONST_METHOD0(GetInvalidatorState, syncer::InvalidatorState());
37   MOCK_CONST_METHOD0(GetInvalidatorClientId, std::string());
38   MOCK_METHOD0(GetInvalidationLogger, invalidation::InvalidationLogger*());
39   MOCK_CONST_METHOD1(RequestDetailedStatus,
40                      void(base::Callback<void(const base::DictionaryValue&)>));
41   MOCK_METHOD0(GetIdentityProvider, IdentityProvider*());
42
43  private:
44   DISALLOW_COPY_AND_ASSIGN(MockInvalidationService);
45 };
46
47 MockInvalidationService::MockInvalidationService() {}
48 MockInvalidationService::~MockInvalidationService() {}
49
50 class MockInvalidationHandlerDelegate
51     : public PushMessagingInvalidationHandlerDelegate {
52  public:
53   MockInvalidationHandlerDelegate();
54   ~MockInvalidationHandlerDelegate();
55   MOCK_METHOD3(OnMessage,
56                void(const std::string&, int, const std::string&));
57
58  private:
59   DISALLOW_COPY_AND_ASSIGN(MockInvalidationHandlerDelegate);
60 };
61
62 MockInvalidationHandlerDelegate::MockInvalidationHandlerDelegate() {}
63 MockInvalidationHandlerDelegate::~MockInvalidationHandlerDelegate() {}
64
65 }  // namespace
66
67 class PushMessagingInvalidationHandlerTest : public ::testing::Test {
68  protected:
69   virtual void SetUp() OVERRIDE {
70     syncer::InvalidationHandler* handler = NULL;
71     EXPECT_CALL(service_, RegisterInvalidationHandler(NotNull()))
72         .WillOnce(SaveArg<0>(&handler));
73     handler_.reset(new PushMessagingInvalidationHandler(
74         &service_, &delegate_));
75     EXPECT_EQ(handler_.get(), handler);
76   }
77   virtual void TearDown() OVERRIDE {
78     EXPECT_CALL(service_, UnregisterInvalidationHandler(handler_.get()));
79     handler_.reset();
80   }
81   StrictMock<MockInvalidationService> service_;
82   StrictMock<MockInvalidationHandlerDelegate> delegate_;
83   scoped_ptr<PushMessagingInvalidationHandler> handler_;
84 };
85
86 TEST_F(PushMessagingInvalidationHandlerTest, RegisterUnregisterExtension) {
87   syncer::ObjectIdSet expected_ids;
88   expected_ids.insert(invalidation::ObjectId(
89       ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
90       "U/cccccccccccccccccccccccccccccccc/0"));
91   expected_ids.insert(invalidation::ObjectId(
92       ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
93       "U/cccccccccccccccccccccccccccccccc/1"));
94   expected_ids.insert(invalidation::ObjectId(
95       ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
96       "U/cccccccccccccccccccccccccccccccc/2"));
97   expected_ids.insert(invalidation::ObjectId(
98       ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
99       "U/cccccccccccccccccccccccccccccccc/3"));
100   EXPECT_CALL(service_,
101               UpdateRegisteredInvalidationIds(handler_.get(), expected_ids));
102   handler_->RegisterExtension("cccccccccccccccccccccccccccccccc");
103   EXPECT_CALL(service_,
104               UpdateRegisteredInvalidationIds(handler_.get(),
105                                               syncer::ObjectIdSet()));
106   handler_->UnregisterExtension("cccccccccccccccccccccccccccccccc");
107 }
108
109 TEST_F(PushMessagingInvalidationHandlerTest, Dispatch) {
110   syncer::ObjectIdInvalidationMap invalidation_map;
111   // A normal invalidation.
112   invalidation_map.Insert(
113       syncer::Invalidation::Init(
114           invalidation::ObjectId(
115               ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
116               "U/dddddddddddddddddddddddddddddddd/0"),
117           10,
118           "payload"));
119
120   // An unknown version invalidation.
121   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
122       invalidation::ObjectId(
123         ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
124         "U/dddddddddddddddddddddddddddddddd/3")));
125
126   EXPECT_CALL(delegate_,
127               OnMessage("dddddddddddddddddddddddddddddddd", 0, "payload"));
128   EXPECT_CALL(delegate_,
129               OnMessage("dddddddddddddddddddddddddddddddd", 3, ""));
130   handler_->OnIncomingInvalidation(invalidation_map);
131 }
132
133 // Tests that malformed object IDs don't trigger spurious callbacks.
134 TEST_F(PushMessagingInvalidationHandlerTest, DispatchInvalidObjectIds) {
135   syncer::ObjectIdInvalidationMap invalidation_map;
136   // Completely incorrect format.
137   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
138           invalidation::ObjectId(
139               ipc::invalidation::ObjectSource::TEST,
140               "Invalid")));
141   // Incorrect source.
142   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
143           invalidation::ObjectId(
144               ipc::invalidation::ObjectSource::TEST,
145               "U/dddddddddddddddddddddddddddddddd/3")));
146   // Incorrect format type.
147   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
148           invalidation::ObjectId(
149               ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
150               "V/dddddddddddddddddddddddddddddddd/3")));
151   // Invalid extension ID length.
152   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
153           invalidation::ObjectId(
154               ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
155               "U/ddddddddddddddddddddddddddddddddd/3")));
156   // Non-numeric subchannel.
157   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
158           invalidation::ObjectId(
159               ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
160               "U/dddddddddddddddddddddddddddddddd/z")));
161   // Subchannel out of range.
162   invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion(
163           invalidation::ObjectId(
164               ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
165               "U/dddddddddddddddddddddddddddddddd/4")));
166   handler_->OnIncomingInvalidation(invalidation_map);
167 }
168
169 // Test version filtering of incoming invalidations.
170 TEST_F(PushMessagingInvalidationHandlerTest, InvalidationVersionsOutOfOrder) {
171   const invalidation::ObjectId id0(
172       ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
173       "U/dddddddddddddddddddddddddddddddd/0");
174   const invalidation::ObjectId id3(
175       ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING,
176       "U/dddddddddddddddddddddddddddddddd/3");
177
178   // The first received invalidation should get through.
179   syncer::ObjectIdInvalidationMap map1;
180   map1.Insert(syncer::Invalidation::Init(id0, 5, "5"));
181   EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "5"));
182   handler_->OnIncomingInvalidation(map1);
183   testing::Mock::VerifyAndClearExpectations(&delegate_);
184
185   // Invalid versions are always allowed through.
186   syncer::ObjectIdInvalidationMap map2;
187   map2.Insert(syncer::Invalidation::InitUnknownVersion(id0));
188   EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, ""));
189   handler_->OnIncomingInvalidation(map2);
190   testing::Mock::VerifyAndClearExpectations(&delegate_);
191
192   // An older version should not make it through.
193   syncer::ObjectIdInvalidationMap map3;
194   map3.Insert(syncer::Invalidation::Init(id0, 4, "4"));
195   handler_->OnIncomingInvalidation(map3);
196
197   // A newer version will make it through.
198   syncer::ObjectIdInvalidationMap map4;
199   map4.Insert(syncer::Invalidation::Init(id0, 6, "6"));
200   EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "6"));
201   handler_->OnIncomingInvalidation(map4);
202   testing::Mock::VerifyAndClearExpectations(&delegate_);
203
204   // An unrelated object should be unaffected by all the above.
205   syncer::ObjectIdInvalidationMap map5;
206   map5.Insert(syncer::Invalidation::Init(id3, 1, "1"));
207   EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 3, "1"));
208   handler_->OnIncomingInvalidation(map5);
209   testing::Mock::VerifyAndClearExpectations(&delegate_);
210 }
211
212 }  // namespace extensions