summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_parser_unittest.cpp
diff options
context:
space:
mode:
authorArtem Strygin <art-snake@yandex-team.ru>2018-07-25 02:28:35 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-07-25 02:28:35 +0000
commit70ddc1ca22ad44a77006491b604a75f6514a4aa8 (patch)
tree1aab47245a415069f425fac877fd361352fb2a27 /core/fpdfapi/parser/cpdf_parser_unittest.cpp
parent36b2059cae7fc851c9f35babd35ec82a7a5d9694 (diff)
downloadpdfium-70ddc1ca22ad44a77006491b604a75f6514a4aa8.tar.xz
Use document size instead of file size while parsing.
We should use document size instead of File size, because all offsets and sizes was read from document should take into account of header offset. Added some tests of parsing of documents with header offset. Also drop friendship of CPDF_SyntaxParser with CPDF_Parser. Change-Id: Iebec75ab2ee07fb644a6c653b4ef5c2e09af09fe Reviewed-on: https://pdfium-review.googlesource.com/35830 Commit-Queue: Art Snake <art-snake@yandex-team.ru> Reviewed-by: Lei Zhang <thestig@chromium.org>
Diffstat (limited to 'core/fpdfapi/parser/cpdf_parser_unittest.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_parser_unittest.cpp71
1 files changed, 68 insertions, 3 deletions
diff --git a/core/fpdfapi/parser/cpdf_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
index db48493c2f..4ce1238ee3 100644
--- a/core/fpdfapi/parser/cpdf_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_parser_unittest.cpp
@@ -3,8 +3,12 @@
// found in the LICENSE file.
#include <limits>
+#include <memory>
#include <string>
+#include <vector>
+#include "core/fpdfapi/parser/cpdf_linearized_header.h"
+#include "core/fpdfapi/parser/cpdf_object.h"
#include "core/fpdfapi/parser/cpdf_parser.h"
#include "core/fpdfapi/parser/cpdf_syntax_parser.h"
#include "core/fxcrt/fx_extension.h"
@@ -43,13 +47,19 @@ class CPDF_TestParser : public CPDF_Parser {
}
// Setup reading from a buffer and initial states.
- bool InitTestFromBuffer(const unsigned char* buffer, size_t len) {
- // For the test file, the header is set at the beginning.
+ bool InitTestFromBufferWithOffset(const unsigned char* buffer,
+ size_t len,
+ int header_offset) {
m_pSyntax->InitParser(
- pdfium::MakeRetain<CFX_BufferSeekableReadStream>(buffer, len), 0);
+ pdfium::MakeRetain<CFX_BufferSeekableReadStream>(buffer, len),
+ header_offset);
return true;
}
+ bool InitTestFromBuffer(const unsigned char* buffer, size_t len) {
+ return InitTestFromBufferWithOffset(buffer, len, 0 /*header_offset*/);
+ }
+
private:
// Add test cases here as private friend so that protected members in
// CPDF_Parser can be accessed by test cases.
@@ -226,3 +236,58 @@ TEST(cpdf_parser, LoadCrossRefV4) {
}
}
}
+
+TEST(cpdf_parser, ParseStartXRef) {
+ CPDF_TestParser parser;
+ std::string test_file;
+ ASSERT_TRUE(
+ PathService::GetTestFilePath("annotation_stamp_with_ap.pdf", &test_file));
+ ASSERT_TRUE(parser.InitTestFromFile(test_file.c_str())) << test_file;
+
+ EXPECT_EQ(100940, parser.ParseStartXRef());
+ std::unique_ptr<CPDF_Object> cross_ref_v5_obj =
+ parser.ParseIndirectObjectAt(100940, 0);
+ ASSERT_TRUE(cross_ref_v5_obj);
+ EXPECT_EQ(75u, cross_ref_v5_obj->GetObjNum());
+}
+
+TEST(cpdf_parser, ParseStartXRefWithHeaderOffset) {
+ static constexpr FX_FILESIZE kTestHeaderOffset = 765;
+ std::string test_file;
+ ASSERT_TRUE(
+ PathService::GetTestFilePath("annotation_stamp_with_ap.pdf", &test_file));
+ RetainPtr<IFX_SeekableReadStream> pFileAccess =
+ IFX_SeekableReadStream::CreateFromFilename(test_file.c_str());
+ ASSERT_TRUE(pFileAccess);
+
+ std::vector<unsigned char> data(pFileAccess->GetSize() + kTestHeaderOffset);
+ ASSERT_TRUE(pFileAccess->ReadBlock(&data.front() + kTestHeaderOffset, 0,
+ pFileAccess->GetSize()));
+ CPDF_TestParser parser;
+ parser.InitTestFromBufferWithOffset(&data.front(), data.size(),
+ kTestHeaderOffset);
+
+ EXPECT_EQ(100940, parser.ParseStartXRef());
+ std::unique_ptr<CPDF_Object> cross_ref_v5_obj =
+ parser.ParseIndirectObjectAt(100940, 0);
+ ASSERT_TRUE(cross_ref_v5_obj);
+ EXPECT_EQ(75u, cross_ref_v5_obj->GetObjNum());
+}
+
+TEST(cpdf_parser, ParseLinearizedWithHeaderOffset) {
+ static constexpr FX_FILESIZE kTestHeaderOffset = 765;
+ std::string test_file;
+ ASSERT_TRUE(PathService::GetTestFilePath("linearized.pdf", &test_file));
+ RetainPtr<IFX_SeekableReadStream> pFileAccess =
+ IFX_SeekableReadStream::CreateFromFilename(test_file.c_str());
+ ASSERT_TRUE(pFileAccess);
+
+ std::vector<unsigned char> data(pFileAccess->GetSize() + kTestHeaderOffset);
+ ASSERT_TRUE(pFileAccess->ReadBlock(&data.front() + kTestHeaderOffset, 0,
+ pFileAccess->GetSize()));
+ CPDF_TestParser parser;
+ parser.InitTestFromBufferWithOffset(&data.front(), data.size(),
+ kTestHeaderOffset);
+
+ EXPECT_TRUE(parser.ParseLinearizedHeader());
+}