Commit a238b4b0fd38c4bf3f218072a9d3174684a9c91e
1 parent
c67634af
Ensure there is a meaningful deterministic ID test
If we ignore /ID[1], we need to make sure deterministic IDs are tested properly.
Showing
5 changed files
with
50 additions
and
1863 deletions
qpdf/qtest/deterministic-id.test
| ... | ... | @@ -2,6 +2,7 @@ |
| 2 | 2 | require 5.008; |
| 3 | 3 | use warnings; |
| 4 | 4 | use strict; |
| 5 | +use File::Copy; | |
| 5 | 6 | |
| 6 | 7 | unshift(@INC, '.'); |
| 7 | 8 | require qpdf_test_helpers; |
| ... | ... | @@ -14,23 +15,41 @@ cleanup(); |
| 14 | 15 | |
| 15 | 16 | my $td = new TestDriver('deterministic-id'); |
| 16 | 17 | |
| 17 | -my $n_tests = 11; | |
| 18 | +my $n_tests = 19; | |
| 19 | + | |
| 20 | +# Do not use qpdf-test-compare in this test suite since it ignores | |
| 21 | +# /ID[1]. | |
| 18 | 22 | |
| 19 | 23 | foreach my $d ('nn', 'ny', 'yn', 'yy') |
| 20 | 24 | { |
| 21 | 25 | my $linearize = ($d =~ m/^y/); |
| 22 | 26 | my $ostream = ($d =~ m/y$/); |
| 23 | - $td->runtest("deterministic ID: linearize/ostream=$d", | |
| 24 | - {$td->COMMAND => | |
| 25 | - "qpdf -deterministic-id" . | |
| 26 | - ($linearize ? " -linearize" : "") . | |
| 27 | - " -object-streams=" . ($ostream ? "generate" : "disable") . | |
| 28 | - " deterministic-id-in.pdf a.pdf"}, | |
| 29 | - {$td->STRING => "", | |
| 30 | - $td->EXIT_STATUS => 0}); | |
| 27 | + # The deterministic ID is a function of all the data in the file. | |
| 28 | + # As such, it is affected by which zlib implementation is in use. | |
| 29 | + # The important thing is that the ID is the same if a file is | |
| 30 | + # generated the same way more than once, so rather than comparing | |
| 31 | + # the output file to a known output, compare subsequent outputs | |
| 32 | + # with each other. | |
| 33 | + foreach my $out ('a.pdf', 'b.pdf') | |
| 34 | + { | |
| 35 | + $td->runtest("deterministic ID: linearize/ostream=$d", | |
| 36 | + {$td->COMMAND => | |
| 37 | + "qpdf -deterministic-id" . | |
| 38 | + ($linearize ? " -linearize" : "") . | |
| 39 | + " -object-streams=" . ($ostream ? "generate" : "disable") . | |
| 40 | + " deterministic-id-in.pdf $out"}, | |
| 41 | + {$td->STRING => "", | |
| 42 | + $td->EXIT_STATUS => 0}); | |
| 43 | + } | |
| 31 | 44 | $td->runtest("compare files", |
| 32 | 45 | {$td->FILE => "a.pdf"}, |
| 33 | - {$td->FILE => "deterministic-id-$d.pdf"}); | |
| 46 | + {$td->FILE => "b.pdf"}); | |
| 47 | + check_id('a.pdf'); | |
| 48 | + if ($d eq 'nn') | |
| 49 | + { | |
| 50 | + # Save for the C API test | |
| 51 | + copy("a.pdf", 'c.pdf'); | |
| 52 | + } | |
| 34 | 53 | } |
| 35 | 54 | |
| 36 | 55 | $td->runtest("deterministic ID with encryption", |
| ... | ... | @@ -49,7 +68,27 @@ $td->runtest("deterministic ID (C API)", |
| 49 | 68 | $td->NORMALIZE_NEWLINES); |
| 50 | 69 | $td->runtest("compare files", |
| 51 | 70 | {$td->FILE => "a.pdf"}, |
| 52 | - {$td->FILE => "deterministic-id-nn.pdf"}); | |
| 71 | + {$td->FILE => "c.pdf"}); | |
| 53 | 72 | |
| 54 | 73 | cleanup(); |
| 55 | 74 | $td->report($n_tests); |
| 75 | + | |
| 76 | +sub check_id | |
| 77 | +{ | |
| 78 | + my $f = shift; | |
| 79 | + chomp(my $id = `qpdf --show-object=trailer $f`); | |
| 80 | + if ($id =~ m,.*/ID \[ <(9b1c69409fc9a5f50e44b9588e3e60f8)> <(.{32})>,) | |
| 81 | + { | |
| 82 | + my $id0 = $1; | |
| 83 | + my $id1 = $2; | |
| 84 | + $td->runtest("ID fields differ", | |
| 85 | + {$td->STRING => $id0 ne $id1 ? "YES\n" : "$id0 $id1\n"}, | |
| 86 | + {$td->STRING => "YES\n"}); | |
| 87 | + } | |
| 88 | + else | |
| 89 | + { | |
| 90 | + $td->runtest("checked ID", | |
| 91 | + {$td->STRING => "YES\n"}, | |
| 92 | + {$td->STRING => "$id\n"}); | |
| 93 | + } | |
| 94 | +} | ... | ... |
qpdf/qtest/qpdf/deterministic-id-nn.pdf deleted
No preview for this file type
qpdf/qtest/qpdf/deterministic-id-ny.pdf deleted
No preview for this file type
qpdf/qtest/qpdf/deterministic-id-yn.pdf deleted
No preview for this file type
qpdf/qtest/qpdf/deterministic-id-yy.pdf deleted
No preview for this file type