11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 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) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "sync/notifier/mock_ack_handler.h" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "sync/internal_api/public/base/ack_handle.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "sync/internal_api/public/base/invalidation.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace syncer { 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace { 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)struct AckHandleMatcher { 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AckHandleMatcher(const AckHandle& handle); 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool operator()(const syncer::Invalidation& invalidation) const; 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) syncer::AckHandle handle_; 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)AckHandleMatcher::AckHandleMatcher(const AckHandle& handle) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : handle_(handle) {} 231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AckHandleMatcher::operator()( 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const syncer::Invalidation& invalidation) const { 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return handle_.Equals(invalidation.ack_handle()); 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)MockAckHandler::MockAckHandler() {} 321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)MockAckHandler::~MockAckHandler() {} 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::RegisterInvalidation(Invalidation* invalidation) { 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unacked_invalidations_.push_back(*invalidation); 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) invalidation->set_ack_handler(WeakHandleThis()); 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::RegisterUnsentInvalidation(Invalidation* invalidation) { 411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsent_invalidations_.push_back(*invalidation); 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool MockAckHandler::IsUnacked(const Invalidation& invalidation) const { 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AckHandleMatcher matcher(invalidation.ack_handle()); 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InvalidationVector::const_iterator it = std::find_if( 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unacked_invalidations_.begin(), 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unacked_invalidations_.end(), 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) matcher); 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return it != unacked_invalidations_.end(); 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MockAckHandler::IsAcknowledged(const Invalidation& invalidation) const { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AckHandleMatcher matcher(invalidation.ack_handle()); 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InvalidationVector::const_iterator it = std::find_if( 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) acked_invalidations_.begin(), 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) acked_invalidations_.end(), 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matcher); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return it != acked_invalidations_.end(); 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MockAckHandler::IsDropped(const Invalidation& invalidation) const { 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AckHandleMatcher matcher(invalidation.ack_handle()); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InvalidationVector::const_iterator it = std::find_if( 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dropped_invalidations_.begin(), 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dropped_invalidations_.end(), 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matcher); 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return it != dropped_invalidations_.end(); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool MockAckHandler::IsUnsent(const Invalidation& invalidation) const { 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AckHandleMatcher matcher(invalidation.ack_handle()); 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InvalidationVector::const_iterator it1 = std::find_if( 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsent_invalidations_.begin(), 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unsent_invalidations_.end(), 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) matcher); 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return it1 != unsent_invalidations_.end(); 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MockAckHandler::AllInvalidationsAccountedFor() const { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return unacked_invalidations_.empty() && unrecovered_drop_events_.empty(); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::Acknowledge( 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const invalidation::ObjectId& id, 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const AckHandle& handle) { 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) AckHandleMatcher matcher(handle); 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) InvalidationVector::iterator it = std::find_if( 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unacked_invalidations_.begin(), 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unacked_invalidations_.end(), 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) matcher); 921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (it != unacked_invalidations_.end()) { 931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) acked_invalidations_.push_back(*it); 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) unacked_invalidations_.erase(it); 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IdHandleMap::iterator it2 = unrecovered_drop_events_.find(id); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it2 != unrecovered_drop_events_.end() && it2->second.Equals(handle)) { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unrecovered_drop_events_.erase(it2); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void MockAckHandler::Drop( 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const invalidation::ObjectId& id, 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const AckHandle& handle) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AckHandleMatcher matcher(handle); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InvalidationVector::iterator it = std::find_if( 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unacked_invalidations_.begin(), 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unacked_invalidations_.end(), 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) matcher); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (it != unacked_invalidations_.end()) { 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dropped_invalidations_.push_back(*it); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unacked_invalidations_.erase(it); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unrecovered_drop_events_.erase(id); 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unrecovered_drop_events_.insert(std::make_pair(id, handle)); 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)WeakHandle<AckHandler> MockAckHandler::WeakHandleThis() { 1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return WeakHandle<AckHandler>(AsWeakPtr()); 1211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace syncer 124