15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/callback.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler_delegate.h" 110de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/invalidation_logger.h" 120de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "components/invalidation/invalidation_service.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/object_id_invalidation_map.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/types.pb.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::NotNull; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SaveArg; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock; 2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)using ::testing::_; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MockInvalidationService : public invalidation::InvalidationService { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MockInvalidationService(); 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ~MockInvalidationService(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(RegisterInvalidationHandler, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(syncer::InvalidationHandler*)); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(UpdateRegisteredInvalidationIds, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(syncer::InvalidationHandler*, const syncer::ObjectIdSet&)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(UnregisterInvalidationHandler, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(syncer::InvalidationHandler*)); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_CONST_METHOD0(GetInvalidatorState, syncer::InvalidatorState()); 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MOCK_CONST_METHOD0(GetInvalidatorClientId, std::string()); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MOCK_METHOD0(GetInvalidationLogger, invalidation::InvalidationLogger*()); 40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MOCK_CONST_METHOD1(RequestDetailedStatus, 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void(base::Callback<void(const base::DictionaryValue&)>)); 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch MOCK_METHOD0(GetIdentityProvider, IdentityProvider*()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(MockInvalidationService); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMockInvalidationService::MockInvalidationService() {} 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMockInvalidationService::~MockInvalidationService() {} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockInvalidationHandlerDelegate 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public PushMessagingInvalidationHandlerDelegate { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInvalidationHandlerDelegate(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MockInvalidationHandlerDelegate(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD3(OnMessage, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void(const std::string&, int, const std::string&)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockInvalidationHandlerDelegate); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockInvalidationHandlerDelegate::MockInvalidationHandlerDelegate() {} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockInvalidationHandlerDelegate::~MockInvalidationHandlerDelegate() {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PushMessagingInvalidationHandlerTest : public ::testing::Test { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syncer::InvalidationHandler* handler = NULL; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(service_, RegisterInvalidationHandler(NotNull())) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillOnce(SaveArg<0>(&handler)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_.reset(new PushMessagingInvalidationHandler( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &service_, &delegate_)); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(handler_.get(), handler); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(service_, UnregisterInvalidationHandler(handler_.get())); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_.reset(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StrictMock<MockInvalidationService> service_; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StrictMock<MockInvalidationHandlerDelegate> delegate_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PushMessagingInvalidationHandler> handler_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PushMessagingInvalidationHandlerTest, RegisterUnregisterExtension) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ObjectIdSet expected_ids; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_ids.insert(invalidation::ObjectId( 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "U/cccccccccccccccccccccccccccccccc/0")); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_ids.insert(invalidation::ObjectId( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "U/cccccccccccccccccccccccccccccccc/1")); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_ids.insert(invalidation::ObjectId( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "U/cccccccccccccccccccccccccccccccc/2")); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_ids.insert(invalidation::ObjectId( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "U/cccccccccccccccccccccccccccccccc/3")); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(service_, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateRegisteredInvalidationIds(handler_.get(), expected_ids)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_->RegisterExtension("cccccccccccccccccccccccccccccccc"); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(service_, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateRegisteredInvalidationIds(handler_.get(), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::ObjectIdSet())); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handler_->UnregisterExtension("cccccccccccccccccccccccccccccccc"); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PushMessagingInvalidationHandlerTest, Dispatch) { 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncer::ObjectIdInvalidationMap invalidation_map; 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // A normal invalidation. 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert( 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncer::Invalidation::Init( 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/0"), 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10, 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "payload")); 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // An unknown version invalidation. 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/3"))); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate_, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMessage("dddddddddddddddddddddddddddddddd", 0, "payload")); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(delegate_, 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnMessage("dddddddddddddddddddddddddddddddd", 3, "")); 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) handler_->OnIncomingInvalidation(invalidation_map); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that malformed object IDs don't trigger spurious callbacks. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PushMessagingInvalidationHandlerTest, DispatchInvalidObjectIds) { 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncer::ObjectIdInvalidationMap invalidation_map; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Completely incorrect format. 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::TEST, 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Invalid"))); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incorrect source. 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::TEST, 1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/3"))); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Incorrect format type. 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "V/dddddddddddddddddddddddddddddddd/3"))); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invalid extension ID length. 1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "U/ddddddddddddddddddddddddddddddddd/3"))); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-numeric subchannel. 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/z"))); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subchannel out of range. 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_map.Insert(syncer::Invalidation::InitUnknownVersion( 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation::ObjectId( 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/4"))); 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) handler_->OnIncomingInvalidation(invalidation_map); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test version filtering of incoming invalidations. 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PushMessagingInvalidationHandlerTest, InvalidationVersionsOutOfOrder) { 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const invalidation::ObjectId id0( 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/0"); 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const invalidation::ObjectId id3( 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ipc::invalidation::ObjectSource::CHROME_PUSH_MESSAGING, 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "U/dddddddddddddddddddddddddddddddd/3"); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The first received invalidation should get through. 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ObjectIdInvalidationMap map1; 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) map1.Insert(syncer::Invalidation::Init(id0, 5, "5")); 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "5")); 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handler_->OnIncomingInvalidation(map1); 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Mock::VerifyAndClearExpectations(&delegate_); 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invalid versions are always allowed through. 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ObjectIdInvalidationMap map2; 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) map2.Insert(syncer::Invalidation::InitUnknownVersion(id0)); 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "")); 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handler_->OnIncomingInvalidation(map2); 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Mock::VerifyAndClearExpectations(&delegate_); 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // An older version should not make it through. 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ObjectIdInvalidationMap map3; 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) map3.Insert(syncer::Invalidation::Init(id0, 4, "4")); 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handler_->OnIncomingInvalidation(map3); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A newer version will make it through. 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ObjectIdInvalidationMap map4; 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) map4.Insert(syncer::Invalidation::Init(id0, 6, "6")); 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 0, "6")); 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handler_->OnIncomingInvalidation(map4); 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Mock::VerifyAndClearExpectations(&delegate_); 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // An unrelated object should be unaffected by all the above. 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::ObjectIdInvalidationMap map5; 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) map5.Insert(syncer::Invalidation::Init(id3, 1, "1")); 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(delegate_, OnMessage("dddddddddddddddddddddddddddddddd", 3, "1")); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) handler_->OnIncomingInvalidation(map5); 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Mock::VerifyAndClearExpectations(&delegate_); 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 214