diff options
Diffstat (limited to 'core/fpdfapi/parser/cpdf_parser_unittest.cpp')
-rw-r--r-- | core/fpdfapi/parser/cpdf_parser_unittest.cpp | 71 |
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()); +} |