| Index: chrome/browser/sync/sync_ui_util_unittest.cc
|
| diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc
|
| index b392ed6de6650152211a6fcb22035280a4e535e5..8fba233d8156d73967a4a6c3902c97d2693307c4 100644
|
| --- a/chrome/browser/sync/sync_ui_util_unittest.cc
|
| +++ b/chrome/browser/sync/sync_ui_util_unittest.cc
|
| @@ -2,6 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include <set>
|
| #include "base/basictypes.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "chrome/browser/sync/profile_sync_service_mock.h"
|
| @@ -12,9 +13,23 @@
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using ::testing::Return;
|
| +using ::testing::ReturnRef;
|
| using ::testing::NiceMock;
|
| using content::BrowserThread;
|
|
|
| +// A number of distinct states of the ProfileSyncService can be generated for
|
| +// tests.
|
| +enum DistinctState {
|
| + STATUS_CASE_SETUP_IN_PROGRESS,
|
| + STATUS_CASE_SETUP_ERROR,
|
| + STATUS_CASE_AUTHENTICATING,
|
| + STATUS_CASE_AUTH_ERROR,
|
| + STATUS_CASE_PROTOCOL_ERROR,
|
| + STATUS_CASE_PASSPHRASE_ERROR,
|
| + STATUS_CASE_SYNCED,
|
| + NUMBER_OF_STATUS_CASES
|
| +};
|
| +
|
| namespace {
|
|
|
| // Utility function to test that GetStatusLabelsForSyncGlobalError returns
|
| @@ -23,11 +38,9 @@ void VerifySyncGlobalErrorResult(NiceMock<ProfileSyncServiceMock>* service,
|
| GoogleServiceAuthError::State error_state,
|
| bool is_signed_in,
|
| bool is_error) {
|
| - GoogleServiceAuthError auth_error(error_state);
|
| - service->UpdateAuthErrorState(auth_error);
|
| -
|
| EXPECT_CALL(*service, HasSyncSetupCompleted())
|
| .WillRepeatedly(Return(is_signed_in));
|
| +
|
| if (error_state == GoogleServiceAuthError::SERVICE_UNAVAILABLE) {
|
| EXPECT_CALL(*service, GetAuthenticatedUsername())
|
| .WillRepeatedly(Return(UTF8ToUTF16("")));
|
| @@ -36,6 +49,9 @@ void VerifySyncGlobalErrorResult(NiceMock<ProfileSyncServiceMock>* service,
|
| .WillRepeatedly(Return(UTF8ToUTF16("foo")));
|
| }
|
|
|
| + GoogleServiceAuthError auth_error(error_state);
|
| + EXPECT_CALL(*service, GetAuthError()).WillRepeatedly(ReturnRef(auth_error));
|
| +
|
| string16 label1, label2, label3;
|
| sync_ui_util::GetStatusLabelsForSyncGlobalError(
|
| service, &label1, &label2, &label3);
|
| @@ -63,6 +79,9 @@ TEST(SyncUIUtilTest, ConstructAboutInformationWithUnrecoverableErrorTest) {
|
| EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| .WillOnce(Return(status));
|
|
|
| + GoogleServiceAuthError auth_error(GoogleServiceAuthError::NONE);
|
| + EXPECT_CALL(service, GetAuthError()).WillOnce(ReturnRef(auth_error));
|
| +
|
| EXPECT_CALL(service, unrecoverable_error_detected())
|
| .WillOnce(Return(true));
|
|
|
| @@ -125,3 +144,185 @@ TEST(SyncUIUtilTest, AuthStateGlobalError) {
|
| &service, table[i].error_state, false, false);
|
| }
|
| }
|
| +// Loads a ProfileSyncServiceMock to emulate one of a number of distinct cases
|
| +// in order to perform tests on the generated messages.
|
| +void GetDistinctCase(ProfileSyncServiceMock& service,
|
| + GoogleServiceAuthError** auth_error,
|
| + int caseNumber) {
|
| + // Auth Error object is returned by reference in mock and needs to stay in
|
| + // scope throughout test, so it is owned by calling method. However it is
|
| + // immutable so can only be allocated in this method.
|
| + switch (caseNumber) {
|
| + case STATUS_CASE_SETUP_IN_PROGRESS: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(service, SetupInProgress())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE);
|
| + EXPECT_CALL(service, GetAuthError())
|
| + .WillOnce(ReturnRef(**auth_error));
|
| + EXPECT_CALL(service, UIShouldDepictAuthInProgress())
|
| + .WillOnce(Return(false));
|
| + return;
|
| + }
|
| + case STATUS_CASE_SETUP_ERROR: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(service, SetupInProgress())
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(service, unrecoverable_error_detected())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + return;
|
| + }
|
| + case STATUS_CASE_AUTHENTICATING: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + EXPECT_CALL(service, UIShouldDepictAuthInProgress())
|
| + .WillOnce(Return(true));
|
| + *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE);
|
| + EXPECT_CALL(service, GetAuthError())
|
| + .WillOnce(ReturnRef(**auth_error));
|
| + return;
|
| + }
|
| + case STATUS_CASE_AUTH_ERROR: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + *auth_error = new GoogleServiceAuthError(
|
| + GoogleServiceAuthError::SERVICE_UNAVAILABLE);
|
| + EXPECT_CALL(service, GetAuthenticatedUsername())
|
| + .WillOnce(Return(ASCIIToUTF16("")));
|
| + EXPECT_CALL(service, GetAuthError())
|
| + .WillOnce(ReturnRef(**auth_error));
|
| + EXPECT_CALL(service, UIShouldDepictAuthInProgress())
|
| + .WillOnce(Return(false));
|
| + return;
|
| + }
|
| + case STATUS_CASE_PROTOCOL_ERROR: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncProtocolError protocolError;
|
| + protocolError.action = browser_sync::STOP_AND_RESTART_SYNC;
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + status.sync_protocol_error = protocolError;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE);
|
| + EXPECT_CALL(service, GetAuthError())
|
| + .WillOnce(ReturnRef(**auth_error));
|
| + EXPECT_CALL(service, UIShouldDepictAuthInProgress())
|
| + .WillOnce(Return(false));
|
| + return;
|
| + }
|
| + case STATUS_CASE_PASSPHRASE_ERROR: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE);
|
| + EXPECT_CALL(service, GetAuthError())
|
| + .WillOnce(ReturnRef(**auth_error));
|
| + EXPECT_CALL(service, GetAuthenticatedUsername())
|
| + .WillOnce(Return(ASCIIToUTF16("example@example.com")));
|
| + EXPECT_CALL(service, UIShouldDepictAuthInProgress())
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(service, IsPassphraseRequired())
|
| + .WillOnce(Return(true));
|
| + EXPECT_CALL(service, IsPassphraseRequiredForDecryption())
|
| + .WillOnce(Return(true));
|
| + return;
|
| + }
|
| + case STATUS_CASE_SYNCED: {
|
| + EXPECT_CALL(service, HasSyncSetupCompleted())
|
| + .WillOnce(Return(true));
|
| + browser_sync::SyncBackendHost::Status status;
|
| + status.summary = browser_sync::SyncBackendHost::Status::READY;
|
| + EXPECT_CALL(service, QueryDetailedSyncStatus())
|
| + .WillOnce(Return(status));
|
| + *auth_error = new GoogleServiceAuthError(GoogleServiceAuthError::NONE);
|
| + EXPECT_CALL(service, GetAuthError())
|
| + .WillOnce(ReturnRef(**auth_error));
|
| + EXPECT_CALL(service, GetAuthenticatedUsername())
|
| + .WillOnce(Return(ASCIIToUTF16("example@example.com")));
|
| + EXPECT_CALL(service, UIShouldDepictAuthInProgress())
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(service, IsPassphraseRequired())
|
| + .WillOnce(Return(false));
|
| + return;
|
| + }
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| +// This test ensures that a each distinctive ProfileSyncService statuses
|
| +// will return a unique combination of status and link messages from
|
| +// GetStatusLabels().
|
| +TEST(SyncUIUtilTest, DistinctCasesReportUniqueMessageSets) {
|
| + ProfileSyncServiceMock service;
|
| +
|
| + std::set<string16> messages;
|
| + for (int idx = 0; idx != NUMBER_OF_STATUS_CASES; idx++) {
|
| + ProfileSyncServiceMock service;
|
| + GoogleServiceAuthError* auth_error = NULL;
|
| + GetDistinctCase(service, &auth_error, idx);
|
| + string16 status_label;
|
| + string16 link_label;
|
| + sync_ui_util::GetStatusLabels(&service,
|
| + sync_ui_util::WITH_HTML,
|
| + &status_label,
|
| + &link_label);
|
| + // If the status and link message combination is already present in the set
|
| + // of messages already seen, this is a duplicate rather than a unique
|
| + // message, and the test has failed.
|
| + string16 combined_label =
|
| + status_label + string16(ASCIIToUTF16("#")) + link_label;
|
| + EXPECT_TRUE(messages.find(combined_label) == messages.end());
|
| + messages.insert(combined_label);
|
| + if (auth_error)
|
| + delete auth_error;
|
| + }
|
| +}
|
| +
|
| +// This test ensures that the html_links parameter on GetStatusLabels() is
|
| +// honored.
|
| +TEST(SyncUIUtilTest, HtmlNotIncludedInStatusIfNotRequested) {
|
| + ProfileSyncServiceMock service;
|
| + for (int idx = 0; idx != NUMBER_OF_STATUS_CASES; idx++) {
|
| + ProfileSyncServiceMock service;
|
| + GoogleServiceAuthError* auth_error = NULL;
|
| + GetDistinctCase(service, &auth_error, idx);
|
| + string16 status_label;
|
| + string16 link_label;
|
| + sync_ui_util::GetStatusLabels(&service,
|
| + sync_ui_util::PLAIN_TEXT,
|
| + &status_label,
|
| + &link_label);
|
| + // Ensures a search for string 'href' (found in links, not a string to be
|
| + // found in an English language message) fails when links are excluded from
|
| + // the status label.
|
| + EXPECT_EQ(status_label.find(string16(ASCIIToUTF16("href"))),
|
| + string16::npos);
|
| + if (auth_error) {
|
| + delete auth_error;
|
| + }
|
| + }
|
| +}
|
|
|