summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_read_validator_unittest.cpp
diff options
context:
space:
mode:
authorArtem Strygin <art-snake@yandex-team.ru>2017-07-29 00:57:23 +0300
committerChromium commit bot <commit-bot@chromium.org>2017-08-01 22:10:54 +0000
commit7d8544ad898255fc4dffab0a36c6cb69fce421a1 (patch)
treee03a9a8b3844b97d1f534f81862b72a0be418f6b /core/fpdfapi/parser/cpdf_read_validator_unittest.cpp
parent1c5d8504ed38dbf19ae4dee04360cf0893cdb18f (diff)
downloadpdfium-7d8544ad898255fc4dffab0a36c6cb69fce421a1.tar.xz
Implement read Session.
Helper for validate read problems locally, Change-Id: I2bfbbaab8a67c0fd0cee3dadcd0f9cad5953101c Reviewed-on: https://pdfium-review.googlesource.com/9552 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Art Snake <art-snake@yandex-team.ru>
Diffstat (limited to 'core/fpdfapi/parser/cpdf_read_validator_unittest.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_read_validator_unittest.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/core/fpdfapi/parser/cpdf_read_validator_unittest.cpp b/core/fpdfapi/parser/cpdf_read_validator_unittest.cpp
index f0e47f552c..cb6c07ecb6 100644
--- a/core/fpdfapi/parser/cpdf_read_validator_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_read_validator_unittest.cpp
@@ -178,3 +178,83 @@ TEST(CPDF_ReadValidatorTest, IntOverflow) {
EXPECT_FALSE(validator->read_error());
EXPECT_FALSE(validator->has_unavailable_data());
}
+
+TEST(CPDF_ReadValidatorTest, Session) {
+ std::vector<uint8_t> test_data(kTestDataSize);
+
+ auto file = pdfium::MakeRetain<InvalidReader>();
+ MockFileAvail file_avail;
+ MockDownloadHints hints;
+ auto validator = pdfium::MakeRetain<CPDF_ReadValidator>(file, &file_avail);
+ validator->SetDownloadHints(&hints);
+
+ const CPDF_ReadValidator::Session read_session(validator.Get());
+ ASSERT_FALSE(validator->has_read_problems());
+
+ // Data is unavailable
+ validator->ReadBlock(test_data.data(), 0, 100);
+
+ EXPECT_TRUE(validator->has_read_problems());
+ EXPECT_TRUE(validator->has_unavailable_data());
+ EXPECT_FALSE(validator->read_error());
+
+ {
+ const CPDF_ReadValidator::Session read_subsession(validator.Get());
+ // The read problems should be hidden.
+ EXPECT_FALSE(validator->has_read_problems());
+
+ file_avail.SetAvailableRange(0, 100);
+ // Read fail.
+ validator->ReadBlock(test_data.data(), 0, 100);
+ EXPECT_TRUE(validator->has_read_problems());
+ EXPECT_TRUE(validator->has_unavailable_data());
+ EXPECT_TRUE(validator->read_error());
+ }
+
+ // The problems should be merged
+ EXPECT_TRUE(validator->has_read_problems());
+ EXPECT_TRUE(validator->has_unavailable_data());
+ EXPECT_TRUE(validator->read_error());
+}
+
+TEST(CPDF_ReadValidatorTest, SessionReset) {
+ std::vector<uint8_t> test_data(kTestDataSize);
+
+ auto file = pdfium::MakeRetain<InvalidReader>();
+ MockFileAvail file_avail;
+ MockDownloadHints hints;
+ auto validator = pdfium::MakeRetain<CPDF_ReadValidator>(file, &file_avail);
+ validator->SetDownloadHints(&hints);
+
+ const CPDF_ReadValidator::Session read_session(validator.Get());
+ ASSERT_FALSE(validator->has_read_problems());
+
+ // Data is unavailable
+ validator->ReadBlock(test_data.data(), 0, 100);
+
+ EXPECT_TRUE(validator->has_read_problems());
+ EXPECT_TRUE(validator->has_unavailable_data());
+ EXPECT_FALSE(validator->read_error());
+
+ {
+ const CPDF_ReadValidator::Session read_subsession(validator.Get());
+ // The read problems should be hidden.
+ EXPECT_FALSE(validator->has_read_problems());
+
+ file_avail.SetAvailableRange(0, 100);
+ // Read fail.
+ validator->ReadBlock(test_data.data(), 0, 100);
+ EXPECT_TRUE(validator->has_read_problems());
+ EXPECT_TRUE(validator->has_unavailable_data());
+ EXPECT_TRUE(validator->read_error());
+
+ // Reset session.
+ validator->ResetErrors();
+ EXPECT_FALSE(validator->has_read_problems());
+ }
+
+ // The problems should be restored.
+ EXPECT_TRUE(validator->has_read_problems());
+ EXPECT_TRUE(validator->has_unavailable_data());
+ EXPECT_FALSE(validator->read_error());
+}