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