xref: /aosp_15_r20/external/pdfium/fpdfsdk/fpdf_thumbnail_embeddertest.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2019 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <vector>
6 
7 #include "public/fpdf_thumbnail.h"
8 #include "public/fpdfview.h"
9 #include "testing/embedder_test.h"
10 #include "testing/utils/hash.h"
11 
12 namespace {
13 
14 const char kSimpleThumbnailChecksum[] = "f6a8e8db01cccd52abb91ea433a17373";
15 const char kThumbnailWithNoFiltersChecksum[] =
16     "b5696e586382b3373741f8a1d651cab0";
17 
18 }  // namespace
19 
20 class FPDFThumbnailEmbedderTest : public EmbedderTest {};
21 
TEST_F(FPDFThumbnailEmbedderTest,GetDecodedThumbnailDataFromPageWithFilters)22 TEST_F(FPDFThumbnailEmbedderTest, GetDecodedThumbnailDataFromPageWithFilters) {
23   ASSERT_TRUE(OpenDocument("simple_thumbnail.pdf"));
24 
25   {
26     const char kHashedDecodedData[] = "7902d0be831c9024960f4ebd5d7df1f7";
27     const unsigned long kExpectedSize = 1138u;
28 
29     FPDF_PAGE page = LoadPage(0);
30     ASSERT_TRUE(page);
31 
32     unsigned long length_bytes =
33         FPDFPage_GetDecodedThumbnailData(page, nullptr, 0);
34     ASSERT_EQ(kExpectedSize, length_bytes);
35     std::vector<uint8_t> thumb_buf(length_bytes);
36 
37     EXPECT_EQ(kExpectedSize, FPDFPage_GetDecodedThumbnailData(
38                                  page, thumb_buf.data(), length_bytes));
39     EXPECT_EQ(kHashedDecodedData, GenerateMD5Base16(thumb_buf));
40 
41     UnloadPage(page);
42   }
43 
44   {
45     const char kHashedDecodedData[] = "e81123a573378ba1ea80461d25cc41f6";
46     const unsigned long kExpectedSize = 1110u;
47 
48     FPDF_PAGE page = LoadPage(1);
49     ASSERT_TRUE(page);
50 
51     unsigned long length_bytes =
52         FPDFPage_GetDecodedThumbnailData(page, nullptr, 0);
53     ASSERT_EQ(kExpectedSize, length_bytes);
54     std::vector<uint8_t> thumb_buf(length_bytes);
55 
56     EXPECT_EQ(kExpectedSize, FPDFPage_GetDecodedThumbnailData(
57                                  page, thumb_buf.data(), length_bytes));
58     EXPECT_EQ(kHashedDecodedData, GenerateMD5Base16(thumb_buf));
59 
60     UnloadPage(page);
61   }
62 }
63 
TEST_F(FPDFThumbnailEmbedderTest,GetDecodedThumbnailDataFromPageWithNoFilters)64 TEST_F(FPDFThumbnailEmbedderTest,
65        GetDecodedThumbnailDataFromPageWithNoFilters) {
66   ASSERT_TRUE(OpenDocument("thumbnail_with_no_filters.pdf"));
67 
68   const unsigned long kExpectedSize = 301u;
69 
70   FPDF_PAGE page = LoadPage(0);
71   ASSERT_TRUE(page);
72 
73   unsigned long length_bytes =
74       FPDFPage_GetDecodedThumbnailData(page, nullptr, 0);
75   ASSERT_EQ(kExpectedSize, length_bytes);
76   std::vector<uint8_t> thumb_buf(length_bytes);
77 
78   EXPECT_EQ(kExpectedSize, FPDFPage_GetDecodedThumbnailData(
79                                page, thumb_buf.data(), length_bytes));
80   EXPECT_EQ(kThumbnailWithNoFiltersChecksum, GenerateMD5Base16(thumb_buf));
81 
82   UnloadPage(page);
83 }
84 
TEST_F(FPDFThumbnailEmbedderTest,GetDecodedThumbnailDataFromPageWithNoThumbnails)85 TEST_F(FPDFThumbnailEmbedderTest,
86        GetDecodedThumbnailDataFromPageWithNoThumbnails) {
87   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
88 
89   FPDF_PAGE page = LoadPage(0);
90   ASSERT_TRUE(page);
91 
92   EXPECT_EQ(0u, FPDFPage_GetDecodedThumbnailData(page, nullptr, 0));
93 
94   UnloadPage(page);
95 }
96 
TEST_F(FPDFThumbnailEmbedderTest,GetDecodedThumbnailDataFromPageNullPage)97 TEST_F(FPDFThumbnailEmbedderTest, GetDecodedThumbnailDataFromPageNullPage) {
98   EXPECT_EQ(0u, FPDFPage_GetDecodedThumbnailData(nullptr, nullptr, 0));
99 }
100 
TEST_F(FPDFThumbnailEmbedderTest,GetRawThumbnailDataFromPageWithFilters)101 TEST_F(FPDFThumbnailEmbedderTest, GetRawThumbnailDataFromPageWithFilters) {
102   ASSERT_TRUE(OpenDocument("simple_thumbnail.pdf"));
103 
104   {
105     const unsigned long kExpectedSize = 1851u;
106 
107     FPDF_PAGE page = LoadPage(0);
108     ASSERT_TRUE(page);
109 
110     unsigned long length_bytes = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
111     ASSERT_EQ(kExpectedSize, length_bytes);
112     std::vector<uint8_t> thumb_buf(length_bytes);
113 
114     EXPECT_EQ(kExpectedSize, FPDFPage_GetRawThumbnailData(
115                                  page, thumb_buf.data(), length_bytes));
116     EXPECT_EQ(kSimpleThumbnailChecksum, GenerateMD5Base16(thumb_buf));
117 
118     UnloadPage(page);
119   }
120 
121   {
122     const char kHashedRawData[] = "c7558a461d5ecfb1d4757218b473afc0";
123     const unsigned long kExpectedSize = 1792u;
124 
125     FPDF_PAGE page = LoadPage(1);
126     ASSERT_TRUE(page);
127 
128     unsigned long length_bytes = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
129     ASSERT_EQ(kExpectedSize, length_bytes);
130     std::vector<uint8_t> thumb_buf(length_bytes);
131 
132     EXPECT_EQ(kExpectedSize, FPDFPage_GetRawThumbnailData(
133                                  page, thumb_buf.data(), length_bytes));
134     EXPECT_EQ(kHashedRawData, GenerateMD5Base16(thumb_buf));
135 
136     UnloadPage(page);
137   }
138 }
139 
TEST_F(FPDFThumbnailEmbedderTest,GetRawThumbnailDataFromPageWithNoFilters)140 TEST_F(FPDFThumbnailEmbedderTest, GetRawThumbnailDataFromPageWithNoFilters) {
141   ASSERT_TRUE(OpenDocument("thumbnail_with_no_filters.pdf"));
142 
143   const unsigned long kExpectedSize = 301u;
144 
145   FPDF_PAGE page = LoadPage(0);
146   ASSERT_TRUE(page);
147 
148   unsigned long length_bytes = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
149   ASSERT_EQ(kExpectedSize, length_bytes);
150   std::vector<uint8_t> thumb_buf(length_bytes);
151 
152   EXPECT_EQ(kExpectedSize,
153             FPDFPage_GetRawThumbnailData(page, thumb_buf.data(), length_bytes));
154   EXPECT_EQ(kThumbnailWithNoFiltersChecksum, GenerateMD5Base16(thumb_buf));
155 
156   UnloadPage(page);
157 }
158 
TEST_F(FPDFThumbnailEmbedderTest,GetRawThumbnailDataFromPageWithNoThumbnails)159 TEST_F(FPDFThumbnailEmbedderTest, GetRawThumbnailDataFromPageWithNoThumbnails) {
160   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
161 
162   FPDF_PAGE page = LoadPage(0);
163   ASSERT_TRUE(page);
164 
165   EXPECT_EQ(0u, FPDFPage_GetRawThumbnailData(page, nullptr, 0));
166 
167   UnloadPage(page);
168 }
169 
TEST_F(FPDFThumbnailEmbedderTest,GetRawThumbnailDataFromPageNullPage)170 TEST_F(FPDFThumbnailEmbedderTest, GetRawThumbnailDataFromPageNullPage) {
171   EXPECT_EQ(0u, FPDFPage_GetRawThumbnailData(nullptr, nullptr, 0));
172 }
173 
TEST_F(FPDFThumbnailEmbedderTest,GetThumbnailAsBitmapFromPage)174 TEST_F(FPDFThumbnailEmbedderTest, GetThumbnailAsBitmapFromPage) {
175   ASSERT_TRUE(OpenDocument("simple_thumbnail.pdf"));
176 
177   {
178     FPDF_PAGE page = LoadPage(0);
179     ASSERT_TRUE(page);
180 
181     ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
182 
183     EXPECT_EQ(50, FPDFBitmap_GetWidth(thumb_bitmap.get()));
184     EXPECT_EQ(50, FPDFBitmap_GetHeight(thumb_bitmap.get()));
185     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(thumb_bitmap.get()));
186     CompareBitmap(thumb_bitmap.get(), 50, 50,
187                   "52b75451e396f55e95d1cb68e6018226");
188 
189     UnloadPage(page);
190   }
191 
192   {
193     FPDF_PAGE page = LoadPage(1);
194     ASSERT_TRUE(page);
195 
196     ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
197 
198     EXPECT_EQ(50, FPDFBitmap_GetWidth(thumb_bitmap.get()));
199     EXPECT_EQ(50, FPDFBitmap_GetHeight(thumb_bitmap.get()));
200     EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(thumb_bitmap.get()));
201     CompareBitmap(thumb_bitmap.get(), 50, 50,
202                   "1f448be08c6e6043ccd0bad8ecc2a351");
203 
204     UnloadPage(page);
205   }
206 }
207 
TEST_F(FPDFThumbnailEmbedderTest,GetThumbnailAsBitmapFromPageWithoutThumbnail)208 TEST_F(FPDFThumbnailEmbedderTest,
209        GetThumbnailAsBitmapFromPageWithoutThumbnail) {
210   ASSERT_TRUE(OpenDocument("hello_world.pdf"));
211 
212   FPDF_PAGE page = LoadPage(0);
213   ASSERT_TRUE(page);
214 
215   ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
216   ASSERT_EQ(nullptr, thumb_bitmap.get());
217 
218   UnloadPage(page);
219 }
220 
TEST_F(FPDFThumbnailEmbedderTest,GetThumbnailAsBitmapFromThumbnailWithEmptyStream)221 TEST_F(FPDFThumbnailEmbedderTest,
222        GetThumbnailAsBitmapFromThumbnailWithEmptyStream) {
223   ASSERT_TRUE(OpenDocument("thumbnail_with_empty_stream.pdf"));
224 
225   FPDF_PAGE page = LoadPage(0);
226   ASSERT_TRUE(page);
227 
228   ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
229   ASSERT_EQ(nullptr, thumb_bitmap.get());
230 
231   UnloadPage(page);
232 }
233 
TEST_F(FPDFThumbnailEmbedderTest,GetThumbnailAsBitmapFromThumbnailWithNoFilters)234 TEST_F(FPDFThumbnailEmbedderTest,
235        GetThumbnailAsBitmapFromThumbnailWithNoFilters) {
236   ASSERT_TRUE(OpenDocument("thumbnail_with_no_filters.pdf"));
237 
238   FPDF_PAGE page = LoadPage(0);
239   ASSERT_TRUE(page);
240 
241   ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
242 
243   EXPECT_EQ(10, FPDFBitmap_GetWidth(thumb_bitmap.get()));
244   EXPECT_EQ(10, FPDFBitmap_GetHeight(thumb_bitmap.get()));
245   EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(thumb_bitmap.get()));
246   CompareBitmap(thumb_bitmap.get(), 10, 10, "fe02583f9e6d094042a942ff686e9936");
247 
248   UnloadPage(page);
249 }
250 
TEST_F(FPDFThumbnailEmbedderTest,GetThumbnailDoesNotAlterPage)251 TEST_F(FPDFThumbnailEmbedderTest, GetThumbnailDoesNotAlterPage) {
252   ASSERT_TRUE(OpenDocument("simple_thumbnail.pdf"));
253 
254   const unsigned long kExpectedRawSize = 1851u;
255 
256   FPDF_PAGE page = LoadPage(0);
257   ASSERT_TRUE(page);
258 
259   // Get the raw data
260   unsigned long raw_size = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
261   ASSERT_EQ(kExpectedRawSize, raw_size);
262   std::vector<uint8_t> raw_thumb_buf(raw_size);
263 
264   EXPECT_EQ(kExpectedRawSize,
265             FPDFPage_GetRawThumbnailData(page, raw_thumb_buf.data(), raw_size));
266   EXPECT_EQ(kSimpleThumbnailChecksum, GenerateMD5Base16(raw_thumb_buf));
267 
268   // Get the thumbnail
269   ScopedFPDFBitmap thumb_bitmap(FPDFPage_GetThumbnailAsBitmap(page));
270 
271   EXPECT_EQ(50, FPDFBitmap_GetWidth(thumb_bitmap.get()));
272   EXPECT_EQ(50, FPDFBitmap_GetHeight(thumb_bitmap.get()));
273   EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(thumb_bitmap.get()));
274   CompareBitmap(thumb_bitmap.get(), 50, 50, "52b75451e396f55e95d1cb68e6018226");
275 
276   // Get the raw data again
277   unsigned long new_raw_size = FPDFPage_GetRawThumbnailData(page, nullptr, 0);
278   ASSERT_EQ(kExpectedRawSize, new_raw_size);
279   std::vector<uint8_t> new_raw_thumb_buf(new_raw_size);
280 
281   EXPECT_EQ(kExpectedRawSize,
282             FPDFPage_GetRawThumbnailData(page, new_raw_thumb_buf.data(),
283                                          new_raw_size));
284   EXPECT_EQ(kSimpleThumbnailChecksum, GenerateMD5Base16(new_raw_thumb_buf));
285 
286   UnloadPage(page);
287 }
288 
TEST_F(FPDFThumbnailEmbedderTest,GetThumbnailAsBitmapFromPageNullPage)289 TEST_F(FPDFThumbnailEmbedderTest, GetThumbnailAsBitmapFromPageNullPage) {
290   EXPECT_FALSE(FPDFPage_GetThumbnailAsBitmap(nullptr));
291 }
292