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