Skip to content

Commit ad29f64

Browse files
committed
fix
1 parent 73741a3 commit ad29f64

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

cpp/src/arrow/io/buffered_test.cc

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,37 @@ TEST_F(TestBufferedInputStream, PeekPastBufferedBytes) {
514514
ASSERT_EQ(0, buffered_->bytes_buffered());
515515
}
516516

517+
TEST_F(TestBufferedInputStream, PeekAfterExhaustingBuffer) {
518+
// GH-48311: When bytes_buffered_ == 0 and raw_read_bound_ >= 0,
519+
// SetBufferSize should reset buffer_pos_ to 0 and reuse the beginning of the buffer
520+
MakeExample1(/*buffer_size=*/10, default_memory_pool(), /*raw_read_bound=*/25);
521+
522+
// Read all buffered bytes to exhaust the buffer (bytes_buffered_ == 0)
523+
// At this point, buffer_pos_ may be non-zero if we've consumed the buffer
524+
ASSERT_OK_AND_ASSIGN(auto view, buffered_->Peek(10));
525+
EXPECT_EQ(view, kExample1.substr(0, 10));
526+
ASSERT_EQ(10, buffered_->bytes_buffered());
527+
ASSERT_EQ(10, buffered_->buffer_size());
528+
ASSERT_OK_AND_ASSIGN(auto bytes, buffered_->Read(10));
529+
EXPECT_EQ(std::string_view(*bytes), kExample1.substr(0, 10));
530+
ASSERT_EQ(0, buffered_->bytes_buffered());
531+
ASSERT_EQ(10, buffered_->buffer_size());
532+
533+
// Peek should trigger SetBufferSize with bytes_buffered_ == 0,
534+
// which should reset buffer_pos_ to 0 and reuse the beginning of the buffer,
535+
// so resulting size of the buffer should be 15 instead of 25
536+
ASSERT_OK_AND_ASSIGN(view, buffered_->Peek(15));
537+
EXPECT_EQ(view, kExample1.substr(10, 15));
538+
ASSERT_EQ(15, buffered_->bytes_buffered());
539+
ASSERT_EQ(15, buffered_->buffer_size());
540+
541+
// Do read just in case
542+
ASSERT_OK_AND_ASSIGN(bytes, buffered_->Read(15));
543+
EXPECT_EQ(std::string_view(*bytes), kExample1.substr(10, 15));
544+
ASSERT_EQ(0, buffered_->bytes_buffered());
545+
ASSERT_EQ(15, buffered_->buffer_size());
546+
}
547+
517548
class TestBufferedInputStreamBound : public ::testing::Test {
518549
public:
519550
void SetUp() { CreateExample(/*bounded=*/true); }

0 commit comments

Comments
 (0)