fake_ack_handler.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/invalidation/impl/fake_ack_handler.h"
  5. #include <algorithm>
  6. #include "base/threading/thread_task_runner_handle.h"
  7. #include "components/invalidation/public/ack_handle.h"
  8. #include "components/invalidation/public/invalidation.h"
  9. namespace invalidation {
  10. namespace {
  11. struct AckHandleMatcher {
  12. explicit AckHandleMatcher(const AckHandle& handle);
  13. bool operator()(const Invalidation& invalidation) const;
  14. AckHandle handle_;
  15. };
  16. AckHandleMatcher::AckHandleMatcher(const AckHandle& handle) : handle_(handle) {}
  17. bool AckHandleMatcher::operator()(const Invalidation& invalidation) const {
  18. return handle_.Equals(invalidation.ack_handle());
  19. }
  20. } // namespace
  21. FakeAckHandler::FakeAckHandler() = default;
  22. FakeAckHandler::~FakeAckHandler() = default;
  23. void FakeAckHandler::RegisterInvalidation(Invalidation* invalidation) {
  24. unacked_invalidations_.push_back(*invalidation);
  25. invalidation->SetAckHandler(AsWeakPtr(), base::ThreadTaskRunnerHandle::Get());
  26. }
  27. void FakeAckHandler::RegisterUnsentInvalidation(Invalidation* invalidation) {
  28. unsent_invalidations_.push_back(*invalidation);
  29. }
  30. bool FakeAckHandler::IsUnacked(const Invalidation& invalidation) const {
  31. AckHandleMatcher matcher(invalidation.ack_handle());
  32. auto it = std::find_if(unacked_invalidations_.begin(),
  33. unacked_invalidations_.end(), matcher);
  34. return it != unacked_invalidations_.end();
  35. }
  36. bool FakeAckHandler::IsAcknowledged(const Invalidation& invalidation) const {
  37. AckHandleMatcher matcher(invalidation.ack_handle());
  38. auto it = std::find_if(acked_invalidations_.begin(),
  39. acked_invalidations_.end(), matcher);
  40. return it != acked_invalidations_.end();
  41. }
  42. bool FakeAckHandler::IsDropped(const Invalidation& invalidation) const {
  43. AckHandleMatcher matcher(invalidation.ack_handle());
  44. auto it = std::find_if(dropped_invalidations_.begin(),
  45. dropped_invalidations_.end(), matcher);
  46. return it != dropped_invalidations_.end();
  47. }
  48. bool FakeAckHandler::IsUnsent(const Invalidation& invalidation) const {
  49. AckHandleMatcher matcher(invalidation.ack_handle());
  50. auto it1 = std::find_if(unsent_invalidations_.begin(),
  51. unsent_invalidations_.end(), matcher);
  52. return it1 != unsent_invalidations_.end();
  53. }
  54. bool FakeAckHandler::AllInvalidationsAccountedFor() const {
  55. return unacked_invalidations_.empty() && unrecovered_drop_events_.empty();
  56. }
  57. void FakeAckHandler::Acknowledge(const Topic& topic, const AckHandle& handle) {
  58. AckHandleMatcher matcher(handle);
  59. auto it = std::find_if(unacked_invalidations_.begin(),
  60. unacked_invalidations_.end(), matcher);
  61. if (it != unacked_invalidations_.end()) {
  62. acked_invalidations_.push_back(*it);
  63. unacked_invalidations_.erase(it);
  64. }
  65. auto it2 = unrecovered_drop_events_.find(topic);
  66. if (it2 != unrecovered_drop_events_.end() && it2->second.Equals(handle)) {
  67. unrecovered_drop_events_.erase(it2);
  68. }
  69. }
  70. void FakeAckHandler::Drop(const Topic& topic, const AckHandle& handle) {
  71. AckHandleMatcher matcher(handle);
  72. auto it = std::find_if(unacked_invalidations_.begin(),
  73. unacked_invalidations_.end(), matcher);
  74. if (it != unacked_invalidations_.end()) {
  75. dropped_invalidations_.push_back(*it);
  76. unacked_invalidations_.erase(it);
  77. }
  78. unrecovered_drop_events_.erase(topic);
  79. unrecovered_drop_events_.emplace(topic, handle);
  80. }
  81. } // namespace invalidation