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