summaryrefslogtreecommitdiffstats
path: root/sync/engine/non_blocking_type_processor_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sync/engine/non_blocking_type_processor_unittest.cc')
-rw-r--r--sync/engine/non_blocking_type_processor_unittest.cc63
1 files changed, 50 insertions, 13 deletions
diff --git a/sync/engine/non_blocking_type_processor_unittest.cc b/sync/engine/non_blocking_type_processor_unittest.cc
index 9ab6ca3..3a3ca5c 100644
--- a/sync/engine/non_blocking_type_processor_unittest.cc
+++ b/sync/engine/non_blocking_type_processor_unittest.cc
@@ -134,14 +134,21 @@ class NonBlockingTypeProcessorTest : public ::testing::Test {
NonBlockingTypeProcessorTest();
virtual ~NonBlockingTypeProcessorTest();
- // Explicit initialization step. Kept separate to allow tests to inject
- // on-disk state before the test begins.
- void Initialize();
+ // Initialize with no local state. The processor will be unable to commit
+ // until it receives notification that initial sync has completed.
+ void FirstTimeInitialize();
+
+ // Initialize to a "ready-to-commit" state.
+ void InitializeToReadyState();
// Local data modification. Emulates signals from the model thread.
void WriteItem(const std::string& tag, const std::string& value);
void DeleteItem(const std::string& tag);
+ // Emulates an "initial sync done" message from the
+ // NonBlockingTypeProcessorCore.
+ void OnInitialSyncDone();
+
// Emulate updates from the server.
// This harness has some functionality to help emulate server behavior.
// See the definitions of these methods for more information.
@@ -190,11 +197,20 @@ NonBlockingTypeProcessorTest::NonBlockingTypeProcessorTest()
NonBlockingTypeProcessorTest::~NonBlockingTypeProcessorTest() {
}
-void NonBlockingTypeProcessorTest::Initialize() {
+void NonBlockingTypeProcessorTest::FirstTimeInitialize() {
processor_->Enable(mock_sync_core_proxy_->Clone());
mock_processor_core_ = mock_sync_core_proxy_->GetMockProcessorCore();
}
+void NonBlockingTypeProcessorTest::InitializeToReadyState() {
+ // TODO(rlarocque): This should be updated to inject on-disk state.
+ // At the time this code was written, there was no support for on-disk
+ // state so this was the only way to inject a data_type_state into
+ // the |processor_|.
+ FirstTimeInitialize();
+ OnInitialSyncDone();
+}
+
void NonBlockingTypeProcessorTest::WriteItem(const std::string& tag,
const std::string& value) {
const std::string tag_hash = GenerateTagHash(tag);
@@ -205,6 +221,13 @@ void NonBlockingTypeProcessorTest::DeleteItem(const std::string& tag) {
processor_->Delete(tag);
}
+void NonBlockingTypeProcessorTest::OnInitialSyncDone() {
+ data_type_state_.initial_sync_done = true;
+ UpdateResponseDataList empty_update_list;
+
+ processor_->OnUpdateReceived(data_type_state_, empty_update_list);
+}
+
void NonBlockingTypeProcessorTest::UpdateFromServer(int64 version_offset,
const std::string& tag,
const std::string& value) {
@@ -385,7 +408,7 @@ CommitRequestData NonBlockingTypeProcessorTest::GetLatestCommitRequestForTag(
// Creates a new item locally.
// Thoroughly tests the data generated by a local item creation.
TEST_F(NonBlockingTypeProcessorTest, CreateLocalItem) {
- Initialize();
+ InitializeToReadyState();
EXPECT_EQ(0U, GetNumCommitRequestLists());
WriteItem("tag1", "value1");
@@ -396,7 +419,7 @@ TEST_F(NonBlockingTypeProcessorTest, CreateLocalItem) {
const CommitRequestData& tag1_data = GetLatestCommitRequestForTag("tag1");
EXPECT_TRUE(tag1_data.id.empty());
- EXPECT_EQ(0, tag1_data.base_version);
+ EXPECT_EQ(kUncommittedVersion, tag1_data.base_version);
EXPECT_FALSE(tag1_data.ctime.is_null());
EXPECT_FALSE(tag1_data.mtime.is_null());
EXPECT_EQ("tag1", tag1_data.non_unique_name);
@@ -408,7 +431,7 @@ TEST_F(NonBlockingTypeProcessorTest, CreateLocalItem) {
// Creates a new local item then modifies it.
// Thoroughly tests data generated by modification of server-unknown item.
TEST_F(NonBlockingTypeProcessorTest, CreateAndModifyLocalItem) {
- Initialize();
+ InitializeToReadyState();
EXPECT_EQ(0U, GetNumCommitRequestLists());
WriteItem("tag1", "value1");
@@ -428,7 +451,7 @@ TEST_F(NonBlockingTypeProcessorTest, CreateAndModifyLocalItem) {
// Perform a thorough examination of the update-generated request.
EXPECT_TRUE(tag1_v2_data.id.empty());
- EXPECT_EQ(0, tag1_v2_data.base_version);
+ EXPECT_EQ(kUncommittedVersion, tag1_v2_data.base_version);
EXPECT_FALSE(tag1_v2_data.ctime.is_null());
EXPECT_FALSE(tag1_v2_data.mtime.is_null());
EXPECT_EQ("tag1", tag1_v2_data.non_unique_name);
@@ -440,7 +463,7 @@ TEST_F(NonBlockingTypeProcessorTest, CreateAndModifyLocalItem) {
// Deletes an item we've never seen before.
// Should have no effect and not crash.
TEST_F(NonBlockingTypeProcessorTest, DeleteUnknown) {
- Initialize();
+ InitializeToReadyState();
DeleteItem("tag1");
EXPECT_EQ(0U, GetNumCommitRequestLists());
@@ -452,7 +475,7 @@ TEST_F(NonBlockingTypeProcessorTest, DeleteUnknown) {
// server-unknown as far as the model thread is concerned. That behavior
// is race-dependent; other tests are used to test other races.
TEST_F(NonBlockingTypeProcessorTest, DeleteServerUnknown) {
- Initialize();
+ InitializeToReadyState();
WriteItem("tag1", "value1");
EXPECT_EQ(1U, GetNumCommitRequestLists());
@@ -467,7 +490,7 @@ TEST_F(NonBlockingTypeProcessorTest, DeleteServerUnknown) {
EXPECT_GT(tag1_v2_data.sequence_number, tag1_v1_data.sequence_number);
EXPECT_TRUE(tag1_v2_data.id.empty());
- EXPECT_EQ(0, tag1_v2_data.base_version);
+ EXPECT_EQ(kUncommittedVersion, tag1_v2_data.base_version);
EXPECT_TRUE(tag1_v2_data.deleted);
}
@@ -477,7 +500,7 @@ TEST_F(NonBlockingTypeProcessorTest, DeleteServerUnknown) {
// successfully commits it, but, before the commit response is picked up
// by the model thread, the item is deleted by the model thread.
TEST_F(NonBlockingTypeProcessorTest, DeleteServerUnknown_RacyCommitResponse) {
- Initialize();
+ InitializeToReadyState();
WriteItem("tag1", "value1");
EXPECT_EQ(1U, GetNumCommitRequestLists());
@@ -501,7 +524,7 @@ TEST_F(NonBlockingTypeProcessorTest, DeleteServerUnknown_RacyCommitResponse) {
// Creates two different sync items.
// Verifies that the second has no effect on the first.
TEST_F(NonBlockingTypeProcessorTest, TwoIndependentItems) {
- Initialize();
+ InitializeToReadyState();
EXPECT_EQ(0U, GetNumCommitRequestLists());
WriteItem("tag1", "value1");
@@ -519,6 +542,20 @@ TEST_F(NonBlockingTypeProcessorTest, TwoIndependentItems) {
ASSERT_TRUE(HasCommitRequestForTag("tag2"));
}
+// Starts the processor with no local state.
+// Verify that it waits until initial sync is complete before requesting
+// commits.
+TEST_F(NonBlockingTypeProcessorTest, NoCommitsUntilInitialSyncDone) {
+ FirstTimeInitialize();
+
+ WriteItem("tag1", "value1");
+ EXPECT_EQ(0U, GetNumCommitRequestLists());
+
+ OnInitialSyncDone();
+ EXPECT_EQ(1U, GetNumCommitRequestLists());
+ EXPECT_TRUE(HasCommitRequestForTag("tag1"));
+}
+
// TODO(rlarocque): Add more testing of non_unique_name fields.
} // namespace syncer