#include "components/sync/engine/commit_processor.h"
#include <memory>
#include "components/sync/engine/commit_contribution.h"
#include "components/sync/engine/commit_contributor.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
constexpr int kMaxEntries = 17;
using testing::_;
using testing::IsEmpty;
using testing::Pair;
using testing::UnorderedElementsAre;
MATCHER_P(HasNumEntries, num_entries, "") {
return static_cast<int>(arg->GetNumEntries()) == num_entries;
}
class FakeCommitContribution : public CommitContribution {
public:
explicit FakeCommitContribution(size_t num_entries)
: num_entries_(num_entries) {}
~FakeCommitContribution() override = default;
void AddToCommitMessage(sync_pb::ClientToServerMessage* msg) override {}
SyncerError ProcessCommitResponse(
const sync_pb::ClientToServerResponse& response,
StatusController* status) override {
return SyncerError();
}
void ProcessCommitFailure(SyncCommitError commit_error) override {}
size_t GetNumEntries() const override { return num_entries_; }
private:
const size_t num_entries_;
};
ACTION_P(ReturnContributionWithEntries, num_entries) {
return std::make_unique<FakeCommitContribution>(num_entries);
}
class MockCommitContributor : public CommitContributor {
public:
MockCommitContributor() = default;
~MockCommitContributor() override = default;
MOCK_METHOD(std::unique_ptr<CommitContribution>,
GetContribution,
(size_t max_entries),
(override));
};
class CommitProcessorTest : public testing::Test {
protected:
CommitProcessorTest()
: contributor_map_{{NIGORI, &nigori_contributor_},
{SHARING_MESSAGE, &sharing_message_contributor_},
{BOOKMARKS, &bookmark_contributor_},
{PREFERENCES, &preference_contributor_},
{HISTORY, &history_contributor_}},
processor_(
ModelTypeSet{NIGORI, SHARING_MESSAGE, BOOKMARKS,
PREFERENCES, HISTORY},
&contributor_map_) {
EXPECT_TRUE(HighPriorityUserTypes().Has(SHARING_MESSAGE));
EXPECT_FALSE(HighPriorityUserTypes().Has(BOOKMARKS));
EXPECT_FALSE(HighPriorityUserTypes().Has(PREFERENCES));
EXPECT_TRUE(LowPriorityUserTypes().Has(HISTORY));
}
testing::NiceMock<MockCommitContributor> nigori_contributor_;
testing::NiceMock<MockCommitContributor> sharing_message_contributor_;
testing::NiceMock<MockCommitContributor> bookmark_contributor_;
testing::NiceMock<MockCommitContributor> preference_contributor_;
testing::NiceMock<MockCommitContributor> history_contributor_;
CommitContributorMap contributor_map_;
CommitProcessor processor_;
};
TEST_F(CommitProcessorTest, ShouldGatherNigoriOnlyContribution) {
EXPECT_CALL(nigori_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(1));
EXPECT_CALL(sharing_message_contributor_, GetContribution).Times(0);
EXPECT_CALL(bookmark_contributor_, GetContribution).Times(0);
EXPECT_CALL(preference_contributor_, GetContribution).Times(0);
EXPECT_CALL(history_contributor_, GetContribution).Times(0);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(NIGORI, HasNumEntries(1))));
}
TEST_F(CommitProcessorTest, ShouldGatherHighPriorityUserTypesOnlyContribution) {
const int kNumReturnedEntries = 3;
testing::Sequence s1, s2, s3;
EXPECT_CALL(sharing_message_contributor_, GetContribution(kMaxEntries))
.InSequence(s1, s2, s3)
.WillOnce(ReturnContributionWithEntries(kNumReturnedEntries));
EXPECT_CALL(bookmark_contributor_, GetContribution).InSequence(s1);
EXPECT_CALL(preference_contributor_, GetContribution).InSequence(s2);
EXPECT_CALL(history_contributor_, GetContribution).InSequence(s3);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(SHARING_MESSAGE, HasNumEntries(kNumReturnedEntries))));
}
TEST_F(CommitProcessorTest, ShouldGatherRegularUserTypes) {
const int kNumReturnedBookmarks = 7;
EXPECT_CALL(nigori_contributor_, GetContribution(kMaxEntries));
EXPECT_CALL(sharing_message_contributor_, GetContribution(kMaxEntries));
EXPECT_CALL(bookmark_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kNumReturnedBookmarks));
EXPECT_CALL(preference_contributor_, GetContribution);
EXPECT_CALL(history_contributor_, GetContribution);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(BOOKMARKS, HasNumEntries(kNumReturnedBookmarks))));
}
TEST_F(CommitProcessorTest, ShouldGatherLowPriorityUserTypes) {
const int kNumReturnedHistory = 7;
EXPECT_CALL(nigori_contributor_, GetContribution(kMaxEntries));
EXPECT_CALL(sharing_message_contributor_, GetContribution(kMaxEntries));
EXPECT_CALL(bookmark_contributor_, GetContribution(kMaxEntries));
EXPECT_CALL(preference_contributor_, GetContribution(kMaxEntries));
EXPECT_CALL(history_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kNumReturnedHistory));
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(HISTORY, HasNumEntries(kNumReturnedHistory))));
}
TEST_F(CommitProcessorTest, ShouldGatherMultipleRegularUserTypes) {
const int kNumReturnedBookmarks = 7;
const int kNumReturnedPreferences = 8;
static_assert(kNumReturnedBookmarks + kNumReturnedPreferences < kMaxEntries);
EXPECT_CALL(bookmark_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedBookmarks));
EXPECT_CALL(preference_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedPreferences));
EXPECT_CALL(history_contributor_, GetContribution);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(BOOKMARKS, HasNumEntries(kNumReturnedBookmarks)),
Pair(PREFERENCES, HasNumEntries(kNumReturnedPreferences))));
}
TEST_F(CommitProcessorTest, ShouldContinueGatheringHighPriorityContributions) {
const int kNumReturnedSharingMessages = 3;
EXPECT_CALL(sharing_message_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kMaxEntries));
EXPECT_CALL(bookmark_contributor_, GetContribution).Times(0);
EXPECT_CALL(preference_contributor_, GetContribution).Times(0);
EXPECT_CALL(history_contributor_, GetContribution).Times(0);
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(SHARING_MESSAGE, HasNumEntries(kMaxEntries))));
EXPECT_CALL(sharing_message_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedSharingMessages));
EXPECT_CALL(bookmark_contributor_, GetContribution);
EXPECT_CALL(preference_contributor_, GetContribution);
EXPECT_CALL(history_contributor_, GetContribution);
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(SHARING_MESSAGE, HasNumEntries(kNumReturnedSharingMessages))));
EXPECT_CALL(sharing_message_contributor_, GetContribution).Times(0);
EXPECT_CALL(bookmark_contributor_, GetContribution).Times(0);
EXPECT_CALL(preference_contributor_, GetContribution).Times(0);
EXPECT_CALL(history_contributor_, GetContribution).Times(0);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
IsEmpty());
}
TEST_F(CommitProcessorTest, ShouldContinueGatheringRegularContributions) {
const int kNumReturnedBookmarks = 7;
EXPECT_CALL(bookmark_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kMaxEntries));
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(BOOKMARKS, HasNumEntries(kMaxEntries))));
EXPECT_CALL(bookmark_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedBookmarks));
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(BOOKMARKS, HasNumEntries(kNumReturnedBookmarks))));
EXPECT_CALL(bookmark_contributor_, GetContribution).Times(0);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
IsEmpty());
}
TEST_F(CommitProcessorTest, ShouldContinueGatheringLowPriorityContributions) {
const int kNumReturnedHistory = 7;
EXPECT_CALL(history_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kMaxEntries));
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(HISTORY, HasNumEntries(kMaxEntries))));
EXPECT_CALL(history_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedHistory));
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(HISTORY, HasNumEntries(kNumReturnedHistory))));
EXPECT_CALL(history_contributor_, GetContribution).Times(0);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
IsEmpty());
}
TEST_F(CommitProcessorTest,
ShouldContinueGatheringRegularContributionsIfMatchingMaxEntries) {
EXPECT_CALL(bookmark_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kMaxEntries));
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(Pair(BOOKMARKS, HasNumEntries(kMaxEntries))));
EXPECT_CALL(bookmark_contributor_, GetContribution);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
IsEmpty());
}
TEST_F(CommitProcessorTest, ShouldGatherInPriorityOrder) {
const int kNumReturnedSharingMessages = 3;
const int kNumReturnedBookmarks1 = kMaxEntries - kNumReturnedSharingMessages;
const int kNumReturnedBookmarks2 = 4;
const int kNumReturnedHistory = 5;
testing::InSequence s;
EXPECT_CALL(sharing_message_contributor_, GetContribution(kMaxEntries))
.WillOnce(ReturnContributionWithEntries(kNumReturnedSharingMessages))
.RetiresOnSaturation();
EXPECT_CALL(bookmark_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedBookmarks1));
EXPECT_CALL(bookmark_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedBookmarks2));
EXPECT_CALL(history_contributor_, GetContribution)
.WillOnce(ReturnContributionWithEntries(kNumReturnedHistory));
EXPECT_THAT(
processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(SHARING_MESSAGE, HasNumEntries(kNumReturnedSharingMessages)),
Pair(BOOKMARKS, HasNumEntries(kNumReturnedBookmarks1))));
EXPECT_CALL(sharing_message_contributor_, GetContribution(kMaxEntries))
.Times(0);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
UnorderedElementsAre(
Pair(BOOKMARKS, HasNumEntries(kNumReturnedBookmarks2)),
Pair(HISTORY, HasNumEntries(kNumReturnedHistory))));
EXPECT_CALL(bookmark_contributor_, GetContribution(kMaxEntries)).Times(0);
EXPECT_CALL(preference_contributor_, GetContribution(kMaxEntries)).Times(0);
EXPECT_CALL(history_contributor_, GetContribution(kMaxEntries)).Times(0);
EXPECT_THAT(processor_.GatherCommitContributions(kMaxEntries),
IsEmpty());
}
}
}