1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file.
41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/mock_ack_handler.h"
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/ack_handle.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidation.h"
101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace syncer {
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace {
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)struct AckHandleMatcher {
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AckHandleMatcher(const AckHandle& handle);
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool operator()(const syncer::Invalidation& invalidation) const;
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  syncer::AckHandle handle_;
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AckHandleMatcher::AckHandleMatcher(const AckHandle& handle)
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  : handle_(handle) {}
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AckHandleMatcher::operator()(
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const syncer::Invalidation& invalidation) const {
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return handle_.Equals(invalidation.ack_handle());
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)MockAckHandler::MockAckHandler() {}
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)MockAckHandler::~MockAckHandler() {}
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::RegisterInvalidation(Invalidation* invalidation) {
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  unacked_invalidations_.push_back(*invalidation);
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  invalidation->SetAckHandler(AsWeakPtr(), base::MessageLoopProxy::current());
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::RegisterUnsentInvalidation(Invalidation* invalidation) {
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  unsent_invalidations_.push_back(*invalidation);
431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool MockAckHandler::IsUnacked(const Invalidation& invalidation) const {
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AckHandleMatcher matcher(invalidation.ack_handle());
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InvalidationVector::const_iterator it = std::find_if(
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unacked_invalidations_.begin(),
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unacked_invalidations_.end(),
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      matcher);
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return it != unacked_invalidations_.end();
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MockAckHandler::IsAcknowledged(const Invalidation& invalidation) const {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AckHandleMatcher matcher(invalidation.ack_handle());
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InvalidationVector::const_iterator it = std::find_if(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      acked_invalidations_.begin(),
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      acked_invalidations_.end(),
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      matcher);
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return it != acked_invalidations_.end();
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MockAckHandler::IsDropped(const Invalidation& invalidation) const {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AckHandleMatcher matcher(invalidation.ack_handle());
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InvalidationVector::const_iterator it = std::find_if(
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dropped_invalidations_.begin(),
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dropped_invalidations_.end(),
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      matcher);
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return it != dropped_invalidations_.end();
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool MockAckHandler::IsUnsent(const Invalidation& invalidation) const {
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AckHandleMatcher matcher(invalidation.ack_handle());
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InvalidationVector::const_iterator it1 = std::find_if(
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unsent_invalidations_.begin(),
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unsent_invalidations_.end(),
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      matcher);
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return it1 != unsent_invalidations_.end();
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MockAckHandler::AllInvalidationsAccountedFor() const {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return unacked_invalidations_.empty() && unrecovered_drop_events_.empty();
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::Acknowledge(
861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const invalidation::ObjectId& id,
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const AckHandle& handle) {
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  AckHandleMatcher matcher(handle);
891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  InvalidationVector::iterator it = std::find_if(
901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unacked_invalidations_.begin(),
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      unacked_invalidations_.end(),
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      matcher);
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (it != unacked_invalidations_.end()) {
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    acked_invalidations_.push_back(*it);
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    unacked_invalidations_.erase(it);
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IdHandleMap::iterator it2 = unrecovered_drop_events_.find(id);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (it2 != unrecovered_drop_events_.end() && it2->second.Equals(handle)) {
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    unrecovered_drop_events_.erase(it2);
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::Drop(
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const invalidation::ObjectId& id,
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const AckHandle& handle) {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AckHandleMatcher matcher(handle);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InvalidationVector::iterator it = std::find_if(
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      unacked_invalidations_.begin(),
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      unacked_invalidations_.end(),
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      matcher);
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (it != unacked_invalidations_.end()) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dropped_invalidations_.push_back(*it);
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    unacked_invalidations_.erase(it);
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  unrecovered_drop_events_.erase(id);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  unrecovered_drop_events_.insert(std::make_pair(id, handle));
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}  // namespace syncer
121