summaryrefslogtreecommitdiff
path: root/core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp')
-rw-r--r--core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp64
1 files changed, 59 insertions, 5 deletions
diff --git a/core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp b/core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp
index af0e9ff745..8a7331d29b 100644
--- a/core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_hint_tables_unittest.cpp
@@ -10,9 +10,14 @@
#include "core/fpdfapi/cpdf_modulemgr.h"
#include "core/fpdfapi/parser/cpdf_data_avail.h"
+#include "core/fpdfapi/parser/cpdf_dictionary.h"
+#include "core/fpdfapi/parser/cpdf_linearized_header.h"
#include "core/fpdfapi/parser/cpdf_object.h"
+#include "core/fpdfapi/parser/cpdf_read_validator.h"
+#include "core/fpdfapi/parser/cpdf_stream.h"
#include "core/fpdfapi/parser/cpdf_syntax_parser.h"
#include "core/fxcrt/fx_stream.h"
+#include "testing/fx_string_testhelpers.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/utils/path_service.h"
@@ -20,16 +25,42 @@
namespace {
-std::unique_ptr<CPDF_DataAvail> MakeDataAvailFromFile(
+RetainPtr<CPDF_ReadValidator> MakeValidatorFromFile(
const std::string& file_name) {
std::string file_path;
- if (!PathService::GetTestFilePath(file_name, &file_path))
- return nullptr;
+ PathService::GetTestFilePath(file_name, &file_path);
+ ASSERT(!file_path.empty());
+ return pdfium::MakeRetain<CPDF_ReadValidator>(
+ IFX_SeekableReadStream::CreateFromFilename(file_path.c_str()), nullptr);
+}
+
+std::unique_ptr<CPDF_DataAvail> MakeDataAvailFromFile(
+ const std::string& file_name) {
return pdfium::MakeUnique<CPDF_DataAvail>(
- nullptr, IFX_SeekableReadStream::CreateFromFilename(file_path.c_str()),
- true);
+ nullptr, MakeValidatorFromFile(file_name), true);
}
+class TestLinearizedHeader : public CPDF_LinearizedHeader {
+ public:
+ TestLinearizedHeader(const CPDF_Dictionary* pDict,
+ FX_FILESIZE szLastXRefOffset)
+ : CPDF_LinearizedHeader(pDict, szLastXRefOffset) {}
+
+ static std::unique_ptr<CPDF_LinearizedHeader> MakeHeader(
+ const std::string& inline_data) {
+ CPDF_SyntaxParser parser;
+ parser.InitParser(
+ pdfium::MakeRetain<CFX_BufferSeekableReadStream>(
+ reinterpret_cast<const unsigned char*>(inline_data.data()),
+ inline_data.size()),
+ 0);
+ std::unique_ptr<CPDF_Dictionary> dict =
+ ToDictionary(parser.GetObjectBody(nullptr));
+ ASSERT(dict);
+ return pdfium::MakeUnique<TestLinearizedHeader>(dict.get(), 0);
+ }
+};
+
} // namespace
class CPDF_HintTablesTest : public testing::Test {
@@ -119,3 +150,26 @@ TEST_F(CPDF_HintTablesTest, PageAndGroupInfos) {
EXPECT_EQ(10939, hint_tables->SharedGroupInfos()[5].m_szOffset);
EXPECT_EQ(544u, hint_tables->SharedGroupInfos()[5].m_dwLength);
}
+
+TEST_F(CPDF_HintTablesTest, FirstPageOffset) {
+ // Test that valid hint table is loaded, and have correct offset of first page
+ // object.
+ const auto linearized_header = TestLinearizedHeader::MakeHeader(
+ "<< /Linearized 1 /L 19326762 /H [ 123730 3816 ] /O 5932 /E 639518 /N "
+ "102 /T 19220281 >>");
+ ASSERT_TRUE(linearized_header);
+ // This hint table is extracted from linearized file, generated by qpdf tool.
+ RetainPtr<CPDF_ReadValidator> validator =
+ MakeValidatorFromFile("hint_table_102p.bin");
+ CPDF_SyntaxParser parser;
+ parser.InitParserWithValidator(validator, 0);
+ std::unique_ptr<CPDF_Stream> stream = ToStream(parser.GetObjectBody(nullptr));
+ ASSERT_TRUE(stream);
+ auto hint_tables = pdfium::MakeUnique<CPDF_HintTables>(
+ validator.Get(), linearized_header.get());
+ // Check that hint table will load.
+ ASSERT_TRUE(hint_tables->LoadHintStream(stream.get()));
+ // Check that hint table have correct first page offset.
+ // 127546 is predefined real value from original file.
+ EXPECT_EQ(127546, hint_tables->GetFirstPageObjOffset());
+}