blob: 1c9edfe95d91cc92162cc16467053527ae2804e7 [file] [log] [blame]
// Copyright 2018 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 "components/sync/model_impl/in_memory_metadata_change_list.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
using testing::StrictMock;
MATCHER_P(EqualsProto, expected, "") {
return arg.SerializeAsString() == expected.SerializeAsString();
}
class MockMetadataChangeList : public MetadataChangeList {
public:
MOCK_METHOD1(UpdateModelTypeState,
void(const sync_pb::ModelTypeState& model_type_state));
MOCK_METHOD0(ClearModelTypeState, void());
MOCK_METHOD2(UpdateMetadata,
void(const std::string& storage_key,
const sync_pb::EntityMetadata& metadata));
MOCK_METHOD1(ClearMetadata, void(const std::string& storage_key));
};
TEST(InMemoryMetadataChangeListTest, ShouldTransferNothingIfEmptyChangeList) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
// StrictMock verifies no calls are issued.
cl.TransferChangesTo(&mock_change_list);
}
TEST(InMemoryMetadataChangeListTest, ShouldTransferUpdateModelTypeState) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
sync_pb::ModelTypeState state;
state.set_encryption_key_name("ekn");
cl.UpdateModelTypeState(state);
EXPECT_CALL(mock_change_list, UpdateModelTypeState(EqualsProto(state)));
cl.TransferChangesTo(&mock_change_list);
}
TEST(InMemoryMetadataChangeListTest, ShouldTransferClearModelTypeState) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
cl.ClearModelTypeState();
EXPECT_CALL(mock_change_list, ClearModelTypeState());
cl.TransferChangesTo(&mock_change_list);
}
TEST(InMemoryMetadataChangeListTest, ShouldTransferUpdateMetadata) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
sync_pb::EntityMetadata metadata;
metadata.set_client_tag_hash("some_hash");
cl.UpdateMetadata("client_tag", metadata);
EXPECT_CALL(mock_change_list,
UpdateMetadata("client_tag", EqualsProto(metadata)));
cl.TransferChangesTo(&mock_change_list);
}
TEST(InMemoryMetadataChangeListTest, ShouldTransferClearMetadata) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
cl.ClearMetadata("client_tag");
EXPECT_CALL(mock_change_list, ClearMetadata("client_tag"));
cl.TransferChangesTo(&mock_change_list);
}
TEST(InMemoryMetadataChangeListTest, ShouldTransferMultipleChanges) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
sync_pb::ModelTypeState state;
state.set_encryption_key_name("ekn");
cl.UpdateModelTypeState(state);
sync_pb::EntityMetadata metadata;
metadata.set_client_tag_hash("some_hash");
cl.UpdateMetadata("client_tag", metadata);
EXPECT_CALL(mock_change_list, UpdateModelTypeState(EqualsProto(state)));
EXPECT_CALL(mock_change_list,
UpdateMetadata("client_tag", EqualsProto(metadata)));
cl.TransferChangesTo(&mock_change_list);
}
TEST(InMemoryMetadataChangeListTest, ShouldTransferClearDespitePriorUpdates) {
StrictMock<MockMetadataChangeList> mock_change_list;
InMemoryMetadataChangeList cl;
// Updates that should be ignored due to the later clears.
{
sync_pb::ModelTypeState state;
state.set_encryption_key_name("ekn");
cl.UpdateModelTypeState(state);
sync_pb::EntityMetadata metadata;
metadata.set_client_tag_hash("some_hash");
cl.UpdateMetadata("client_tag", metadata);
}
cl.ClearModelTypeState();
cl.ClearMetadata("client_tag");
EXPECT_CALL(mock_change_list, ClearModelTypeState());
EXPECT_CALL(mock_change_list, ClearMetadata("client_tag"));
cl.TransferChangesTo(&mock_change_list);
}
} // namespace
} // namespace syncer