diff --git a/repertory/repertory_test/src/ring_buffer_open_file_test.cpp b/repertory/repertory_test/src/ring_buffer_open_file_test.cpp index 97df5f79..fe953519 100644 --- a/repertory/repertory_test/src/ring_buffer_open_file_test.cpp +++ b/repertory/repertory_test/src/ring_buffer_open_file_test.cpp @@ -576,4 +576,162 @@ TEST_F(ring_buffer_open_file_test, } } } + +TEST_F(ring_buffer_open_file_test, forward_center_noop_when_within_half) { + auto source_path = test::generate_test_file_name("ring_buffer_open_file"); + EXPECT_CALL(provider, is_read_only()).WillRepeatedly(Return(false)); + + filesystem_item fsi; + fsi.directory = false; + fsi.api_path = "/test.txt"; + fsi.size = test_chunk_size * 16U; + fsi.source_path = source_path; + + { + ring_buffer_open_file file(ring_buffer_dir, test_chunk_size, 30U, fsi, + provider, 8U); + + file.set(0U, 3U); + file.forward(1U); + + EXPECT_EQ(std::size_t(4U), file.get_current_chunk()); + EXPECT_EQ(std::size_t(0U), file.get_first_chunk()); + EXPECT_EQ(std::size_t(7U), file.get_last_chunk()); + + for (std::size_t chunk = 0U; chunk <= 7U; ++chunk) { + EXPECT_TRUE(file.get_read_state(chunk)) << "chunk " << chunk; + } + } +} + +TEST_F(ring_buffer_open_file_test, forward_center_caps_at_file_end) { + auto source_path = test::generate_test_file_name("ring_buffer_open_file"); + EXPECT_CALL(provider, is_read_only()).WillRepeatedly(Return(false)); + + filesystem_item fsi; + fsi.directory = false; + fsi.api_path = "/test.txt"; + fsi.size = test_chunk_size * 16U; + fsi.source_path = source_path; + + { + ring_buffer_open_file file(ring_buffer_dir, test_chunk_size, 30U, fsi, + provider, 8U); + + file.set(6U, 9U); + file.forward(100U); + + EXPECT_EQ(std::size_t(15U), file.get_current_chunk()); + EXPECT_EQ(std::size_t(8U), file.get_first_chunk()); + EXPECT_EQ(std::size_t(15U), file.get_last_chunk()); + } +} + +TEST_F(ring_buffer_open_file_test, + forward_delta_ge_ring_triggers_full_invalidation_path) { + auto source_path = test::generate_test_file_name("ring_buffer_open_file"); + EXPECT_CALL(provider, is_read_only()).WillRepeatedly(Return(false)); + + filesystem_item fsi; + fsi.directory = false; + fsi.api_path = "/test.txt"; + fsi.size = test_chunk_size * 16U; + fsi.source_path = source_path; + + { + ring_buffer_open_file file(ring_buffer_dir, test_chunk_size, 30U, fsi, + provider, 8U); + + file.set(0U, 0U); + file.forward(100U); + + EXPECT_EQ(std::size_t(15U), file.get_current_chunk()); + EXPECT_EQ(std::size_t(8U), file.get_first_chunk()); + EXPECT_EQ(std::size_t(15U), file.get_last_chunk()); + + for (std::size_t chunk = 8U; chunk <= 15U; ++chunk) { + EXPECT_FALSE(file.get_read_state(chunk)) << "chunk " << chunk; + } + } +} + +TEST_F(ring_buffer_open_file_test, + forward_center_marks_only_tail_entrants_unread) { + auto source_path = test::generate_test_file_name("ring_buffer_open_file"); + EXPECT_CALL(provider, is_read_only()).WillRepeatedly(Return(false)); + + filesystem_item fsi; + fsi.directory = false; + fsi.api_path = "/test.txt"; + fsi.size = test_chunk_size * 16U; + fsi.source_path = source_path; + + { + ring_buffer_open_file file(ring_buffer_dir, test_chunk_size, 30U, fsi, + provider, 8U); + + file.set(0U, 3U); + file.forward(2U); + + EXPECT_EQ(std::size_t(5U), file.get_current_chunk()); + EXPECT_EQ(std::size_t(1U), file.get_first_chunk()); + EXPECT_EQ(std::size_t(8U), file.get_last_chunk()); + + for (std::size_t chunk = 1U; chunk <= 7U; ++chunk) { + EXPECT_TRUE(file.get_read_state(chunk)) << "chunk " << chunk; + } + EXPECT_FALSE(file.get_read_state(8U)); + } +} + +TEST_F(ring_buffer_open_file_test, reverse_does_not_trigger_forward_centering) { + auto source_path = test::generate_test_file_name("ring_buffer_open_file"); + EXPECT_CALL(provider, is_read_only()).WillRepeatedly(Return(false)); + + filesystem_item fsi; + fsi.directory = false; + fsi.api_path = "/test.txt"; + fsi.size = test_chunk_size * 16U; + fsi.source_path = source_path; + + { + ring_buffer_open_file file(ring_buffer_dir, test_chunk_size, 30U, fsi, + provider, 8U); + + file.set(8U, 12U); + file.reverse(1U); + + EXPECT_EQ(std::size_t(11U), file.get_current_chunk()); + EXPECT_EQ(std::size_t(8U), file.get_first_chunk()); + EXPECT_EQ(std::size_t(15U), file.get_last_chunk()); + } +} + +TEST_F(ring_buffer_open_file_test, + forward_minimal_slide_then_center_multi_step) { + auto source_path = test::generate_test_file_name("ring_buffer_open_file"); + EXPECT_CALL(provider, is_read_only()).WillRepeatedly(Return(false)); + + filesystem_item fsi; + fsi.directory = false; + fsi.api_path = "/test.txt"; + fsi.size = test_chunk_size * 32U; + fsi.source_path = source_path; + + { + ring_buffer_open_file file(ring_buffer_dir, test_chunk_size, 30U, fsi, + provider, 8U); + + file.set(0U, 3U); + file.forward(7U); + + EXPECT_EQ(std::size_t(10U), file.get_current_chunk()); + EXPECT_EQ(std::size_t(6U), file.get_first_chunk()); + EXPECT_EQ(std::size_t(13U), file.get_last_chunk()); + + EXPECT_FALSE(file.get_read_state(11U)); + EXPECT_FALSE(file.get_read_state(12U)); + EXPECT_FALSE(file.get_read_state(13U)); + } +} } // namespace repertory