5#include "core/fpdfapi/parser/cpdf_object_avail.h"
10#include "core/fpdfapi/parser/cpdf_array.h"
11#include "core/fpdfapi/parser/cpdf_dictionary.h"
12#include "core/fpdfapi/parser/cpdf_indirect_object_holder.h"
13#include "core/fpdfapi/parser/cpdf_read_validator.h"
14#include "core/fpdfapi/parser/cpdf_reference.h"
15#include "core/fpdfapi/parser/cpdf_string.h"
16#include "core/fxcrt/check.h"
17#include "core/fxcrt/fx_stream.h"
18#include "core/fxcrt/notreached.h"
19#include "testing/gtest/include/gtest/gtest.h"
20#include "testing/invalid_seekable_read_stream.h"
28 void SimulateReadError() { ReadBlockAtOffset({}, 0); }
34 ~TestReadValidator()
override =
default;
39 enum class ObjectState {
43 TestHolder() : validator_(pdfium::MakeRetain<TestReadValidator>()) {}
44 ~TestHolder()
override =
default;
48 auto it = objects_data_.find(objnum);
49 if (it == objects_data_.end())
52 ObjectData& obj_data = it->second;
53 if (obj_data.state == ObjectState::Unavailable) {
54 validator_->SimulateReadError();
57 return obj_data.object;
62 void AddObject(uint32_t objnum,
65 ObjectData object_data;
66 object_data.object =
std::move(object);
67 object_data.state = state;
68 DCHECK(objects_data_.find(objnum) == objects_data_.end());
69 objects_data_[objnum] = std::move(object_data);
72 void SetObjectState(uint32_t objnum, ObjectState state) {
73 auto it = objects_data_.find(objnum);
74 DCHECK(it != objects_data_.end());
75 ObjectData& obj_data = it->second;
76 obj_data.state = state;
80 auto it = objects_data_.find(objnum);
81 if (it == objects_data_.end())
83 return it->second.object.Get();
89 ObjectState state = ObjectState::Unavailable;
91 std::map<uint32_t, ObjectData> objects_data_;
98 ~CPDF_ObjectAvailFailOnExclude()
override =
default;
99 bool ExcludeObject(
const CPDF_Object* object)
const override {
107 ~CPDF_ObjectAvailExcludeArray()
override =
default;
108 bool ExcludeObject(
const CPDF_Object* object)
const override {
116 ~CPDF_ObjectAvailExcludeTypeKey()
override =
default;
117 bool ExcludeObject(
const CPDF_Object* object)
const override {
122 return object->IsDictionary() &&
123 object->GetDict()->GetByteStringFor(
"Type") ==
"Exclude me";
131 holder.AddObject(1,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"string"),
132 TestHolder::ObjectState::Unavailable);
135 holder.SetObjectState(1, TestHolder::ObjectState::Available);
141 holder.AddObject(1,
pdfium::MakeRetain<CPDF_Reference>(&holder, 2),
142 TestHolder::ObjectState::Unavailable);
143 holder.AddObject(2,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"string"),
144 TestHolder::ObjectState::Unavailable);
148 holder.SetObjectState(1, TestHolder::ObjectState::Available);
151 holder.SetObjectState(2, TestHolder::ObjectState::Available);
157 holder.AddObject(1,
pdfium::MakeRetain<CPDF_Reference>(&holder, 2),
158 TestHolder::ObjectState::Unavailable);
159 holder.AddObject(2,
pdfium::MakeRetain<CPDF_Reference>(&holder, 3),
160 TestHolder::ObjectState::Unavailable);
161 holder.AddObject(3,
pdfium::MakeRetain<CPDF_Reference>(&holder, 1),
162 TestHolder::ObjectState::Unavailable);
167 holder.SetObjectState(1, TestHolder::ObjectState::Available);
170 holder.SetObjectState(2, TestHolder::ObjectState::Available);
173 holder.SetObjectState(3, TestHolder::ObjectState::Available);
180 TestHolder::ObjectState::Unavailable);
182 TestHolder::ObjectState::Unavailable);
184 holder.GetTestObject(2)->GetMutableDict()->SetNewFor<CPDF_Reference>(
185 "Parent", &holder, 1);
190 holder.SetObjectState(2, TestHolder::ObjectState::Available);
197 const uint32_t kDepth = 100;
198 for (uint32_t i = 1; i < kDepth; ++i) {
200 TestHolder::ObjectState::Unavailable);
202 holder.GetTestObject(i)->GetMutableDict()->SetNewFor<CPDF_Reference>(
203 "Child", &holder, i + 1);
207 TestHolder::ObjectState::Unavailable);
210 for (uint32_t i = 1; i <= kDepth; ++i) {
212 holder.SetObjectState(i, TestHolder::ObjectState::Available);
220 TestHolder::ObjectState::Available);
221 CPDF_ObjectAvailFailOnExclude avail(holder.GetValidator(), &holder, 1);
227 holder.AddObject(1,
pdfium::MakeRetain<CPDF_Reference>(&holder, 2),
228 TestHolder::ObjectState::Available);
230 TestHolder::ObjectState::Available);
231 CPDF_ObjectAvailFailOnExclude avail(holder.GetValidator(), &holder, 1);
238 TestHolder::ObjectState::Available);
239 holder.GetTestObject(1)->GetMutableDict()->SetNewFor<CPDF_Reference>(
240 "ArrayRef", &holder, 2);
242 TestHolder::ObjectState::Available);
248 3,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"Not available string"),
249 TestHolder::ObjectState::Unavailable);
250 CPDF_ObjectAvailExcludeArray avail(holder.GetValidator(), &holder, 1);
257 TestHolder::ObjectState::Available);
258 holder.GetTestObject(1)->GetMutableDict()->SetNewFor<CPDF_Reference>(
259 "DictRef", &holder, 2);
261 TestHolder::ObjectState::Available);
263 holder.GetTestObject(2)->GetMutableDict()->SetNewFor<CPDF_Reference>(
266 holder.AddObject(3,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"Exclude me"),
267 TestHolder::ObjectState::Unavailable);
269 holder.GetTestObject(2)->GetMutableDict()->SetNewFor<CPDF_Reference>(
270 "OtherData", &holder, 4);
274 4,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"Not available string"),
275 TestHolder::ObjectState::Unavailable);
277 CPDF_ObjectAvailExcludeTypeKey avail(holder.GetValidator(), &holder, 1);
282 holder.SetObjectState(3, TestHolder::ObjectState::Available);
292 TestHolder::ObjectState::Available);
293 holder.GetTestObject(1)->GetMutableDict()->SetNewFor<CPDF_Reference>(
294 "NotExistsObjRef", &holder, 2);
303 holder.AddObject(1,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"string"),
304 TestHolder::ObjectState::Unavailable);
309 holder.SetObjectState(1, TestHolder::ObjectState::Available);
316 TestHolder::ObjectState::Available);
318 holder.GetTestObject(1)->GetMutableDict()->SetNewFor<CPDF_Reference>(
321 holder.GetTestObject(1)->GetMutableDict()->SetNewFor<CPDF_Dictionary>(
324 root->SetNewFor<CPDF_Reference>(
"Self", &holder, 1);
325 holder.AddObject(2,
pdfium::MakeRetain<CPDF_String>(
nullptr,
"Data"),
326 TestHolder::ObjectState::Unavailable);
331 holder.SetObjectState(2, TestHolder::ObjectState::Available);
std::vector< RetainPtr< CPDF_Object > >::const_iterator const_iterator
std::map< ByteString, RetainPtr< CPDF_Object >, std::less<> > DictMap
CPDF_DataAvail::DocAvailStatus CheckAvail()
virtual CPDF_Array * AsMutableArray()
TEST(FXCRYPT, MD5GenerateEmtpyData)
#define NOTREACHED_NORETURN()
#define CONSTRUCT_VIA_MAKE_RETAIN