diff options
Diffstat (limited to 'sync/engine/non_blocking_type_processor_unittest.cc')
-rw-r--r-- | sync/engine/non_blocking_type_processor_unittest.cc | 63 |
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 |