diff options
author | Sen Jiang <senj@google.com> | 2015-11-26 00:08:14 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2015-11-26 00:08:14 +0000 |
commit | 0ef2f7e3c2c40d2153c203173c1641e06edfe95b (patch) | |
tree | 931a9da43536b45e312264296ffc468d64806914 | |
parent | 0fc620f2501b5e40fb590c6820436490a6b8f369 (diff) | |
parent | 2c1607d13402172c129d73d76a6a351e78a44328 (diff) | |
download | bsdiff-nougat-cts-release.tar.gz |
Merge "Fix reading extents file if not start from the beginning of a extent."android-cts-7.0_r9android-cts-7.0_r8android-cts-7.0_r7android-cts-7.0_r6android-cts-7.0_r5android-cts-7.0_r4android-cts-7.0_r33android-cts-7.0_r32android-cts-7.0_r31android-cts-7.0_r30android-cts-7.0_r3android-cts-7.0_r29android-cts-7.0_r28android-cts-7.0_r27android-cts-7.0_r26android-cts-7.0_r25android-cts-7.0_r24android-cts-7.0_r23android-cts-7.0_r22android-cts-7.0_r21android-cts-7.0_r20android-cts-7.0_r2android-cts-7.0_r19android-cts-7.0_r18android-cts-7.0_r17android-cts-7.0_r16android-cts-7.0_r15android-cts-7.0_r14android-cts-7.0_r13android-cts-7.0_r12android-cts-7.0_r11android-cts-7.0_r10android-cts-7.0_r1android-7.0.0_r9android-7.0.0_r8android-7.0.0_r7android-7.0.0_r6android-7.0.0_r5android-7.0.0_r4android-7.0.0_r36android-7.0.0_r35android-7.0.0_r34android-7.0.0_r33android-7.0.0_r32android-7.0.0_r31android-7.0.0_r30android-7.0.0_r3android-7.0.0_r29android-7.0.0_r28android-7.0.0_r27android-7.0.0_r24android-7.0.0_r21android-7.0.0_r19android-7.0.0_r17android-7.0.0_r15android-7.0.0_r14android-7.0.0_r13android-7.0.0_r12android-7.0.0_r11android-7.0.0_r10android-7.0.0_r1nougat-releasenougat-mr0.5-releasenougat-devnougat-cts-releasenougat-bugfix-release
am: 2c1607d134
* commit '2c1607d13402172c129d73d76a6a351e78a44328':
Fix reading extents file if not start from the beginning of a extent.
-rw-r--r-- | extents_file.cc | 9 | ||||
-rw-r--r-- | extents_file_unittest.cc | 26 |
2 files changed, 31 insertions, 4 deletions
diff --git a/extents_file.cc b/extents_file.cc index 2d2ea83..01d31a6 100644 --- a/extents_file.cc +++ b/extents_file.cc @@ -86,14 +86,15 @@ bool ExtentsFile::IOOperation(bool (FileInterface::*io_op)(T*, size_t, size_t*), AdvancePos(0); while (count > 0 && curr_ex_idx_ < extents_.size()) { const ex_t& ex = extents_[curr_ex_idx_]; - size_t chunk_size = std::min(static_cast<uint64_t>(count), ex.len); + off_t curr_ex_off = curr_pos_ - acc_len_[curr_ex_idx_]; + size_t chunk_size = + std::min(static_cast<uint64_t>(count), ex.len - curr_ex_off); size_t chunk_processed = 0; if (ex.off < 0) { chunk_processed = chunk_size; } else { - uint64_t file_pos = ex.off + (curr_pos_ - acc_len_[curr_ex_idx_]); - if (!file_->Seek(file_pos) || - !((file_.get()->*io_op))(buf, chunk_size, &chunk_processed)) { + if (!file_->Seek(ex.off + curr_ex_off) || + !(file_.get()->*io_op)(buf, chunk_size, &chunk_processed)) { processed += chunk_processed; result = processed > 0; break; diff --git a/extents_file_unittest.cc b/extents_file_unittest.cc index fa9ed22..73cedb2 100644 --- a/extents_file_unittest.cc +++ b/extents_file_unittest.cc @@ -128,6 +128,32 @@ TEST_F(ExtentsFileTest, ReadAcrossAllExtents) { EXPECT_EQ(15U, bytes_read); } +TEST_F(ExtentsFileTest, MultiReadAcrossAllExtents) { + ExtentsFile file(std::move(mock_file_ptr_), + {ex_t{10, 5}, ex_t{20, 7}, {27, 3}}); + InSequence s; + char* buf = reinterpret_cast<char*>(0x1234); + + EXPECT_CALL(*mock_file_, Seek(10)).WillOnce(Return(true)); + EXPECT_CALL(*mock_file_, Read(buf, 2, _)).WillOnce(SucceedIO()); + EXPECT_CALL(*mock_file_, Seek(12)).WillOnce(Return(true)); + EXPECT_CALL(*mock_file_, Read(buf, 3, _)).WillOnce(SucceedIO()); + EXPECT_CALL(*mock_file_, Seek(20)).WillOnce(Return(true)); + EXPECT_CALL(*mock_file_, Read(buf + 3, 5, _)).WillOnce(SucceedIO()); + EXPECT_CALL(*mock_file_, Seek(25)).WillOnce(Return(true)); + EXPECT_CALL(*mock_file_, Read(buf, 2, _)).WillOnce(SucceedIO()); + EXPECT_CALL(*mock_file_, Seek(27)).WillOnce(Return(true)); + EXPECT_CALL(*mock_file_, Read(buf + 2, 3, _)).WillOnce(SucceedIO()); + + size_t bytes_read = 0; + EXPECT_TRUE(file.Read(buf, 2, &bytes_read)); + EXPECT_EQ(2U, bytes_read); + EXPECT_TRUE(file.Read(buf, 8, &bytes_read)); + EXPECT_EQ(8U, bytes_read); + EXPECT_TRUE(file.Read(buf, 100, &bytes_read)); + EXPECT_EQ(5U, bytes_read); +} + TEST_F(ExtentsFileTest, ReadSmallChunks) { ExtentsFile file(std::move(mock_file_ptr_), {ex_t{10, 1}, ex_t{20, 10}}); InSequence s; |