| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidati
on_handler.h" | 5 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidati
on_handler.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidati
on_handler_delegate.h" | 9 #include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidati
on_handler_delegate.h" |
| 10 #include "chrome/browser/invalidation/invalidation_service.h" | 10 #include "chrome/browser/invalidation/invalidation_service.h" |
| 11 #include "google/cacheinvalidation/types.pb.h" | 11 #include "google/cacheinvalidation/types.pb.h" |
| 12 #include "sync/internal_api/public/base/invalidation_test_util.h" | |
| 13 #include "sync/notifier/object_id_invalidation_map.h" | 12 #include "sync/notifier/object_id_invalidation_map.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 15 |
| 17 using ::testing::_; | 16 using ::testing::_; |
| 18 using ::testing::NotNull; | 17 using ::testing::NotNull; |
| 19 using ::testing::SaveArg; | 18 using ::testing::SaveArg; |
| 20 using ::testing::StrictMock; | 19 using ::testing::StrictMock; |
| 21 using syncer::AckHandle; | |
| 22 | 20 |
| 23 namespace extensions { | 21 namespace extensions { |
| 24 | 22 |
| 25 namespace { | 23 namespace { |
| 26 | 24 |
| 27 class MockInvalidationService : public invalidation::InvalidationService { | 25 class MockInvalidationService : public invalidation::InvalidationService { |
| 28 public: | 26 public: |
| 29 MockInvalidationService(); | 27 MockInvalidationService(); |
| 30 ~MockInvalidationService(); | 28 ~MockInvalidationService(); |
| 31 MOCK_METHOD1(RegisterInvalidationHandler, | 29 MOCK_METHOD1(RegisterInvalidationHandler, |
| 32 void(syncer::InvalidationHandler*)); | 30 void(syncer::InvalidationHandler*)); |
| 33 MOCK_METHOD2(UpdateRegisteredInvalidationIds, | 31 MOCK_METHOD2(UpdateRegisteredInvalidationIds, |
| 34 void(syncer::InvalidationHandler*, const syncer::ObjectIdSet&)); | 32 void(syncer::InvalidationHandler*, const syncer::ObjectIdSet&)); |
| 35 MOCK_METHOD1(UnregisterInvalidationHandler, | 33 MOCK_METHOD1(UnregisterInvalidationHandler, |
| 36 void(syncer::InvalidationHandler*)); | 34 void(syncer::InvalidationHandler*)); |
| 37 MOCK_METHOD2(AcknowledgeInvalidation, void(const invalidation::ObjectId&, | |
| 38 const syncer::AckHandle&)); | |
| 39 MOCK_CONST_METHOD0(GetInvalidatorState, syncer::InvalidatorState()); | 35 MOCK_CONST_METHOD0(GetInvalidatorState, syncer::InvalidatorState()); |
| 40 MOCK_CONST_METHOD0(GetInvalidatorClientId, std::string()); | 36 MOCK_CONST_METHOD0(GetInvalidatorClientId, std::string()); |
| 41 | 37 |
| 42 private: | 38 private: |
| 43 DISALLOW_COPY_AND_ASSIGN(MockInvalidationService); | 39 DISALLOW_COPY_AND_ASSIGN(MockInvalidationService); |
| 44 }; | 40 }; |
| 45 | 41 |
| 46 MockInvalidationService::MockInvalidationService() {} | 42 MockInvalidationService::MockInvalidationService() {} |
| 47 MockInvalidationService::~MockInvalidationService() {} | 43 MockInvalidationService::~MockInvalidationService() {} |
| 48 | 44 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // An unknown version invalidation. | 115 // An unknown version invalidation. |
| 120 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( | 116 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( |
| 121 invalidation::ObjectId( | 117 invalidation::ObjectId( |
| 122 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, | 118 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, |
| 123 "U/dddddddddddddddddddddddddddddddd/3"))); | 119 "U/dddddddddddddddddddddddddddddddd/3"))); |
| 124 | 120 |
| 125 EXPECT_CALL(delegate_, | 121 EXPECT_CALL(delegate_, |
| 126 OnMessage("dddddddddddddddddddddddddddddddd", 0, "payload")); | 122 OnMessage("dddddddddddddddddddddddddddddddd", 0, "payload")); |
| 127 EXPECT_CALL(delegate_, | 123 EXPECT_CALL(delegate_, |
| 128 OnMessage("dddddddddddddddddddddddddddddddd", 3, "")); | 124 OnMessage("dddddddddddddddddddddddddddddddd", 3, "")); |
| 129 | |
| 130 syncer::ObjectIdSet ids = invalidation_map.GetObjectIds(); | |
| 131 for (syncer::ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); | |
| 132 ++it) { | |
| 133 const syncer::Invalidation& inv = invalidation_map.ForObject(*it).back(); | |
| 134 const syncer::AckHandle& ack_handle = inv.ack_handle(); | |
| 135 EXPECT_CALL(service_, AcknowledgeInvalidation(*it, ack_handle)); | |
| 136 } | |
| 137 handler_->OnIncomingInvalidation(invalidation_map); | 125 handler_->OnIncomingInvalidation(invalidation_map); |
| 138 } | 126 } |
| 139 | 127 |
| 140 // Tests that malformed object IDs don't trigger spurious callbacks. | 128 // Tests that malformed object IDs don't trigger spurious callbacks. |
| 141 TEST_F(PushMessagingInvalidationHandlerTest, DispatchInvalidObjectIds) { | 129 TEST_F(PushMessagingInvalidationHandlerTest, DispatchInvalidObjectIds) { |
| 142 syncer::ObjectIdInvalidationMap invalidation_map; | 130 syncer::ObjectIdInvalidationMap invalidation_map; |
| 143 // Completely incorrect format. | 131 // Completely incorrect format. |
| 144 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( | 132 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( |
| 145 invalidation::ObjectId( | 133 invalidation::ObjectId( |
| 146 ipc::invalidation::ObjectSource::TEST, | 134 ipc::invalidation::ObjectSource::TEST, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 163 // Non-numeric subchannel. | 151 // Non-numeric subchannel. |
| 164 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( | 152 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( |
| 165 invalidation::ObjectId( | 153 invalidation::ObjectId( |
| 166 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, | 154 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, |
| 167 "U/dddddddddddddddddddddddddddddddd/z"))); | 155 "U/dddddddddddddddddddddddddddddddd/z"))); |
| 168 // Subchannel out of range. | 156 // Subchannel out of range. |
| 169 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( | 157 invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( |
| 170 invalidation::ObjectId( | 158 invalidation::ObjectId( |
| 171 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, | 159 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, |
| 172 "U/dddddddddddddddddddddddddddddddd/4"))); | 160 "U/dddddddddddddddddddddddddddddddd/4"))); |
| 173 // Invalid object IDs should still be acknowledged. | |
| 174 syncer::ObjectIdSet ids = invalidation_map.GetObjectIds(); | |
| 175 for (syncer::ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); | |
| 176 ++it) { | |
| 177 const syncer::Invalidation& inv = invalidation_map.ForObject(*it).back(); | |
| 178 const syncer::AckHandle& ack_handle = inv.ack_handle(); | |
| 179 EXPECT_CALL(service_, AcknowledgeInvalidation(*it, ack_handle)); | |
| 180 } | |
| 181 handler_->OnIncomingInvalidation(invalidation_map); | 161 handler_->OnIncomingInvalidation(invalidation_map); |
| 182 } | 162 } |
| 183 | 163 |
| 164 // Test version filtering of incoming invalidations. |
| 165 TEST_F(PushMessagingInvalidationHandlerTest, InvalidationVersionsOutOfOrder) { |
| 166 const invalidation::ObjectId id0( |
| 167 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, |
| 168 "U/dddddddddddddddddddddddddddddddd/0"); |
| 169 const invalidation::ObjectId id3( |
| 170 ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, |
| 171 "U/dddddddddddddddddddddddddddddddd/3"); |
| 172 |
| 173 // The first received invalidation should get through. |
| 174 syncer::ObjectIdInvalidationMap map1; |
| 175 map1.Insert(syncer::Invalidation::Init(id0, 5, "5")); |
| 176 EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "5")); |
| 177 handler_->OnIncomingInvalidation(map1); |
| 178 testing::Mock::VerifyAndClearExpectations(&delegate_); |
| 179 |
| 180 // Invalid versions are always allowed through. |
| 181 syncer::ObjectIdInvalidationMap map2; |
| 182 map2.Insert(syncer::Invalidation::InitUnknownVersion(id0)); |
| 183 EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "")); |
| 184 handler_->OnIncomingInvalidation(map2); |
| 185 testing::Mock::VerifyAndClearExpectations(&delegate_); |
| 186 |
| 187 // An older version should not make it through. |
| 188 syncer::ObjectIdInvalidationMap map3; |
| 189 map3.Insert(syncer::Invalidation::Init(id0, 4, "4")); |
| 190 handler_->OnIncomingInvalidation(map3); |
| 191 |
| 192 // A newer version will make it through. |
| 193 syncer::ObjectIdInvalidationMap map4; |
| 194 map4.Insert(syncer::Invalidation::Init(id0, 6, "6")); |
| 195 EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "6")); |
| 196 handler_->OnIncomingInvalidation(map4); |
| 197 testing::Mock::VerifyAndClearExpectations(&delegate_); |
| 198 |
| 199 // An unrelated object should be unaffected by all the above. |
| 200 syncer::ObjectIdInvalidationMap map5; |
| 201 map5.Insert(syncer::Invalidation::Init(id3, 1, "1")); |
| 202 EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 3, "1")); |
| 203 handler_->OnIncomingInvalidation(map5); |
| 204 testing::Mock::VerifyAndClearExpectations(&delegate_); |
| 205 } |
| 206 |
| 184 } // namespace extensions | 207 } // namespace extensions |
| OLD | NEW |