Commit 94b4e900b21c3ce61f55e118c570782556600490

Authored by Jay Berkenbilt
1 parent d54bd7b2

Add better tests for generation > 0 with object streams

This includes an expected failure for a file with a dangling
reference to an old generation.
qpdf/qtest/incremental.test
... ... @@ -18,7 +18,8 @@ my $n_tests = 6;
18 18  
19 19 # Since the beginning but discovered at the time of releasing 11.8.0:
20 20 # qpdf doesn't delete earlier generations of an object when they are
21   -# reused.
  21 +# reused. See also EXPECT_FAILURE in object-stream.test and
  22 +# linearization.test.
22 23 $td->runtest("handle delete and reuse",
23 24 {$td->COMMAND => "qpdf --qdf --static-id incremental-1.pdf a.pdf"},
24 25 {$td->STRING => "", $td->EXIT_STATUS => 0},
... ...
qpdf/qtest/linearization.test
... ... @@ -39,7 +39,8 @@ my @to_linearize =
39 39 'lin-delete-and-reuse', # linearized, then delete and reuse
40 40 'object-stream', # contains object streams
41 41 'hybrid-xref', # contains both xref tables and streams
42   - 'gen1', # has objects with generation > 0
  42 + 'gen1', # has objects with generation > 0 and dangling references
  43 + 'gen1-no-dangling', # has objects with generation > 0
43 44 'direct-outlines', # /Outlines is a direct object
44 45 @linearized_files, # we should be able to relinearize
45 46 );
... ... @@ -83,23 +84,29 @@ foreach my $base (@to_linearize)
83 84 {
84 85 foreach my $omode (qw(disable preserve generate))
85 86 {
  87 + my $xflags = 0;
  88 + if ($base eq 'gen1')
  89 + {
  90 + $xflags = $td->EXPECT_FAILURE;
  91 + }
86 92 my $oarg = "-object-streams=$omode";
87 93 my $sdarg = "";
88 94 if (($base eq 'lin-special') || ($base eq 'object-stream'))
89 95 {
90 96 $sdarg = "--stream-data=uncompress";
91 97 }
  98 + unlink "a.pdf", "b.pdf", "c.pdf";
92 99 $td->runtest("linearize $base ($omode)",
93 100 {$td->COMMAND =>
94 101 "qpdf -linearize $oarg $sdarg" .
95 102 " --static-id $base.pdf a.pdf"},
96   - {$td->STRING => "",
97   - $td->EXIT_STATUS => 0});
  103 + {$td->STRING => "", $td->EXIT_STATUS => 0},
  104 + $xflags);
98 105 $td->runtest("check linearization",
99 106 {$td->COMMAND => "qpdf --check-linearization a.pdf"},
100 107 {$td->STRING => "a.pdf: no linearization errors\n",
101 108 $td->EXIT_STATUS => 0},
102   - $td->NORMALIZE_NEWLINES);
  109 + $td->NORMALIZE_NEWLINES | $xflags);
103 110 # Relinearizing twice should produce identical results. We
104 111 # have to do it twice because, if objects changed ordering
105 112 # during the original linearization, the hint tables won't
... ... @@ -110,16 +117,17 @@ foreach my $base (@to_linearize)
110 117 $td->runtest("relinearize $base 1",
111 118 {$td->COMMAND =>
112 119 "qpdf -linearize $sdarg --static-id a.pdf b.pdf"},
113   - {$td->STRING => "",
114   - $td->EXIT_STATUS => 0});
  120 + {$td->STRING => "", $td->EXIT_STATUS => 0},
  121 + $xflags);
115 122 $td->runtest("relinearize $base 2",
116 123 {$td->COMMAND =>
117 124 "qpdf -linearize $sdarg --static-id b.pdf c.pdf"},
118   - {$td->STRING => "",
119   - $td->EXIT_STATUS => 0});
  125 + {$td->STRING => "", $td->EXIT_STATUS => 0},
  126 + $xflags);
120 127 $td->runtest("compare files ($omode)",
121 128 {$td->FILE => "b.pdf"},
122   - {$td->FILE => "c.pdf"});
  129 + {$td->FILE => "c.pdf"},
  130 + $xflags);
123 131 if (($base eq 'lin-special') || ($base eq 'object-stream'))
124 132 {
125 133 $td->runtest("check $base ($omode)",
... ...
qpdf/qtest/object-stream.test
... ... @@ -16,7 +16,7 @@ cleanup();
16 16  
17 17 my $td = new TestDriver('object-stream');
18 18  
19   -my $n_tests = 5 + (36 * 4) + (12 * 2);
  19 +my $n_tests = 7 + (36 * 4) + (12 * 2);
20 20 my $n_compare_pdfs = 36;
21 21  
22 22 for (my $n = 16; $n <= 19; ++$n)
... ... @@ -82,8 +82,22 @@ $td-&gt;runtest(&quot;generate object streams for gen &gt; 0&quot;,
82 82 {$td->COMMAND => "qpdf --qdf --static-id" .
83 83 " --object-streams=generate gen1.pdf a.pdf"},
84 84 {$td->STRING => "", $td->EXIT_STATUS => 0});
  85 +# qpdf 11.8.0 -- it was discovered that qpdf was incorrectly handling
  86 +# references to older generations of reused objects in incrementally
  87 +# updated files.
85 88 $td->runtest("check file",
86 89 {$td->FILE => "a.pdf"},
  90 + {$td->FILE => "gen1.qdf"},
  91 + $td->EXPECT_FAILURE);
  92 +
  93 +$td->runtest("generate object streams for gen > 0",
  94 + {$td->COMMAND => "qpdf --qdf --static-id" .
  95 + " --object-streams=generate gen1-no-dangling.pdf a.pdf"},
  96 + {$td->STRING => "", $td->EXIT_STATUS => 0});
  97 +$td->runtest("check file",
  98 + {$td->FILE => "a.pdf"},
  99 + # Intentionally compare against gen1.pdf -- should have
  100 + # the same results as above.
87 101 {$td->FILE => "gen1.qdf"});
88 102  
89 103  
... ...
qpdf/qtest/qpdf/gen1-no-dangling.pdf 0 โ†’ 100644
  1 +%PDF-1.3
  2 +%ยฟรทยขรพ
  3 +%QDF-1.0
  4 +
  5 +1 0 obj
  6 +<<
  7 + /Pages 2 0 R
  8 + /Type /Catalog
  9 +>>
  10 +endobj
  11 +
  12 +2 0 obj
  13 +<<
  14 + /Count 1
  15 + /Kids [
  16 + 3 0 R
  17 + ]
  18 + /Type /Pages
  19 +>>
  20 +endobj
  21 +
  22 +%% Page 1
  23 +3 0 obj
  24 +<<
  25 + /Contents 4 0 R
  26 + /MediaBox [
  27 + 0
  28 + 0
  29 + 612
  30 + 792
  31 + ]
  32 + /Parent 2 0 R
  33 + /Resources 6 0 R
  34 + /Type /Page
  35 +>>
  36 +endobj
  37 +
  38 +%% Contents for page 1
  39 +4 0 obj
  40 +<<
  41 + /Length 5 0 R
  42 +>>
  43 +stream
  44 +BT
  45 + /F1 24 Tf
  46 + 72 720 Td
  47 + (Potato) Tj
  48 +ET
  49 +endstream
  50 +endobj
  51 +
  52 +5 0 obj
  53 +44
  54 +endobj
  55 +
  56 +6 0 obj
  57 +<<
  58 + /Font 7 0 R
  59 + %ProcSet 8 0 R
  60 +>>
  61 +endobj
  62 +
  63 +7 0 obj
  64 +<<
  65 + /F1 9 0 R
  66 +>>
  67 +endobj
  68 +
  69 +8 0 obj
  70 +[
  71 + /PDF
  72 + /Text
  73 +]
  74 +endobj
  75 +
  76 +9 0 obj
  77 +<<
  78 + /BaseFont /Helvetica
  79 + /Encoding /WinAnsiEncoding
  80 + /Name /F1
  81 + /Subtype /Type1
  82 + /Type /Font
  83 +>>
  84 +endobj
  85 +
  86 +xref
  87 +0 10
  88 +0000000000 65535 f
  89 +0000000025 00000 n
  90 +0000000079 00000 n
  91 +0000000161 00000 n
  92 +0000000319 00000 n
  93 +0000000418 00000 n
  94 +0000000437 00000 n
  95 +0000000490 00000 n
  96 +0000000524 00000 n
  97 +0000000559 00000 n
  98 +trailer <<
  99 + /Root 1 0 R
  100 + /Size 10
  101 + /ID [<6b7a9692034323b8032e358b75d57a4c><44f7cee2c1913f0970a8a391cd03f327>]
  102 +>>
  103 +startxref
  104 +677
  105 +%%EOF
  106 +
  107 +% Delete object 8.
  108 +xref
  109 +0 1
  110 +0000000008 65535 f
  111 +8 1
  112 +0000000000 00001 f
  113 +trailer <<
  114 + /Root 1 0 R
  115 + /Size 10
  116 + /Prev 677
  117 + /ID [<6b7a9692034323b8032e358b75d57a4c><44f7cee2c1913f0970a8a391cd03f327>]
  118 +>>
  119 +startxref
  120 +1043
  121 +%%EOF
  122 +
  123 +% Reuse object 8 such that we have to traverse through it to get to a
  124 +% compressible object.
  125 +7 0 obj
  126 +<<
  127 + /F1 8 1 R
  128 +>>
  129 +endobj
  130 +
  131 +8 1 obj
  132 +<<
  133 + /BaseFont 9 0 R
  134 + /Encoding /WinAnsiEncoding
  135 + /Name /F1
  136 + /Subtype /Type1
  137 + /Type /Font
  138 +>>
  139 +endobj
  140 +
  141 +9 0 obj
  142 +/Times-Roman
  143 +endobj
  144 +
  145 +xref
  146 +0 1
  147 +0000000000 65535 f
  148 +7 3
  149 +0000001339 00000 n
  150 +0000001373 00001 n
  151 +0000001486 00000 n
  152 +trailer <<
  153 + /Root 1 0 R
  154 + /Size 10
  155 + /Prev 1043
  156 + /ID [<6b7a9692034323b8032e358b75d57a4c><44f7cee2c1913f0970a8a391cd03f327>]
  157 +>>
  158 +startxref
  159 +1515
  160 +%%EOF
... ...
qpdf/qtest/qpdf/gen1.pdf
1 1 %PDF-1.3
2   -1 1 obj
  2 +%ยฟรทยขรพ
  3 +%QDF-1.0
  4 +
  5 +1 0 obj
3 6 <<
  7 + /Pages 2 0 R
4 8 /Type /Catalog
5   - /Pages 2 1 R
6 9 >>
7 10 endobj
8 11  
9   -2 1 obj
  12 +2 0 obj
10 13 <<
11   - /Type /Pages
  14 + /Count 1
12 15 /Kids [
13   - 3 1 R
  16 + 3 0 R
14 17 ]
15   - /Count 1
  18 + /Type /Pages
16 19 >>
17 20 endobj
18 21  
19   -3 1 obj
  22 +%% Page 1
  23 +3 0 obj
20 24 <<
  25 + /Contents 4 0 R
  26 + /MediaBox [
  27 + 0
  28 + 0
  29 + 612
  30 + 792
  31 + ]
  32 + /Parent 2 0 R
  33 + /Resources 6 0 R
21 34 /Type /Page
22   - /Parent 2 1 R
23   - /MediaBox [0 0 612 792]
24   - /Contents 4 1 R
25   - /Resources <<
26   - /ProcSet 5 1 R
27   - /Font <<
28   - /F1 6 1 R
29   - >>
30   - >>
31 35 >>
32 36 endobj
33 37  
34   -4 1 obj
  38 +%% Contents for page 1
  39 +4 0 obj
35 40 <<
36   - /Length 44
  41 + /Length 5 0 R
37 42 >>
38 43 stream
39 44 BT
... ... @@ -44,36 +49,112 @@ ET
44 49 endstream
45 50 endobj
46 51  
47   -5 1 obj
  52 +5 0 obj
  53 +44
  54 +endobj
  55 +
  56 +6 0 obj
  57 +<<
  58 + /Font 7 0 R
  59 + /ProcSet 8 0 R
  60 +>>
  61 +endobj
  62 +
  63 +7 0 obj
  64 +<<
  65 + /F1 9 0 R
  66 +>>
  67 +endobj
  68 +
  69 +8 0 obj
48 70 [
49 71 /PDF
50 72 /Text
51 73 ]
52 74 endobj
53 75  
54   -6 1 obj
  76 +9 0 obj
55 77 <<
56   - /Type /Font
57   - /Subtype /Type1
58   - /Name /F1
59 78 /BaseFont /Helvetica
60 79 /Encoding /WinAnsiEncoding
  80 + /Name /F1
  81 + /Subtype /Type1
  82 + /Type /Font
61 83 >>
62 84 endobj
63 85  
64 86 xref
65   -0 7
  87 +0 10
  88 +0000000000 65535 f
  89 +0000000025 00000 n
  90 +0000000079 00000 n
  91 +0000000161 00000 n
  92 +0000000319 00000 n
  93 +0000000418 00000 n
  94 +0000000437 00000 n
  95 +0000000490 00000 n
  96 +0000000524 00000 n
  97 +0000000559 00000 n
  98 +trailer <<
  99 + /Root 1 0 R
  100 + /Size 10
  101 + /ID [<6b7a9692034323b8032e358b75d57a4c><44f7cee2c1913f0970a8a391cd03f327>]
  102 +>>
  103 +startxref
  104 +677
  105 +%%EOF
  106 +
  107 +% Delete object 8.
  108 +xref
  109 +0 1
  110 +0000000008 65535 f
  111 +8 1
  112 +0000000000 00001 f
  113 +trailer <<
  114 + /Root 1 0 R
  115 + /Size 10
  116 + /Prev 677
  117 + /ID [<6b7a9692034323b8032e358b75d57a4c><44f7cee2c1913f0970a8a391cd03f327>]
  118 +>>
  119 +startxref
  120 +1043
  121 +%%EOF
  122 +
  123 +% Reuse object 8 such that we have to traverse through it to get to a
  124 +% compressible object.
  125 +7 0 obj
  126 +<<
  127 + /F1 8 1 R
  128 +>>
  129 +endobj
  130 +
  131 +8 1 obj
  132 +<<
  133 + /BaseFont 9 0 R
  134 + /Encoding /WinAnsiEncoding
  135 + /Name /F1
  136 + /Subtype /Type1
  137 + /Type /Font
  138 +>>
  139 +endobj
  140 +
  141 +9 0 obj
  142 +/Times-Roman
  143 +endobj
  144 +
  145 +xref
  146 +0 1
66 147 0000000000 65535 f
67   -0000000009 00001 n
68   -0000000063 00001 n
69   -0000000135 00001 n
70   -0000000307 00001 n
71   -0000000403 00001 n
72   -0000000438 00001 n
  148 +7 3
  149 +0000001339 00000 n
  150 +0000001373 00001 n
  151 +0000001486 00000 n
73 152 trailer <<
74   - /Size 7
75   - /Root 1 1 R
  153 + /Root 1 0 R
  154 + /Size 10
  155 + /Prev 1043
  156 + /ID [<6b7a9692034323b8032e358b75d57a4c><44f7cee2c1913f0970a8a391cd03f327>]
76 157 >>
77 158 startxref
78   -556
  159 +1515
79 160 %%EOF
... ...
qpdf/qtest/qpdf/gen1.qdf
No preview for this file type