| 951 | } |
| 952 | |
| 953 | void TestReads() { |
| 954 | std::default_random_engine gen(/*seed*/ 42); |
| 955 | std::uniform_int_distribution<int64_t> read_len_dist(1, 80); |
| 956 | |
| 957 | int64_t pos = 0; |
| 958 | const int64_t size = static_cast<int64_t>(data_.size()); |
| 959 | while (pos < size) { |
| 960 | const int64_t read_len = read_len_dist(gen); |
| 961 | ASSERT_OK_AND_ASSIGN(auto buf, buffered_->Read(read_len)); |
| 962 | AssertBufferEqual(*buf, std::string_view(data_).substr(pos, read_len)); |
| 963 | pos += buf->size(); |
| 964 | } |
| 965 | |
| 966 | // EOF was reached |
| 967 | ASSERT_EQ(pos, size); |
| 968 | |
| 969 | // Number of reads should not be excessive given the buffer size |
| 970 | int64_t max_reads = (size + buffer_size_ - 1) / buffer_size_; |
| 971 | EXPECT_LE(tracked_->num_reads(), max_reads); |
| 972 | const auto& read_ranges = tracked_->get_read_ranges(); |
| 973 | pos = 0; |
| 974 | for (size_t i = 0; i < read_ranges.size(); ++i) { |
| 975 | const auto cur = read_ranges[i]; |
| 976 | ASSERT_EQ(cur.offset, pos); |
| 977 | // Never read less than buffer size bytes, except perhaps if fewer bytes remain |
| 978 | ASSERT_GE(cur.length, std::min(buffer_size_, size - pos)); |
| 979 | // Bump actual position in the file |
| 980 | pos += std::min(cur.length, size - pos); |
| 981 | } |
| 982 | |
| 983 | // Further reads return an empty buffer |
| 984 | ASSERT_OK_AND_ASSIGN(auto buf, buffered_->Read(buffer_size_ - 1)); |
| 985 | AssertBufferEqual(*buf, ""); |
| 986 | ASSERT_OK_AND_ASSIGN(buf, buffered_->Read(buffer_size_ + 1)); |
| 987 | AssertBufferEqual(*buf, ""); |
| 988 | } |
| 989 | |
| 990 | protected: |
| 991 | std::string data_; |
nothing calls this directly
no test coverage detected