1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 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) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/registration_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidation_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google/cacheinvalidation/include/invalidation-client.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fake registration manager that lets you override jitter. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeRegistrationManager : public RegistrationManager { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FakeRegistrationManager( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalidation::InvalidationClient* invalidation_client) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : RegistrationManager(invalidation_client), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jitter_(0.0) {} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeRegistrationManager() {} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetJitter(double jitter) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jitter_ = jitter; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual double GetJitter() OVERRIDE { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return jitter_; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double jitter_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeRegistrationManager); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fake invalidation client that just stores the currently-registered 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object IDs. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeInvalidationClient : public invalidation::InvalidationClient { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeInvalidationClient() {} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FakeInvalidationClient() {} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoseRegistration(const invalidation::ObjectId& oid) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsKey(registered_ids_, oid)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_ids_.erase(oid); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoseAllRegistrations() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_ids_.clear(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidation::InvalidationClient implementation. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Start() OVERRIDE {} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Stop() OVERRIDE {} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Acknowledge(const invalidation::AckHandle& handle) OVERRIDE {} 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Register(const invalidation::ObjectId& oid) OVERRIDE { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(ContainsKey(registered_ids_, oid)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_ids_.insert(oid); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Register( 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<invalidation::ObjectId>& oids) OVERRIDE { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unused for now. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Unregister(const invalidation::ObjectId& oid) OVERRIDE { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ContainsKey(registered_ids_, oid)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registered_ids_.erase(oid); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Unregister( 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<invalidation::ObjectId>& oids) OVERRIDE { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unused for now. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectIdSet& GetRegisteredIdsForTest() const { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registered_ids_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet registered_ids_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeInvalidationClient); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t kObjectIdsCount = 5; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)invalidation::ObjectId GetIdForIndex(size_t index) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char name[2] = "a"; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name[0] += static_cast<char>(index); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return invalidation::ObjectId(1 + index, name); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObjectIdSet GetSequenceOfIdsStartingAt(size_t start, size_t count) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = start; i < start + count; ++i) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids.insert(GetIdForIndex(i)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ids; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ObjectIdSet GetSequenceOfIds(size_t count) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetSequenceOfIdsStartingAt(0, count); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExpectPendingRegistrations( 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectIdSet& expected_pending_ids, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double expected_delay_seconds, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RegistrationManager::PendingRegistrationMap& pending_registrations) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet pending_ids; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RegistrationManager::PendingRegistrationMap::const_iterator it = 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_registrations.begin(); it != pending_registrations.end(); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(ObjectIdToString(it->first)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_ids.insert(it->first); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta offset = 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second.last_registration_request - 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it->second.registration_attempt; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta expected_delay = 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromSeconds( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int64>(expected_delay_seconds)) + offset; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(akalin): Add base::PrintTo() for base::Time and 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // base::TimeDeltas. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_delay, it->second.delay) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << expected_delay.InMicroseconds() 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << ", " << it->second.delay.InMicroseconds(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->second.delay <= base::TimeDelta()) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(base::TimeDelta(), it->second.actual_delay); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(it->second.actual_delay, it->second.delay); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_pending_ids, pending_ids); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RegistrationManagerTest : public testing::Test { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManagerTest() 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : fake_registration_manager_(&fake_invalidation_client_) {} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~RegistrationManagerTest() {} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoseRegistrations(const ObjectIdSet& oids) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ObjectIdSet::const_iterator it = oids.begin(); it != oids.end(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_invalidation_client_.LoseRegistration(*it); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.MarkRegistrationLost(*it); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableIds(const ObjectIdSet& oids) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (ObjectIdSet::const_iterator it = oids.begin(); it != oids.end(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_invalidation_client_.LoseRegistration(*it); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.DisableId(*it); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used by MarkRegistrationLostBackoff* tests. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunBackoffTest(double jitter) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.SetJitter(jitter); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids = GetSequenceOfIds(kObjectIdsCount); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lose some ids. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet lost_ids = GetSequenceOfIds(2); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, 0.0, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger another failure to start delaying. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double scaled_jitter = 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jitter * RegistrationManager::kRegistrationDelayMaxJitter; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double expected_delay = 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::kInitialRegistrationDelaySeconds * 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (1.0 + scaled_jitter); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_delay = std::floor(expected_delay); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, expected_delay, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger another failure. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_delay *= 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::kRegistrationDelayExponent + scaled_jitter; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_delay = std::floor(expected_delay); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, expected_delay, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger enough failures to hit the ceiling. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (expected_delay < RegistrationManager::kMaxRegistrationDelaySeconds) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_delay *= 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::kRegistrationDelayExponent + scaled_jitter; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_delay = std::floor(expected_delay); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::kMaxRegistrationDelaySeconds, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeInvalidationClient fake_invalidation_client_; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeRegistrationManager fake_registration_manager_; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needed by timers in RegistrationManager. 230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop message_loop_; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RegistrationManagerTest); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Basic test of UpdateRegisteredIds to make sure we properly register 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new IDs and unregister any IDs no longer in the set. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, UpdateRegisteredIds) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids = GetSequenceOfIds(kObjectIdsCount - 1); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_registration_manager_.GetRegisteredIdsForTest().empty()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_invalidation_client_.GetRegisteredIdsForTest().empty()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet expected_unregistered_ids; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet unregistered_ids = 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_unregistered_ids, unregistered_ids); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_registration_manager_.GetRegisteredIdsForTest()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_invalidation_client_.GetRegisteredIdsForTest()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids.insert(GetIdForIndex(kObjectIdsCount - 1)); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids.erase(GetIdForIndex(kObjectIdsCount - 2)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unregistered_ids = fake_registration_manager_.UpdateRegisteredIds(ids); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_unregistered_ids.insert(GetIdForIndex(kObjectIdsCount - 2)); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_unregistered_ids, unregistered_ids); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_registration_manager_.GetRegisteredIdsForTest()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_invalidation_client_.GetRegisteredIdsForTest()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetRoundedBackoff(double retry_interval, double jitter) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const double kInitialRetryInterval = 3.0; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const double kMinRetryInterval = 2.0; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const double kMaxRetryInterval = 20.0; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const double kBackoffExponent = 2.0; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const double kMaxJitter = 0.5; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>( 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::CalculateBackoff(retry_interval, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInitialRetryInterval, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMinRetryInterval, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxRetryInterval, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBackoffExponent, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jitter, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxJitter)); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, CalculateBackoff) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test initial. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, GetRoundedBackoff(0.0, -1.0)); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRoundedBackoff(0.0, 0.0)); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRoundedBackoff(0.0, +1.0)); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test non-initial. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRoundedBackoff(3.0, -1.0)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(6, GetRoundedBackoff(3.0, 0.0)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, GetRoundedBackoff(3.0, +1.0)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, GetRoundedBackoff(5.0, -1.0)); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10, GetRoundedBackoff(5.0, 0.0)); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(12, GetRoundedBackoff(5.0, +1.0)); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test ceiling. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(19, GetRoundedBackoff(13.0, -1.0)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, GetRoundedBackoff(13.0, 0.0)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(20, GetRoundedBackoff(13.0, +1.0)); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Losing a registration should queue automatic re-registration. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, MarkRegistrationLost) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids = GetSequenceOfIds(kObjectIdsCount); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest().empty()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lose some ids. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet lost_ids = GetSequenceOfIds(3); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet non_lost_ids = GetSequenceOfIdsStartingAt(3, kObjectIdsCount - 3); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, 0.0, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(non_lost_ids, fake_registration_manager_.GetRegisteredIdsForTest()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(non_lost_ids, fake_invalidation_client_.GetRegisteredIdsForTest()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend we waited long enough to re-register. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_registration_manager_.GetRegisteredIdsForTest()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_invalidation_client_.GetRegisteredIdsForTest()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, MarkRegistrationLostBackoffLow) { 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunBackoffTest(-1.0); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, MarkRegistrationLostBackoffMid) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunBackoffTest(0.0); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, MarkRegistrationLostBackoffHigh) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunBackoffTest(+1.0); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exponential backoff on lost registrations should be reset to zero if 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UpdateRegisteredIds is called. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, MarkRegistrationLostBackoffReset) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids = GetSequenceOfIds(kObjectIdsCount); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lose some ids. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet lost_ids = GetSequenceOfIds(2); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, 0.0, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger another failure to start delaying. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoseRegistrations(lost_ids); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double expected_delay = 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::kInitialRegistrationDelaySeconds; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lost_ids, expected_delay, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set ids again. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet(), 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.0, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, MarkAllRegistrationsLost) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids = GetSequenceOfIds(kObjectIdsCount); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_invalidation_client_.LoseAllRegistrations(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.MarkAllRegistrationsLost(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_registration_manager_.GetRegisteredIdsForTest().empty()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(fake_invalidation_client_.GetRegisteredIdsForTest().empty()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids, 0.0, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger another failure to start delaying. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_invalidation_client_.LoseAllRegistrations(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.MarkAllRegistrationsLost(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double expected_delay = 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistrationManager::kInitialRegistrationDelaySeconds; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ids, expected_delay, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend we waited long enough to re-register. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.FirePendingRegistrationsForTest(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_registration_manager_.GetRegisteredIdsForTest()); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ids, fake_invalidation_client_.GetRegisteredIdsForTest()); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IDs that are disabled should not be re-registered by UpdateRegisteredIds or 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// automatic re-registration if that registration is lost. 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RegistrationManagerTest, DisableId) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet ids = GetSequenceOfIds(kObjectIdsCount); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest().empty()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable some ids. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet disabled_ids = GetSequenceOfIds(3); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet enabled_ids = GetSequenceOfIdsStartingAt(3, kObjectIdsCount - 3); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DisableIds(disabled_ids); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet(), 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.0, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(enabled_ids, fake_registration_manager_.GetRegisteredIdsForTest()); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(enabled_ids, fake_invalidation_client_.GetRegisteredIdsForTest()); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.UpdateRegisteredIds(ids); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(enabled_ids, fake_registration_manager_.GetRegisteredIdsForTest()); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.MarkRegistrationLost( 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disabled_ids.begin()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectIdSet(), 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.0, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.MarkAllRegistrationsLost(); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectPendingRegistrations( 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enabled_ids, 0.0, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fake_registration_manager_.GetPendingRegistrationsForTest()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 434