blob: 45df2181c663cafb7c78255a6bc0a11ef1346023 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/macros.h"
#include "chrome/browser/sync/test/integration/await_match_status_change_checker.h"
#include "chrome/browser/sync/test/integration/extensions_helper.h"
#include "chrome/browser/sync/test/integration/feature_toggler.h"
#include "chrome/browser/sync/test/integration/sync_test.h"
#include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/sync/driver/sync_driver_switches.h"
#include "components/sync/test/fake_server/fake_server.h"
namespace {
using extensions_helper::AllProfilesHaveSameExtensionsAsVerifier;
using extensions_helper::DisableExtension;
using extensions_helper::GetInstalledExtensions;
using extensions_helper::InstallExtension;
using extensions_helper::InstallExtensionForAllProfiles;
class SingleClientExtensionsSyncTest : public FeatureToggler, public SyncTest {
public:
SingleClientExtensionsSyncTest()
: FeatureToggler(switches::kSyncPseudoUSSExtensions),
SyncTest(SINGLE_CLIENT) {}
~SingleClientExtensionsSyncTest() override {}
private:
DISALLOW_COPY_AND_ASSIGN(SingleClientExtensionsSyncTest);
};
IN_PROC_BROWSER_TEST_P(SingleClientExtensionsSyncTest, StartWithNoExtensions) {
ASSERT_TRUE(SetupSync());
ASSERT_TRUE(AllProfilesHaveSameExtensionsAsVerifier());
}
IN_PROC_BROWSER_TEST_P(SingleClientExtensionsSyncTest,
StartWithSomeExtensions) {
ASSERT_TRUE(SetupClients());
const int kNumExtensions = 5;
for (int i = 0; i < kNumExtensions; ++i) {
InstallExtension(GetProfile(0), i);
InstallExtension(verifier(), i);
}
ASSERT_TRUE(SetupSync());
ASSERT_TRUE(AllProfilesHaveSameExtensionsAsVerifier());
}
IN_PROC_BROWSER_TEST_P(SingleClientExtensionsSyncTest, InstallSomeExtensions) {
ASSERT_TRUE(SetupSync());
const int kNumExtensions = 5;
for (int i = 0; i < kNumExtensions; ++i) {
InstallExtension(GetProfile(0), i);
InstallExtension(verifier(), i);
}
ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
ASSERT_TRUE(AllProfilesHaveSameExtensionsAsVerifier());
}
// Helper function for waiting to see the extension count in a profile
// become a specific number.
static bool ExtensionCountCheck(Profile* profile, size_t expected_count) {
return GetInstalledExtensions(profile).size() == expected_count;
}
// Tests the case of an uninstall from the server conflicting with a local
// modification, which we expect to be resolved in favor of the uninstall.
IN_PROC_BROWSER_TEST_P(SingleClientExtensionsSyncTest, UninstallWinsConflicts) {
ASSERT_TRUE(SetupClients());
// Start with an extension installed, and setup sync.
InstallExtensionForAllProfiles(0);
ASSERT_TRUE(SetupSync());
EXPECT_TRUE(AllProfilesHaveSameExtensionsAsVerifier());
// Simulate a delete at the server.
std::vector<sync_pb::SyncEntity> server_extensions =
GetFakeServer()->GetSyncEntitiesByModelType(syncer::EXTENSIONS);
ASSERT_EQ(1ul, server_extensions.size());
std::unique_ptr<syncer::LoopbackServerEntity> tombstone(
syncer::PersistentTombstoneEntity::CreateNew(
server_extensions[0].id_string(),
server_extensions[0].client_defined_unique_tag()));
GetFakeServer()->InjectEntity(std::move(tombstone));
// Modify the extension in the local profile to cause a conflict.
DisableExtension(GetProfile(0), 0);
EXPECT_EQ(1u, GetInstalledExtensions(GetProfile(0)).size());
// Trigger sync, and expect the extension to remain uninstalled at the server
// and get uninstalled locally.
const syncer::ModelTypeSet kExtensionsType(syncer::EXTENSIONS);
TriggerSyncForModelTypes(0, kExtensionsType);
server_extensions =
GetFakeServer()->GetSyncEntitiesByModelType(syncer::EXTENSIONS);
EXPECT_EQ(0ul, server_extensions.size());
AwaitMatchStatusChangeChecker checker(
base::Bind(&ExtensionCountCheck, GetProfile(0), 0u),
"Waiting for profile to have no extensions");
EXPECT_TRUE(checker.Wait());
EXPECT_TRUE(GetInstalledExtensions(GetProfile(0)).empty());
}
INSTANTIATE_TEST_CASE_P(USS,
SingleClientExtensionsSyncTest,
::testing::Values(false, true));
} // namespace