blob: d57169221b3dc2d13b62526aa55b2fb532e712cf [file] [log] [blame]
tsepez211d4ed2016-11-11 17:23:48 -08001// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Dan Sinclair957480c2017-06-13 15:21:14 -04004#include <string>
tsepez211d4ed2016-11-11 17:23:48 -08005
6#include "core/fxcrt/fx_basic.h"
7#include "public/fpdf_edit.h"
Dan Sinclair957480c2017-06-13 15:21:14 -04008#include "public/fpdf_ppo.h"
Nicolas Pena3ff54002017-07-05 11:55:35 -04009#include "public/fpdf_save.h"
tsepez211d4ed2016-11-11 17:23:48 -080010#include "public/fpdfview.h"
11#include "testing/embedder_test.h"
12#include "testing/gtest/include/gtest/gtest.h"
13#include "testing/test_support.h"
14
15namespace {
16
17class FPDFPPOEmbeddertest : public EmbedderTest {};
18
Wei Li6bdd8242017-03-23 09:45:04 -070019int FakeBlockWriter(FPDF_FILEWRITE* pThis,
20 const void* pData,
21 unsigned long size) {
22 return size;
23}
24
tsepez211d4ed2016-11-11 17:23:48 -080025} // namespace
26
27TEST_F(FPDFPPOEmbeddertest, NoViewerPreferences) {
28 EXPECT_TRUE(OpenDocument("hello_world.pdf"));
29
30 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
31 EXPECT_TRUE(output_doc);
32 EXPECT_FALSE(FPDF_CopyViewerPreferences(output_doc, document()));
33 FPDF_CloseDocument(output_doc);
34}
35
36TEST_F(FPDFPPOEmbeddertest, ViewerPreferences) {
37 EXPECT_TRUE(OpenDocument("viewer_ref.pdf"));
38
39 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
40 EXPECT_TRUE(output_doc);
41 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
42 FPDF_CloseDocument(output_doc);
43}
44
45TEST_F(FPDFPPOEmbeddertest, ImportPages) {
Wei Li6bdd8242017-03-23 09:45:04 -070046 ASSERT_TRUE(OpenDocument("viewer_ref.pdf"));
tsepez211d4ed2016-11-11 17:23:48 -080047
48 FPDF_PAGE page = LoadPage(0);
49 EXPECT_TRUE(page);
50
51 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
Wei Li6bdd8242017-03-23 09:45:04 -070052 ASSERT_TRUE(output_doc);
tsepez211d4ed2016-11-11 17:23:48 -080053 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
54 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1", 0));
55 EXPECT_EQ(1, FPDF_GetPageCount(output_doc));
56 FPDF_CloseDocument(output_doc);
57
58 UnloadPage(page);
59}
60
Wei Li6bdd8242017-03-23 09:45:04 -070061TEST_F(FPDFPPOEmbeddertest, BadRepeatViewerPref) {
62 ASSERT_TRUE(OpenDocument("repeat_viewer_ref.pdf"));
63
64 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
65 EXPECT_TRUE(output_doc);
66 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
67
68 FPDF_FILEWRITE writer;
69 writer.version = 1;
70 writer.WriteBlock = FakeBlockWriter;
71
72 EXPECT_TRUE(FPDF_SaveAsCopy(output_doc, &writer, 0));
73 FPDF_CloseDocument(output_doc);
74}
75
76TEST_F(FPDFPPOEmbeddertest, BadCircularViewerPref) {
77 ASSERT_TRUE(OpenDocument("circular_viewer_ref.pdf"));
78
79 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
80 EXPECT_TRUE(output_doc);
81 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
82
83 FPDF_FILEWRITE writer;
84 writer.version = 1;
85 writer.WriteBlock = FakeBlockWriter;
86
87 EXPECT_TRUE(FPDF_SaveAsCopy(output_doc, &writer, 0));
88 FPDF_CloseDocument(output_doc);
89}
90
tsepez211d4ed2016-11-11 17:23:48 -080091TEST_F(FPDFPPOEmbeddertest, BadRanges) {
92 EXPECT_TRUE(OpenDocument("viewer_ref.pdf"));
93
94 FPDF_PAGE page = LoadPage(0);
95 EXPECT_TRUE(page);
96
97 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
98 EXPECT_TRUE(output_doc);
99 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "clams", 0));
100 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "0", 0));
101 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "42", 0));
102 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1,2", 0));
103 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1-2", 0));
104 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), ",1", 0));
105 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1,", 0));
106 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "1-", 0));
107 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "-1", 0));
108 EXPECT_FALSE(FPDF_ImportPages(output_doc, document(), "-,0,,,1-", 0));
109 FPDF_CloseDocument(output_doc);
110
111 UnloadPage(page);
112}
113
114TEST_F(FPDFPPOEmbeddertest, GoodRanges) {
115 EXPECT_TRUE(OpenDocument("viewer_ref.pdf"));
116
117 FPDF_PAGE page = LoadPage(0);
118 EXPECT_TRUE(page);
119
120 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
121 EXPECT_TRUE(output_doc);
122 EXPECT_TRUE(FPDF_CopyViewerPreferences(output_doc, document()));
123 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1,1,1,1", 0));
124 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1-1", 0));
125 EXPECT_EQ(5, FPDF_GetPageCount(output_doc));
126 FPDF_CloseDocument(output_doc);
127
128 UnloadPage(page);
129}
tsepez6e1d6032016-11-11 17:55:40 -0800130
131TEST_F(FPDFPPOEmbeddertest, BUG_664284) {
132 EXPECT_TRUE(OpenDocument("bug_664284.pdf"));
133
134 FPDF_PAGE page = LoadPage(0);
Dan Sinclair957480c2017-06-13 15:21:14 -0400135 ASSERT_NE(nullptr, page);
tsepez6e1d6032016-11-11 17:55:40 -0800136
137 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
138 EXPECT_TRUE(output_doc);
139 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1", 0));
140 FPDF_CloseDocument(output_doc);
141
142 UnloadPage(page);
143}
Dan Sinclair957480c2017-06-13 15:21:14 -0400144
Lei Zhang98073c82017-07-31 19:33:25 -0700145TEST_F(FPDFPPOEmbeddertest, BUG_750568) {
146 const char* const kHashes[] = {
147 "64ad08132a1c5a166768298c8a578f57", "83b83e2f6bc80707d0a917c7634140b9",
148 "913cd3723a451e4e46fbc2c05702d1ee", "81fb7cfd4860f855eb468f73dfeb6d60"};
149
150 ASSERT_TRUE(OpenDocument("bug_750568.pdf"));
151 ASSERT_EQ(4, FPDF_GetPageCount(document()));
152
153 for (size_t i = 0; i < 4; ++i) {
154 FPDF_PAGE page = LoadPage(i);
155 ASSERT_NE(nullptr, page);
156
157 FPDF_BITMAP bitmap = RenderPage(page);
158 ASSERT_EQ(200, FPDFBitmap_GetWidth(bitmap));
159 ASSERT_EQ(200, FPDFBitmap_GetHeight(bitmap));
160 ASSERT_EQ(800, FPDFBitmap_GetStride(bitmap));
161
162 std::string digest = HashBitmap(bitmap, 200, 200);
163 FPDFBitmap_Destroy(bitmap);
164 UnloadPage(page);
165 EXPECT_EQ(kHashes[i], digest);
166 }
167
168 FPDF_DOCUMENT output_doc = FPDF_CreateNewDocument();
169 ASSERT_TRUE(output_doc);
170 EXPECT_TRUE(FPDF_ImportPages(output_doc, document(), "1,2,3,4", 0));
171 ASSERT_EQ(4, FPDF_GetPageCount(output_doc));
172 for (size_t i = 0; i < 4; ++i) {
173 FPDF_PAGE page = FPDF_LoadPage(output_doc, i);
174 ASSERT_NE(nullptr, page);
175
176 FPDF_BITMAP bitmap = RenderPage(page);
177 ASSERT_EQ(200, FPDFBitmap_GetWidth(bitmap));
178 ASSERT_EQ(200, FPDFBitmap_GetHeight(bitmap));
179 ASSERT_EQ(800, FPDFBitmap_GetStride(bitmap));
180
181 std::string digest = HashBitmap(bitmap, 200, 200);
182 FPDFBitmap_Destroy(bitmap);
183 FPDF_ClosePage(page);
184 EXPECT_EQ(kHashes[i], digest);
185 }
186 FPDF_CloseDocument(output_doc);
187}
188
Dan Sinclair957480c2017-06-13 15:21:14 -0400189TEST_F(FPDFPPOEmbeddertest, ImportWithZeroLengthStream) {
190 EXPECT_TRUE(OpenDocument("zero_length_stream.pdf"));
191 FPDF_PAGE page = LoadPage(0);
192 ASSERT_NE(nullptr, page);
193
194 FPDF_BITMAP bitmap = RenderPage(page);
195 ASSERT_EQ(200, FPDFBitmap_GetWidth(bitmap));
196 ASSERT_EQ(200, FPDFBitmap_GetHeight(bitmap));
197 ASSERT_EQ(800, FPDFBitmap_GetStride(bitmap));
198
199 std::string digest = HashBitmap(bitmap, 200, 200);
200 FPDFBitmap_Destroy(bitmap);
201 FPDF_ClosePage(page);
202
203 FPDF_DOCUMENT new_doc = FPDF_CreateNewDocument();
204 EXPECT_TRUE(new_doc);
205 EXPECT_TRUE(FPDF_ImportPages(new_doc, document(), "1", 0));
206
207 EXPECT_EQ(1, FPDF_GetPageCount(new_doc));
208 FPDF_PAGE new_page = FPDF_LoadPage(new_doc, 0);
209 ASSERT_NE(nullptr, new_page);
210 FPDF_BITMAP new_bitmap = RenderPage(new_page);
211 ASSERT_EQ(200, FPDFBitmap_GetWidth(new_bitmap));
212 ASSERT_EQ(200, FPDFBitmap_GetHeight(new_bitmap));
213 ASSERT_EQ(800, FPDFBitmap_GetStride(new_bitmap));
214
215 std::string new_digest = HashBitmap(new_bitmap, 200, 200);
216 FPDFBitmap_Destroy(new_bitmap);
217 FPDF_ClosePage(new_page);
218 FPDF_CloseDocument(new_doc);
219
220 EXPECT_EQ(digest, new_digest);
221}