Skip to content

Commit 1612aaf

Browse files
Moved infinite recursion tests from functional to unit
1 parent edee622 commit 1612aaf

File tree

4 files changed

+121
-119
lines changed

4 files changed

+121
-119
lines changed

tests/functional/PdfParser/Type/PdfTypeTest.php

Lines changed: 0 additions & 36 deletions
This file was deleted.

tests/functional/PdfReader/PdfReaderTest.php

Lines changed: 0 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace setasign\Fpdi\functional\PdfReader;
44

55
use PHPUnit\Framework\TestCase;
6-
use Prophecy\Exception\InvalidArgumentException;
76
use setasign\Fpdi\PdfParser\CrossReference\CrossReferenceException;
87
use setasign\Fpdi\PdfParser\PdfParser;
98
use setasign\Fpdi\PdfParser\StreamReader;
@@ -14,9 +13,7 @@
1413
use setasign\Fpdi\PdfParser\Type\PdfIndirectObjectReference;
1514
use setasign\Fpdi\PdfParser\Type\PdfName;
1615
use setasign\Fpdi\PdfParser\Type\PdfNumeric;
17-
use setasign\Fpdi\PdfParser\Type\PdfType;
1816
use setasign\Fpdi\PdfReader\PdfReader;
19-
use setasign\Fpdi\PdfReader\PdfReaderException;
2017

2118
class PdfReaderTest extends TestCase
2219
{
@@ -1072,84 +1069,4 @@ public function testHandlingOfEncryptedPdfWithCompressedXref()
10721069
$this->expectExceptionCode(CrossReferenceException::ENCRYPTED);
10731070
$pdfReader->getPageCount();
10741071
}
1075-
1076-
public function testHandlingOfRecursivePageTreeStructure()
1077-
{
1078-
$parser = (
1079-
$this->getMockBuilder(PdfParser::class)
1080-
->setMethods(['getCatalog', 'getIndirectObject'])
1081-
->disableOriginalConstructor()
1082-
->getMock()
1083-
);
1084-
1085-
$pages1 = PdfIndirectObject::create(2, 0, PdfDictionary::create([
1086-
'Type' => PdfName::create('Pages'),
1087-
'Count' => PdfNumeric::create(1),
1088-
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(3, 0)])
1089-
]));
1090-
$pages2 = PdfIndirectObject::create(3, 0, PdfDictionary::create([
1091-
'Type' => PdfName::create('Pages'),
1092-
'Parent' => PdfIndirectObjectReference::create(2, 0),
1093-
'Count' => PdfNumeric::create(1),
1094-
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
1095-
]));
1096-
$parser->method('getIndirectObject')->willReturnMap([
1097-
[2, false, $pages1],
1098-
[3, false, $pages2],
1099-
]);
1100-
1101-
$parser->method('getCatalog')->willReturn(PdfDictionary::create([
1102-
'Pages' => PdfDictionary::create([
1103-
'Count' => PdfNumeric::create(1),
1104-
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
1105-
])
1106-
]));
1107-
1108-
$pdfReader = new PdfReader($parser);
1109-
$this->assertEquals(1, $pdfReader->getPageCount());
1110-
1111-
$this->expectException(PdfReaderException::class);
1112-
$this->expectExceptionMessage('Recursive pages dictionary detected.');
1113-
$pdfReader->getPage(1);
1114-
}
1115-
1116-
public function testHandlingOfRecursivePageTreeStructureWhenFullTreeIsRead()
1117-
{
1118-
$parser = (
1119-
$this->getMockBuilder(PdfParser::class)
1120-
->setMethods(['getCatalog', 'getIndirectObject'])
1121-
->disableOriginalConstructor()
1122-
->getMock()
1123-
);
1124-
1125-
$pages1 = PdfIndirectObject::create(2, 0, PdfDictionary::create([
1126-
'Type' => PdfName::create('Pages'),
1127-
'Count' => PdfNumeric::create(3),
1128-
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(3, 0)])
1129-
]));
1130-
$pages2 = PdfIndirectObject::create(3, 0, PdfDictionary::create([
1131-
'Type' => PdfName::create('Pages'),
1132-
'Parent' => PdfIndirectObjectReference::create(2, 0),
1133-
'Count' => PdfNumeric::create(2),
1134-
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
1135-
]));
1136-
$parser->method('getIndirectObject')->willReturnMap([
1137-
[2, false, $pages1],
1138-
[3, false, $pages2],
1139-
]);
1140-
1141-
$parser->method('getCatalog')->willReturn(PdfDictionary::create([
1142-
'Pages' => PdfDictionary::create([
1143-
'Count' => PdfNumeric::create(5),
1144-
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
1145-
])
1146-
]));
1147-
1148-
$pdfReader = new PdfReader($parser);
1149-
$this->assertEquals(5, $pdfReader->getPageCount());
1150-
1151-
$this->expectException(PdfReaderException::class);
1152-
$this->expectExceptionMessage('Recursive pages dictionary detected.');
1153-
$pdfReader->getPage(1);
1154-
}
11551072
}

tests/unit/PdfParser/Type/PdfTypeTest.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use PHPUnit\Framework\TestCase;
66
use setasign\Fpdi\PdfParser\PdfParser;
7+
use setasign\Fpdi\PdfParser\PdfParserException;
78
use setasign\Fpdi\PdfParser\Type\PdfIndirectObject;
89
use setasign\Fpdi\PdfParser\Type\PdfIndirectObjectReference;
910
use setasign\Fpdi\PdfParser\Type\PdfString;
@@ -118,4 +119,25 @@ public function testResolveWithMoreIndirectObjectReferenceAndStopParameter()
118119

119120
$this->assertSame($indirectObject1, $result);
120121
}
122+
123+
public function testResolveWithRecursiveReferences()
124+
{
125+
$parser = (
126+
$this->getMockBuilder(PdfParser::class)
127+
->setMethods(['getCatalog', 'getIndirectObject'])
128+
->disableOriginalConstructor()
129+
->getMock()
130+
);
131+
132+
$object1 = PdfIndirectObject::create(1, 0, PdfIndirectObjectReference::create(2, 0));
133+
$object2 = PdfIndirectObject::create(2, 0, PdfIndirectObjectReference::create(1, 0));
134+
$parser->method('getIndirectObject')->willReturnMap([
135+
[1, false, $object1],
136+
[2, false, $object2],
137+
]);
138+
139+
$this->expectException(PdfParserException::class);
140+
$this->expectExceptionMessage('Indirect reference recursion detected (1).');
141+
PdfType::resolve($object1, $parser);
142+
}
121143
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PdfReader;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use setasign\Fpdi\PdfParser\PdfParser;
9+
use setasign\Fpdi\PdfParser\Type\PdfArray;
10+
use setasign\Fpdi\PdfParser\Type\PdfDictionary;
11+
use setasign\Fpdi\PdfParser\Type\PdfIndirectObject;
12+
use setasign\Fpdi\PdfParser\Type\PdfIndirectObjectReference;
13+
use setasign\Fpdi\PdfParser\Type\PdfName;
14+
use setasign\Fpdi\PdfParser\Type\PdfNumeric;
15+
use setasign\Fpdi\PdfReader\PdfReader;
16+
use setasign\Fpdi\PdfReader\PdfReaderException;
17+
18+
class PdfReaderTest extends TestCase
19+
{
20+
public function testHandlingOfRecursivePageTreeStructure()
21+
{
22+
$parser = (
23+
$this->getMockBuilder(PdfParser::class)
24+
->setMethods(['getCatalog', 'getIndirectObject'])
25+
->disableOriginalConstructor()
26+
->getMock()
27+
);
28+
29+
$pages1 = PdfIndirectObject::create(2, 0, PdfDictionary::create([
30+
'Type' => PdfName::create('Pages'),
31+
'Count' => PdfNumeric::create(1),
32+
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(3, 0)])
33+
]));
34+
$pages2 = PdfIndirectObject::create(3, 0, PdfDictionary::create([
35+
'Type' => PdfName::create('Pages'),
36+
'Parent' => PdfIndirectObjectReference::create(2, 0),
37+
'Count' => PdfNumeric::create(1),
38+
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
39+
]));
40+
$parser->method('getIndirectObject')->willReturnMap([
41+
[2, false, $pages1],
42+
[3, false, $pages2],
43+
]);
44+
45+
$parser->method('getCatalog')->willReturn(PdfDictionary::create([
46+
'Pages' => PdfDictionary::create([
47+
'Count' => PdfNumeric::create(1),
48+
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
49+
])
50+
]));
51+
52+
$pdfReader = new PdfReader($parser);
53+
$this->assertEquals(1, $pdfReader->getPageCount());
54+
55+
$this->expectException(PdfReaderException::class);
56+
$this->expectExceptionMessage('Recursive pages dictionary detected.');
57+
$pdfReader->getPage(1);
58+
}
59+
60+
public function testHandlingOfRecursivePageTreeStructureWhenFullTreeIsRead()
61+
{
62+
$parser = (
63+
$this->getMockBuilder(PdfParser::class)
64+
->setMethods(['getCatalog', 'getIndirectObject'])
65+
->disableOriginalConstructor()
66+
->getMock()
67+
);
68+
69+
$pages1 = PdfIndirectObject::create(2, 0, PdfDictionary::create([
70+
'Type' => PdfName::create('Pages'),
71+
'Count' => PdfNumeric::create(3),
72+
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(3, 0)])
73+
]));
74+
$pages2 = PdfIndirectObject::create(3, 0, PdfDictionary::create([
75+
'Type' => PdfName::create('Pages'),
76+
'Parent' => PdfIndirectObjectReference::create(2, 0),
77+
'Count' => PdfNumeric::create(2),
78+
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
79+
]));
80+
$parser->method('getIndirectObject')->willReturnMap([
81+
[2, false, $pages1],
82+
[3, false, $pages2],
83+
]);
84+
85+
$parser->method('getCatalog')->willReturn(PdfDictionary::create([
86+
'Pages' => PdfDictionary::create([
87+
'Count' => PdfNumeric::create(5),
88+
'Kids' => PdfArray::create([PdfIndirectObjectReference::create(2, 0)])
89+
])
90+
]));
91+
92+
$pdfReader = new PdfReader($parser);
93+
$this->assertEquals(5, $pdfReader->getPageCount());
94+
95+
$this->expectException(PdfReaderException::class);
96+
$this->expectExceptionMessage('Recursive pages dictionary detected.');
97+
$pdfReader->getPage(1);
98+
}
99+
}

0 commit comments

Comments
 (0)