summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_parser_unittest.cpp
diff options
context:
space:
mode:
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());
+}