OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync/test/integration/quiesce_status_change_checker.h" | 5 #include "chrome/browser/sync/test/integration/quiesce_status_change_checker.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/scoped_observer.h" | 10 #include "base/scoped_observer.h" |
11 #include "base/strings/string_number_conversions.h" | 11 #include "base/strings/string_number_conversions.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "components/browser_sync/profile_sync_service.h" | 13 #include "components/browser_sync/profile_sync_service.h" |
14 #include "components/sync/engine/cycle/sync_cycle_snapshot.h" | 14 #include "components/sync/engine/cycle/sync_cycle_snapshot.h" |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 // Returns true if this service is disabled. | 18 // Returns true if this service is disabled. |
19 bool IsSyncDisabled(ProfileSyncService* service) { | 19 bool IsSyncDisabled(browser_sync::ProfileSyncService* service) { |
20 return !service->IsSetupInProgress() && !service->IsFirstSetupComplete(); | 20 return !service->IsSetupInProgress() && !service->IsFirstSetupComplete(); |
21 } | 21 } |
22 | 22 |
23 // Returns true if these services have matching progress markers. | 23 // Returns true if these services have matching progress markers. |
24 bool ProgressMarkersMatch(const ProfileSyncService* service1, | 24 bool ProgressMarkersMatch(const browser_sync::ProfileSyncService* service1, |
25 const ProfileSyncService* service2) { | 25 const browser_sync::ProfileSyncService* service2) { |
26 const syncer::ModelTypeSet common_types = | 26 const syncer::ModelTypeSet common_types = |
27 Intersection(service1->GetActiveDataTypes(), | 27 Intersection(service1->GetActiveDataTypes(), |
28 service2->GetActiveDataTypes()); | 28 service2->GetActiveDataTypes()); |
29 | 29 |
30 const syncer::SyncCycleSnapshot& snap1 = service1->GetLastCycleSnapshot(); | 30 const syncer::SyncCycleSnapshot& snap1 = service1->GetLastCycleSnapshot(); |
31 const syncer::SyncCycleSnapshot& snap2 = service2->GetLastCycleSnapshot(); | 31 const syncer::SyncCycleSnapshot& snap2 = service2->GetLastCycleSnapshot(); |
32 | 32 |
33 for (syncer::ModelTypeSet::Iterator type_it = common_types.First(); | 33 for (syncer::ModelTypeSet::Iterator type_it = common_types.First(); |
34 type_it.Good(); type_it.Inc()) { | 34 type_it.Good(); type_it.Inc()) { |
35 // Look up the progress markers. Fail if either one is missing. | 35 // Look up the progress markers. Fail if either one is missing. |
(...skipping 27 matching lines...) Expand all Loading... |
63 // safest time to check it is when the ProfileSyncService emits an | 63 // safest time to check it is when the ProfileSyncService emits an |
64 // OnStateChanged() event. This class waits for those events and updates its | 64 // OnStateChanged() event. This class waits for those events and updates its |
65 // cached HasLatestProgressMarkers state every time that event occurs. | 65 // cached HasLatestProgressMarkers state every time that event occurs. |
66 // | 66 // |
67 // See the comments in UpdatedProgressMarkerChecker for more details. | 67 // See the comments in UpdatedProgressMarkerChecker for more details. |
68 // | 68 // |
69 // The long-term plan is to deprecate this hack by replacing all its usees with | 69 // The long-term plan is to deprecate this hack by replacing all its usees with |
70 // more reliable status checkers. | 70 // more reliable status checkers. |
71 class ProgressMarkerWatcher : public sync_driver::SyncServiceObserver { | 71 class ProgressMarkerWatcher : public sync_driver::SyncServiceObserver { |
72 public: | 72 public: |
73 ProgressMarkerWatcher( | 73 ProgressMarkerWatcher(browser_sync::ProfileSyncService* service, |
74 ProfileSyncService* service, | 74 QuiesceStatusChangeChecker* quiesce_checker); |
75 QuiesceStatusChangeChecker* quiesce_checker); | |
76 ~ProgressMarkerWatcher() override; | 75 ~ProgressMarkerWatcher() override; |
77 void OnStateChanged() override; | 76 void OnStateChanged() override; |
78 | 77 |
79 bool HasLatestProgressMarkers(); | 78 bool HasLatestProgressMarkers(); |
80 bool IsSyncDisabled(); | 79 bool IsSyncDisabled(); |
81 | 80 |
82 private: | 81 private: |
83 void UpdateHasLatestProgressMarkers(); | 82 void UpdateHasLatestProgressMarkers(); |
84 | 83 |
85 ProfileSyncService* service_; | 84 browser_sync::ProfileSyncService* service_; |
86 QuiesceStatusChangeChecker* quiesce_checker_; | 85 QuiesceStatusChangeChecker* quiesce_checker_; |
87 ScopedObserver<ProfileSyncService, ProgressMarkerWatcher> scoped_observer_; | 86 ScopedObserver<browser_sync::ProfileSyncService, ProgressMarkerWatcher> |
| 87 scoped_observer_; |
88 bool probably_has_latest_progress_markers_; | 88 bool probably_has_latest_progress_markers_; |
89 }; | 89 }; |
90 | 90 |
91 ProgressMarkerWatcher::ProgressMarkerWatcher( | 91 ProgressMarkerWatcher::ProgressMarkerWatcher( |
92 ProfileSyncService* service, | 92 browser_sync::ProfileSyncService* service, |
93 QuiesceStatusChangeChecker* quiesce_checker) | 93 QuiesceStatusChangeChecker* quiesce_checker) |
94 : service_(service), | 94 : service_(service), |
95 quiesce_checker_(quiesce_checker), | 95 quiesce_checker_(quiesce_checker), |
96 scoped_observer_(this), | 96 scoped_observer_(this), |
97 probably_has_latest_progress_markers_(false) { | 97 probably_has_latest_progress_markers_(false) { |
98 scoped_observer_.Add(service); | 98 scoped_observer_.Add(service); |
99 UpdateHasLatestProgressMarkers(); | 99 UpdateHasLatestProgressMarkers(); |
100 } | 100 } |
101 | 101 |
102 ProgressMarkerWatcher::~ProgressMarkerWatcher() { } | 102 ProgressMarkerWatcher::~ProgressMarkerWatcher() { } |
103 | 103 |
104 void ProgressMarkerWatcher::OnStateChanged() { | 104 void ProgressMarkerWatcher::OnStateChanged() { |
105 UpdateHasLatestProgressMarkers(); | 105 UpdateHasLatestProgressMarkers(); |
106 quiesce_checker_->OnServiceStateChanged(service_); | 106 quiesce_checker_->OnServiceStateChanged(service_); |
107 } | 107 } |
(...skipping 28 matching lines...) Expand all Loading... |
136 | 136 |
137 bool ProgressMarkerWatcher::HasLatestProgressMarkers() { | 137 bool ProgressMarkerWatcher::HasLatestProgressMarkers() { |
138 return probably_has_latest_progress_markers_; | 138 return probably_has_latest_progress_markers_; |
139 } | 139 } |
140 | 140 |
141 bool ProgressMarkerWatcher::IsSyncDisabled() { | 141 bool ProgressMarkerWatcher::IsSyncDisabled() { |
142 return ::IsSyncDisabled(service_); | 142 return ::IsSyncDisabled(service_); |
143 } | 143 } |
144 | 144 |
145 QuiesceStatusChangeChecker::QuiesceStatusChangeChecker( | 145 QuiesceStatusChangeChecker::QuiesceStatusChangeChecker( |
146 std::vector<ProfileSyncService*> services) | 146 std::vector<browser_sync::ProfileSyncService*> services) |
147 : services_(services) { | 147 : services_(services) { |
148 DCHECK_LE(1U, services_.size()); | 148 DCHECK_LE(1U, services_.size()); |
149 for (size_t i = 0; i < services_.size(); ++i) { | 149 for (size_t i = 0; i < services_.size(); ++i) { |
150 observers_.push_back(new ProgressMarkerWatcher(services[i], this)); | 150 observers_.push_back(new ProgressMarkerWatcher(services[i], this)); |
151 } | 151 } |
152 } | 152 } |
153 | 153 |
154 QuiesceStatusChangeChecker::~QuiesceStatusChangeChecker() {} | 154 QuiesceStatusChangeChecker::~QuiesceStatusChangeChecker() {} |
155 | 155 |
156 void QuiesceStatusChangeChecker::Wait() { | 156 void QuiesceStatusChangeChecker::Wait() { |
157 DVLOG(1) << "Await: " << GetDebugMessage(); | 157 DVLOG(1) << "Await: " << GetDebugMessage(); |
(...skipping 13 matching lines...) Expand all Loading... |
171 if ((*it)->IsSyncDisabled()) { | 171 if ((*it)->IsSyncDisabled()) { |
172 continue; // Skip disabled services. | 172 continue; // Skip disabled services. |
173 } | 173 } |
174 | 174 |
175 if (!(*it)->HasLatestProgressMarkers()) { | 175 if (!(*it)->HasLatestProgressMarkers()) { |
176 DVLOG(1) << "Not quiesced: Progress markers are old."; | 176 DVLOG(1) << "Not quiesced: Progress markers are old."; |
177 return false; | 177 return false; |
178 } | 178 } |
179 } | 179 } |
180 | 180 |
181 std::vector<ProfileSyncService*> enabled_services; | 181 std::vector<browser_sync::ProfileSyncService*> enabled_services; |
182 for (std::vector<ProfileSyncService*>::const_iterator it = services_.begin(); | 182 for (std::vector<browser_sync::ProfileSyncService*>::const_iterator it = |
| 183 services_.begin(); |
183 it != services_.end(); ++it) { | 184 it != services_.end(); ++it) { |
184 if (!IsSyncDisabled(*it)) { | 185 if (!IsSyncDisabled(*it)) { |
185 enabled_services.push_back(*it); | 186 enabled_services.push_back(*it); |
186 } | 187 } |
187 } | 188 } |
188 | 189 |
189 // Return true if we have nothing to compare against. | 190 // Return true if we have nothing to compare against. |
190 if (enabled_services.size() <= 1) { | 191 if (enabled_services.size() <= 1) { |
191 return true; | 192 return true; |
192 } | 193 } |
193 | 194 |
194 std::vector<ProfileSyncService*>::const_iterator it1 = | 195 std::vector<browser_sync::ProfileSyncService*>::const_iterator it1 = |
195 enabled_services.begin(); | 196 enabled_services.begin(); |
196 std::vector<ProfileSyncService*>::const_iterator it2 = | 197 std::vector<browser_sync::ProfileSyncService*>::const_iterator it2 = |
197 enabled_services.begin(); | 198 enabled_services.begin(); |
198 it2++; | 199 it2++; |
199 | 200 |
200 while (it2 != enabled_services.end()) { | 201 while (it2 != enabled_services.end()) { |
201 // Return false if there is a progress marker mismatch. | 202 // Return false if there is a progress marker mismatch. |
202 if (!ProgressMarkersMatch(*it1, *it2)) { | 203 if (!ProgressMarkersMatch(*it1, *it2)) { |
203 DVLOG(1) << "Not quiesced: Progress marker mismatch."; | 204 DVLOG(1) << "Not quiesced: Progress marker mismatch."; |
204 return false; | 205 return false; |
205 } | 206 } |
206 it1++; | 207 it1++; |
207 it2++; | 208 it2++; |
208 } | 209 } |
209 | 210 |
210 return true; | 211 return true; |
211 } | 212 } |
212 | 213 |
213 std::string QuiesceStatusChangeChecker::GetDebugMessage() const { | 214 std::string QuiesceStatusChangeChecker::GetDebugMessage() const { |
214 return base::StringPrintf("Waiting for quiescence of %" PRIuS " clients", | 215 return base::StringPrintf("Waiting for quiescence of %" PRIuS " clients", |
215 services_.size()); | 216 services_.size()); |
216 } | 217 } |
217 | 218 |
218 void QuiesceStatusChangeChecker::OnServiceStateChanged( | 219 void QuiesceStatusChangeChecker::OnServiceStateChanged( |
219 ProfileSyncService* service) { | 220 browser_sync::ProfileSyncService* service) { |
220 CheckExitCondition(); | 221 CheckExitCondition(); |
221 } | 222 } |
OLD | NEW |