@@ -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+
517548class TestBufferedInputStreamBound : public ::testing::Test {
518549 public:
519550 void SetUp () { CreateExample (/* bounded=*/ true ); }
0 commit comments