Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <set> | |
| 5 #include "base/basictypes.h" | 6 #include "base/basictypes.h" |
| 6 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 7 #include "chrome/browser/sync/sync_ui_util.h" | 8 #include "chrome/browser/sync/sync_ui_util.h" |
| 8 #include "chrome/browser/sync/profile_sync_service_mock.h" | 9 #include "chrome/browser/sync/profile_sync_service_mock.h" |
| 9 #include "content/browser/browser_thread.h" | 10 #include "content/browser/browser_thread.h" |
| 10 #include "testing/gmock/include/gmock/gmock.h" | 11 #include "testing/gmock/include/gmock/gmock.h" |
| 11 #include "testing/gmock/include/gmock/gmock-actions.h" | 12 #include "testing/gmock/include/gmock/gmock-actions.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 14 |
| 14 using ::testing::Return; | 15 using ::testing::Return; |
| 16 using ::testing::ReturnRef; | |
| 15 using ::testing::NiceMock; | 17 using ::testing::NiceMock; |
| 16 | 18 |
| 19 // A number of distinct states of the ProfileSyncService can be generated for | |
| 20 // tests. | |
| 21 enum DistinctState { | |
| 22 STATUS_CASE__SETUP_IN_PROGRESS, | |
|
akalin
2011/10/28 19:10:22
why two underscores? don't care much either way,
jimblackler
2011/11/01 16:15:30
Done.
| |
| 23 STATUS_CASE__SETUP_ERROR, | |
| 24 STATUS_CASE__AUTHENTICATING, | |
| 25 STATUS_CASE__AUTH_ERROR, | |
| 26 STATUS_CASE__PROTOCOL_ERROR, | |
| 27 STATUS_CASE__PASSPHRASE_ERROR, | |
| 28 STATUS_CASE__SYNCED, | |
| 29 NUMBER_OF_STATUS_CASES | |
| 30 }; | |
| 31 | |
| 17 namespace { | 32 namespace { |
| 18 | 33 |
| 19 // Utility function to test that GetStatusLabelsForSyncGlobalError returns | 34 // Utility function to test that GetStatusLabelsForSyncGlobalError returns |
| 20 // the correct results for the given states. | 35 // the correct results for the given states. |
| 21 void VerifySyncGlobalErrorResult(NiceMock<ProfileSyncServiceMock>* service, | 36 void VerifySyncGlobalErrorResult(NiceMock<ProfileSyncServiceMock>* service, |
| 22 GoogleServiceAuthError::State error_state, | 37 GoogleServiceAuthError::State error_state, |
| 23 bool is_signed_in, | 38 bool is_signed_in, |
| 24 bool is_error) { | 39 bool is_error) { |
| 25 GoogleServiceAuthError auth_error(error_state); | 40 GoogleServiceAuthError auth_error(error_state); |
| 26 service->UpdateAuthErrorState(auth_error); | 41 service->UpdateAuthErrorState(auth_error); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 { GoogleServiceAuthError::HOSTED_NOT_ALLOWED, true }, | 132 { GoogleServiceAuthError::HOSTED_NOT_ALLOWED, true }, |
| 118 }; | 133 }; |
| 119 | 134 |
| 120 for (size_t i = 0; i < sizeof(table)/sizeof(*table); ++i) { | 135 for (size_t i = 0; i < sizeof(table)/sizeof(*table); ++i) { |
| 121 VerifySyncGlobalErrorResult( | 136 VerifySyncGlobalErrorResult( |
| 122 &service, table[i].error_state, true, table[i].is_error); | 137 &service, table[i].error_state, true, table[i].is_error); |
| 123 VerifySyncGlobalErrorResult( | 138 VerifySyncGlobalErrorResult( |
| 124 &service, table[i].error_state, false, false); | 139 &service, table[i].error_state, false, false); |
| 125 } | 140 } |
| 126 } | 141 } |
| 142 // Loads a ProfileSyncServiceMock to emulate one of a number of distinct cases | |
| 143 // in order to perform tests on the generated messages. | |
| 144 void GetDistinctCase(ProfileSyncServiceMock& service, | |
| 145 GoogleServiceAuthError** auth_error, | |
| 146 int caseNumber) { | |
| 147 // Auth Error object is returned by reference in mock and needs to stay in | |
| 148 // scope throughout test, so it is owned by calling method. However it is | |
| 149 // immutable so can only be allocated in this method. | |
| 150 switch (caseNumber) { | |
| 151 case STATUS_CASE__SETUP_IN_PROGRESS: { | |
| 152 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 153 .WillOnce(Return(false)); | |
| 154 EXPECT_CALL(service, SetupInProgress()) | |
| 155 .WillOnce(Return(true)); | |
| 156 browser_sync::SyncBackendHost::Status status; | |
| 157 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 158 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 159 .WillOnce(Return(status)); | |
| 160 *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE); | |
| 161 EXPECT_CALL(service, GetAuthError()) | |
| 162 .WillOnce(ReturnRef(**auth_error)); | |
| 163 EXPECT_CALL(service, UIShouldDepictAuthInProgress()) | |
| 164 .WillOnce(Return(false)); | |
| 165 return; | |
| 166 } | |
| 167 case STATUS_CASE__SETUP_ERROR: { | |
| 168 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 169 .WillOnce(Return(false)); | |
| 170 EXPECT_CALL(service, SetupInProgress()) | |
| 171 .WillOnce(Return(false)); | |
| 172 EXPECT_CALL(service, unrecoverable_error_detected()) | |
| 173 .WillOnce(Return(true)); | |
| 174 browser_sync::SyncBackendHost::Status status; | |
| 175 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 176 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 177 .WillOnce(Return(status)); | |
| 178 return; | |
| 179 } | |
| 180 case STATUS_CASE__AUTHENTICATING: { | |
| 181 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 182 .WillOnce(Return(true)); | |
| 183 browser_sync::SyncBackendHost::Status status; | |
| 184 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 185 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 186 .WillOnce(Return(status)); | |
| 187 EXPECT_CALL(service, UIShouldDepictAuthInProgress()) | |
| 188 .WillOnce(Return(true)); | |
| 189 *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE); | |
| 190 EXPECT_CALL(service, GetAuthError()) | |
| 191 .WillOnce(ReturnRef(**auth_error)); | |
| 192 return; | |
| 193 } | |
| 194 case STATUS_CASE__AUTH_ERROR: { | |
| 195 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 196 .WillOnce(Return(true)); | |
| 197 browser_sync::SyncBackendHost::Status status; | |
| 198 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 199 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 200 .WillOnce(Return(status)); | |
| 201 *auth_error = new GoogleServiceAuthError( | |
| 202 GoogleServiceAuthError::SERVICE_UNAVAILABLE); | |
| 203 EXPECT_CALL(service, GetAuthenticatedUsername()) | |
| 204 .WillOnce(Return(ASCIIToUTF16(""))); | |
| 205 EXPECT_CALL(service, GetAuthError()) | |
| 206 .WillOnce(ReturnRef(**auth_error)); | |
| 207 EXPECT_CALL(service, UIShouldDepictAuthInProgress()) | |
| 208 .WillOnce(Return(false)); | |
| 209 return; | |
| 210 } | |
| 211 case STATUS_CASE__PROTOCOL_ERROR: { | |
| 212 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 213 .WillOnce(Return(true)); | |
| 214 browser_sync::SyncProtocolError protocolError; | |
| 215 protocolError.action = browser_sync::STOP_AND_RESTART_SYNC; | |
| 216 browser_sync::SyncBackendHost::Status status; | |
| 217 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 218 status.sync_protocol_error = protocolError; | |
| 219 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 220 .WillOnce(Return(status)); | |
| 221 *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE); | |
| 222 EXPECT_CALL(service, GetAuthError()) | |
| 223 .WillOnce(ReturnRef(**auth_error)); | |
| 224 EXPECT_CALL(service, UIShouldDepictAuthInProgress()) | |
| 225 .WillOnce(Return(false)); | |
| 226 return; | |
| 227 } | |
| 228 case STATUS_CASE__PASSPHRASE_ERROR: { | |
| 229 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 230 .WillOnce(Return(true)); | |
| 231 browser_sync::SyncBackendHost::Status status; | |
| 232 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 233 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 234 .WillOnce(Return(status)); | |
| 235 *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE); | |
| 236 EXPECT_CALL(service, GetAuthError()) | |
| 237 .WillOnce(ReturnRef(**auth_error)); | |
| 238 EXPECT_CALL(service, GetAuthenticatedUsername()) | |
| 239 .WillOnce(Return(ASCIIToUTF16("example@example.com"))); | |
| 240 EXPECT_CALL(service, UIShouldDepictAuthInProgress()) | |
| 241 .WillOnce(Return(false)); | |
| 242 EXPECT_CALL(service, IsPassphraseRequired()) | |
| 243 .WillOnce(Return(true)); | |
| 244 EXPECT_CALL(service, IsPassphraseRequiredForDecryption()) | |
| 245 .WillOnce(Return(true)); | |
| 246 return; | |
| 247 } | |
| 248 case STATUS_CASE__SYNCED: { | |
| 249 EXPECT_CALL(service, HasSyncSetupCompleted()) | |
| 250 .WillOnce(Return(true)); | |
| 251 browser_sync::SyncBackendHost::Status status; | |
| 252 status.summary = browser_sync::SyncBackendHost::Status::READY; | |
| 253 EXPECT_CALL(service, QueryDetailedSyncStatus()) | |
| 254 .WillOnce(Return(status)); | |
| 255 *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE); | |
| 256 EXPECT_CALL(service, GetAuthError()) | |
| 257 .WillOnce(ReturnRef(**auth_error)); | |
| 258 EXPECT_CALL(service, GetAuthenticatedUsername()) | |
| 259 .WillOnce(Return(ASCIIToUTF16("example@example.com"))); | |
| 260 EXPECT_CALL(service, UIShouldDepictAuthInProgress()) | |
| 261 .WillOnce(Return(false)); | |
| 262 EXPECT_CALL(service, IsPassphraseRequired()) | |
| 263 .WillOnce(Return(false)); | |
| 264 return; | |
| 265 } | |
| 266 default: | |
| 267 NOTREACHED(); | |
| 268 } | |
| 269 } | |
| 270 | |
| 271 // This test ensures that a each distinctive ProfileSyncService statuses | |
| 272 // will return a unique combination of status and link messages from | |
| 273 // GetStatusLabels(). | |
| 274 TEST(SyncUIUtilTest, DistinctCasesReportUniqueMessageSets) { | |
| 275 ProfileSyncServiceMock service; | |
| 276 | |
| 277 std::set<string16> messages; | |
| 278 for (int idx = 0; idx != NUMBER_OF_STATUS_CASES; idx++) { | |
| 279 ProfileSyncServiceMock service; | |
| 280 GoogleServiceAuthError* auth_error = NULL; | |
| 281 GetDistinctCase(service, &auth_error, idx); | |
| 282 string16 status_label; | |
| 283 string16 link_label; | |
| 284 sync_ui_util::GetStatusLabels(&service, | |
| 285 &status_label, | |
| 286 &link_label, | |
| 287 true); | |
| 288 // If the status and link message combination is already present in the set | |
| 289 // of messages already seen, this is a duplicate rather than a unique | |
| 290 // message, and the test has failed. | |
| 291 string16 combined_label = | |
| 292 status_label + string16(ASCIIToUTF16("#")) + link_label; | |
| 293 EXPECT_EQ(messages.find(combined_label), messages.end()); | |
| 294 messages.insert(combined_label); | |
| 295 if (auth_error) | |
| 296 delete auth_error; | |
| 297 } | |
| 298 } | |
| 299 | |
| 300 // This test ensures that the html_links parameter on GetStatusLabels() is | |
| 301 // honored. | |
| 302 TEST(SyncUIUtilTest, HtmlNotIncludedInStatusIfNotRequested) { | |
| 303 ProfileSyncServiceMock service; | |
| 304 for (int idx = 0; idx != NUMBER_OF_STATUS_CASES; idx++) { | |
| 305 ProfileSyncServiceMock service; | |
| 306 GoogleServiceAuthError* auth_error = NULL; | |
| 307 GetDistinctCase(service, &auth_error, idx); | |
| 308 string16 status_label; | |
| 309 string16 link_label; | |
| 310 sync_ui_util::GetStatusLabels(&service, | |
| 311 &status_label, | |
| 312 &link_label, | |
| 313 false); | |
| 314 // Ensures a search for string 'href' (found in links, not a string to be | |
| 315 // found in an English language message) fails when links are excluded from | |
| 316 // the status label. | |
| 317 EXPECT_EQ(status_label.find(string16(ASCIIToUTF16("href"))), | |
| 318 string16::npos); | |
| 319 if (auth_error) { | |
| 320 delete auth_error; | |
| 321 } | |
| 322 } | |
| 323 } | |
| OLD | NEW |