Commit f4ccdef6 authored by Rushan Suleymanov's avatar Rushan Suleymanov Committed by Commit Bot

[Sync] Stop sharing message data type on persistent auth error

After current CL SharingMessage data type will stop on any persistent
auth error from the server. Previously, it would only stop on one
specific type of error (web signout).

Bug: 1097054
Change-Id: I917b20343b457e513004e5ad112bf6d42d0f42dd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2352743Reviewed-by: default avatarAlex Chau <alexchau@chromium.org>
Reviewed-by: default avatarMarc Treib <treib@chromium.org>
Commit-Queue: Rushan Suleymanov <rushans@google.com>
Cr-Commit-Position: refs/heads/master@{#798644}
parent d542339d
...@@ -33,7 +33,7 @@ SharingMessageModelTypeController::~SharingMessageModelTypeController() { ...@@ -33,7 +33,7 @@ SharingMessageModelTypeController::~SharingMessageModelTypeController() {
syncer::DataTypeController::PreconditionState syncer::DataTypeController::PreconditionState
SharingMessageModelTypeController::GetPreconditionState() const { SharingMessageModelTypeController::GetPreconditionState() const {
DCHECK(CalledOnValidThread()); DCHECK(CalledOnValidThread());
if (syncer::IsWebSignout(sync_service_->GetAuthError())) { if (sync_service_->GetAuthError().IsPersistentError()) {
return PreconditionState::kMustStopAndClearData; return PreconditionState::kMustStopAndClearData;
} }
return PreconditionState::kPreconditionsMet; return PreconditionState::kPreconditionsMet;
......
...@@ -5,17 +5,36 @@ ...@@ -5,17 +5,36 @@
#include <vector> #include <vector>
#include "base/test/mock_callback.h" #include "base/test/mock_callback.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/sharing/features.h"
#include "chrome/browser/sharing/sharing_message_bridge.h" #include "chrome/browser/sharing/sharing_message_bridge.h"
#include "chrome/browser/sharing/sharing_message_bridge_factory.h" #include "chrome/browser/sharing/sharing_message_bridge_factory.h"
#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
#include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/sync_test.h"
#include "components/sync/driver/sync_token_status.h"
#include "components/sync/test/fake_server/fake_server_http_post_provider.h" #include "components/sync/test/fake_server/fake_server_http_post_provider.h"
#include "content/public/test/browser_test.h" #include "content/public/test/browser_test.h"
namespace { namespace {
using sync_pb::SharingMessageSpecifics; using sync_pb::SharingMessageSpecifics;
using testing::_;
constexpr char kEmptyOAuth2Token[] = "";
constexpr char kInvalidGrantOAuth2Token[] = R"(
{
"error": "invalid_grant"
})";
constexpr char kValidOAuth2Token[] = R"(
{
"refresh_token": "new_refresh_token",
"access_token": "new_access_token",
"expires_in": 3600, // 1 hour.
"token_type": "Bearer"
})";
MATCHER_P(HasErrorCode, expected_error_code, "") { MATCHER_P(HasErrorCode, expected_error_code, "") {
return arg.error_code() == expected_error_code; return arg.error_code() == expected_error_code;
...@@ -43,6 +62,29 @@ class NextCycleIterationChecker : public SingleClientStatusChangeChecker { ...@@ -43,6 +62,29 @@ class NextCycleIterationChecker : public SingleClientStatusChangeChecker {
base::Time last_synced_time_; base::Time last_synced_time_;
}; };
class DisabledSharingMessageChecker : public SingleClientStatusChangeChecker {
public:
explicit DisabledSharingMessageChecker(syncer::ProfileSyncService* service)
: SingleClientStatusChangeChecker(service) {}
bool IsExitConditionSatisfied(std::ostream* os) override {
*os << "Waiting for disabled SHARING_MESSAGE data type";
return !service()->GetActiveDataTypes().Has(syncer::SHARING_MESSAGE);
}
};
class RetryingAccessTokenFetchChecker : public SingleClientStatusChangeChecker {
public:
explicit RetryingAccessTokenFetchChecker(syncer::ProfileSyncService* service)
: SingleClientStatusChangeChecker(service) {}
// StatusChangeChecker implementation.
bool IsExitConditionSatisfied(std::ostream* os) override {
*os << "Waiting for auth error";
return service()->IsRetryingAccessTokenFetchForTest();
}
};
class SharingMessageEqualityChecker : public SingleClientStatusChangeChecker { class SharingMessageEqualityChecker : public SingleClientStatusChangeChecker {
public: public:
SharingMessageEqualityChecker( SharingMessageEqualityChecker(
...@@ -96,6 +138,11 @@ class SingleClientSharingMessageSyncTest : public SyncTest { ...@@ -96,6 +138,11 @@ class SingleClientSharingMessageSyncTest : public SyncTest {
public: public:
SingleClientSharingMessageSyncTest() : SyncTest(SINGLE_CLIENT) { SingleClientSharingMessageSyncTest() : SyncTest(SINGLE_CLIENT) {
DisableVerifier(); DisableVerifier();
// Replace the default value (5 seconds) with 1 minute to reduce possibility
// of test flakiness.
feature_list_.InitAndEnableFeatureWithParameters(
kSharingMessageBridgeTimeout,
{{"SharingMessageBridgeTimeoutSeconds", "60"}});
} }
bool WaitForSharingMessage( bool WaitForSharingMessage(
...@@ -199,7 +246,7 @@ IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest, ...@@ -199,7 +246,7 @@ IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest,
sharing_message_bridge->SendSharingMessage( sharing_message_bridge->SendSharingMessage(
std::make_unique<SharingMessageSpecifics>(specifics), callback.Get()); std::make_unique<SharingMessageSpecifics>(specifics), callback.Get());
GetClient(0)->StopSyncServiceWithoutClearingData(); GetClient(0)->StopSyncServiceAndClearData();
GetClient(0)->StartSyncService(); GetClient(0)->StartSyncService();
ASSERT_TRUE(NextCycleIterationChecker(GetSyncService(0)).Wait()); ASSERT_TRUE(NextCycleIterationChecker(GetSyncService(0)).Wait());
...@@ -208,15 +255,42 @@ IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest, ...@@ -208,15 +255,42 @@ IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest,
.empty()); .empty());
} }
IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest, IN_PROC_BROWSER_TEST_F(
ShouldCleanPendingMessagesAfterSyncTurnedOff) { SingleClientSharingMessageSyncTest,
ShouldTurnOffSharingMessageDataTypeOnPersistentAuthError) {
ASSERT_TRUE(SetupSync());
GetFakeServer()->SetHttpError(net::HTTP_UNAUTHORIZED);
SetOAuth2TokenResponse(kInvalidGrantOAuth2Token, net::HTTP_BAD_REQUEST,
net::OK);
base::MockOnceCallback<void(const sync_pb::SharingMessageCommitError&)> base::MockOnceCallback<void(const sync_pb::SharingMessageCommitError&)>
callback; callback;
EXPECT_CALL( EXPECT_CALL(
callback, callback,
Run(HasErrorCode(sync_pb::SharingMessageCommitError::SYNC_TURNED_OFF))); Run(HasErrorCode(sync_pb::SharingMessageCommitError::SYNC_TURNED_OFF)));
SharingMessageBridge* sharing_message_bridge =
SharingMessageBridgeFactory::GetForBrowserContext(GetProfile(0));
SharingMessageSpecifics specifics;
specifics.set_payload("payload");
sharing_message_bridge->SendSharingMessage(
std::make_unique<SharingMessageSpecifics>(specifics), callback.Get());
EXPECT_TRUE(DisabledSharingMessageChecker(GetSyncService(0)).Wait());
}
IN_PROC_BROWSER_TEST_F(
SingleClientSharingMessageSyncTest,
ShouldRetrySendingSharingMessageDataTypeOnTransientAuthError) {
ASSERT_TRUE(SetupSync()); ASSERT_TRUE(SetupSync());
GetFakeServer()->SetHttpError(net::HTTP_UNAUTHORIZED);
SetOAuth2TokenResponse(kEmptyOAuth2Token, net::HTTP_INTERNAL_SERVER_ERROR,
net::OK);
base::MockOnceCallback<void(const sync_pb::SharingMessageCommitError&)>
callback;
EXPECT_CALL(callback,
Run(HasErrorCode(sync_pb::SharingMessageCommitError::NONE)));
SharingMessageBridge* sharing_message_bridge = SharingMessageBridge* sharing_message_bridge =
SharingMessageBridgeFactory::GetForBrowserContext(GetProfile(0)); SharingMessageBridgeFactory::GetForBrowserContext(GetProfile(0));
...@@ -225,13 +299,11 @@ IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest, ...@@ -225,13 +299,11 @@ IN_PROC_BROWSER_TEST_F(SingleClientSharingMessageSyncTest,
sharing_message_bridge->SendSharingMessage( sharing_message_bridge->SendSharingMessage(
std::make_unique<SharingMessageSpecifics>(specifics), callback.Get()); std::make_unique<SharingMessageSpecifics>(specifics), callback.Get());
GetClient(0)->StopSyncServiceAndClearData(); ASSERT_TRUE(RetryingAccessTokenFetchChecker(GetSyncService(0)).Wait());
GetClient(0)->StartSyncService(); GetFakeServer()->ClearHttpError();
ASSERT_TRUE(NextCycleIterationChecker(GetSyncService(0)).Wait()); SetOAuth2TokenResponse(kValidOAuth2Token, net::HTTP_OK, net::OK);
EXPECT_TRUE(GetFakeServer() EXPECT_TRUE(WaitForSharingMessage({specifics}));
->GetSyncEntitiesByModelType(syncer::SHARING_MESSAGE)
.empty());
} }
} // namespace } // namespace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment