Commit fe6771e0e520cd2ec55aee4071356542a4ab8cd2
1 parent
91d8c485
add many new tests to exercise C api
git-svn-id: svn+q:///qpdf/trunk@727 71b93d88-0707-0410-a8cf-f5a4172ac649
Showing
255 changed files
with
903 additions
and
27 deletions
Too many changes.
To preserve performance only 100 of 255 files are displayed.
TODO
| ... | ... | @@ -18,8 +18,6 @@ |
| 18 | 18 | files...ideally we should provide the object number currently being |
| 19 | 19 | read |
| 20 | 20 | |
| 21 | - * Have --check report the version number of the PDF file | |
| 22 | - | |
| 23 | 21 | * See if it is possible to support rewriting a file in place or at |
| 24 | 22 | least to detect and block this |
| 25 | 23 | ... | ... |
include/qpdf/QPDF.hh
| ... | ... | @@ -39,7 +39,10 @@ class QPDF |
| 39 | 39 | // lifetime. This method must be called before any methods that |
| 40 | 40 | // potentially ask for information about the PDF file are called. |
| 41 | 41 | // Prior to calling this, the only methods that are allowed are |
| 42 | - // those that set parameters. | |
| 42 | + // those that set parameters. If the input file is not | |
| 43 | + // encrypted,either a null password or an empty password can be | |
| 44 | + // used. If the file is encrypted, either the user password or | |
| 45 | + // the owner password may be supplied. | |
| 43 | 46 | DLL_EXPORT |
| 44 | 47 | void processFile(char const* filename, char const* password = 0); |
| 45 | 48 | ... | ... |
libqpdf/qpdf-c.cc
| ... | ... | @@ -83,11 +83,11 @@ QPDF_BOOL qpdf_more_warnings(qpdf_data qpdf) |
| 83 | 83 | DLL_EXPORT |
| 84 | 84 | char const* qpdf_next_error(qpdf_data qpdf) |
| 85 | 85 | { |
| 86 | - QTC::TC("qpdf", "qpdf-c called qpdf_next_error"); | |
| 87 | 86 | if (qpdf_more_errors(qpdf)) |
| 88 | 87 | { |
| 89 | 88 | qpdf->tmp_string = qpdf->error; |
| 90 | 89 | qpdf->error.clear(); |
| 90 | + QTC::TC("qpdf", "qpdf-c qpdf_next_error returned error"); | |
| 91 | 91 | return qpdf->tmp_string.c_str(); |
| 92 | 92 | } |
| 93 | 93 | else |
| ... | ... | @@ -99,11 +99,11 @@ char const* qpdf_next_error(qpdf_data qpdf) |
| 99 | 99 | DLL_EXPORT |
| 100 | 100 | char const* qpdf_next_warning(qpdf_data qpdf) |
| 101 | 101 | { |
| 102 | - QTC::TC("qpdf", "qpdf-c called qpdf_next_warning"); | |
| 103 | 102 | if (qpdf_more_warnings(qpdf)) |
| 104 | 103 | { |
| 105 | 104 | qpdf->tmp_string = qpdf->warnings.front(); |
| 106 | 105 | qpdf->warnings.pop_front(); |
| 106 | + QTC::TC("qpdf", "qpdf-c qpdf_next_warning returned warning"); | |
| 107 | 107 | return qpdf->tmp_string.c_str(); |
| 108 | 108 | } |
| 109 | 109 | else | ... | ... |
qpdf/qpdf-ctest.c
| 1 | 1 | #include <qpdf/qpdf-c.h> |
| 2 | +#include <stdio.h> | |
| 3 | +#include <assert.h> | |
| 4 | +#include <stdlib.h> | |
| 5 | +#include <string.h> | |
| 2 | 6 | |
| 3 | -int main() | |
| 7 | +static qpdf_data qpdf = 0; | |
| 8 | + | |
| 9 | +static void report_errors() | |
| 10 | +{ | |
| 11 | + while (qpdf_more_warnings(qpdf)) | |
| 12 | + { | |
| 13 | + printf("warning: %s\n", qpdf_next_warning(qpdf)); | |
| 14 | + } | |
| 15 | + while (qpdf_more_errors(qpdf)) | |
| 16 | + { | |
| 17 | + printf("error: %s\n", qpdf_next_error(qpdf)); | |
| 18 | + } | |
| 19 | +} | |
| 20 | + | |
| 21 | +static void test01(char const* infile, | |
| 22 | + char const* password, | |
| 23 | + char const* outfile) | |
| 24 | +{ | |
| 25 | + qpdf_read(qpdf, infile, password); | |
| 26 | + printf("version: %s\n", qpdf_get_pdf_version(qpdf)); | |
| 27 | + printf("linearized: %d\n", qpdf_is_linearized(qpdf)); | |
| 28 | + printf("encrypted: %d\n", qpdf_is_encrypted(qpdf)); | |
| 29 | + if (qpdf_is_encrypted(qpdf)) | |
| 30 | + { | |
| 31 | + printf("user password: %s\n", qpdf_get_user_password(qpdf)); | |
| 32 | + } | |
| 33 | + report_errors(); | |
| 34 | +} | |
| 35 | + | |
| 36 | +int main(int argc, char* argv[]) | |
| 4 | 37 | { |
| 38 | + char* whoami = 0; | |
| 39 | + char* p = 0; | |
| 40 | + int n = 0; | |
| 41 | + char const* infile; | |
| 42 | + char const* password; | |
| 43 | + char const* outfile; | |
| 44 | + void (*fn)(char const*, char const*, char const*) = 0; | |
| 45 | + | |
| 46 | + if ((p = strrchr(argv[0], '/')) != NULL) | |
| 47 | + { | |
| 48 | + whoami = p + 1; | |
| 49 | + } | |
| 50 | + else if ((p = strrchr(argv[0], '\\')) != NULL) | |
| 51 | + { | |
| 52 | + whoami = p + 1; | |
| 53 | + } | |
| 54 | + else | |
| 55 | + { | |
| 56 | + whoami = argv[0]; | |
| 57 | + } | |
| 58 | + if (argc != 5) | |
| 59 | + { | |
| 60 | + fprintf(stderr, "usage: %s n infile password outfile\n", whoami); | |
| 61 | + exit(2); | |
| 62 | + } | |
| 63 | + | |
| 64 | + n = atoi(argv[1]); | |
| 65 | + infile = argv[2]; | |
| 66 | + password = argv[3]; | |
| 67 | + outfile = argv[4]; | |
| 68 | + | |
| 69 | + fn = ((n == 1) ? test01 : | |
| 70 | + 0); | |
| 71 | + | |
| 72 | + if (fn == 0) | |
| 73 | + { | |
| 74 | + fprintf(stderr, "%s: invalid test number %d\n", whoami, n); | |
| 75 | + exit(2); | |
| 76 | + } | |
| 77 | + | |
| 78 | + qpdf = qpdf_init(); | |
| 79 | + fn(infile, password, outfile); | |
| 80 | + qpdf_cleanup(&qpdf); | |
| 81 | + assert(qpdf == 0); | |
| 82 | + | |
| 5 | 83 | return 0; |
| 6 | 84 | } | ... | ... |
qpdf/qpdf.cc
| ... | ... | @@ -858,6 +858,8 @@ int main(int argc, char* argv[]) |
| 858 | 858 | std::cout << "checking " << infilename << std::endl; |
| 859 | 859 | try |
| 860 | 860 | { |
| 861 | + std::cout << "PDF Version: " << pdf.getPDFVersion() | |
| 862 | + << std::endl; | |
| 861 | 863 | ::show_encryption(pdf); |
| 862 | 864 | if (pdf.isLinearized()) |
| 863 | 865 | { | ... | ... |
qpdf/qpdf.testcov
| ... | ... | @@ -122,8 +122,8 @@ qpdf-c called qpdf_init 0 |
| 122 | 122 | qpdf-c called qpdf_cleanup 0 |
| 123 | 123 | qpdf-c called qpdf_more_errors 0 |
| 124 | 124 | qpdf-c called qpdf_more_warnings 0 |
| 125 | -qpdf-c called qpdf_next_error 0 | |
| 126 | -qpdf-c called qpdf_next_warning 0 | |
| 125 | +qpdf-c qpdf_next_error returned error 0 | |
| 126 | +qpdf-c qpdf_next_warning returned warning 0 | |
| 127 | 127 | qpdf-c called qpdf_set_suppress_warnings 0 |
| 128 | 128 | qpdf-c called qpdf_set_ignore_xref_streams 0 |
| 129 | 129 | qpdf-c called qpdf_set_attempt_recovery 0 | ... | ... |
qpdf/qtest/qpdf.test
| ... | ... | @@ -159,7 +159,7 @@ for (my $i = 1; $i <= scalar(@badfiles); ++$i) |
| 159 | 159 | show_ntests(); |
| 160 | 160 | # ---------- |
| 161 | 161 | $td->notify("--- Recovery Tests ---"); |
| 162 | -$n_tests += @badfiles + 7; | |
| 162 | +$n_tests += @badfiles + 8; | |
| 163 | 163 | |
| 164 | 164 | # Recovery tests. These are mostly after-the-fact -- when recovery |
| 165 | 165 | # was implemented, some degree of recovery was possible on many of the |
| ... | ... | @@ -226,6 +226,12 @@ $td->runtest("run check on damaged file", |
| 226 | 226 | {$td->FILE => "append-page-content-damaged-check.out", |
| 227 | 227 | $td->EXIT_STATUS => 3}, |
| 228 | 228 | $td->NORMALIZE_NEWLINES); |
| 229 | +$td->runtest("check with C API", | |
| 230 | + {$td->COMMAND => | |
| 231 | + "qpdf-ctest 1 append-page-content-damaged.pdf '' ''"}, | |
| 232 | + {$td->FILE => "append-page-content-damaged-c-check.out", | |
| 233 | + $td->EXIT_STATUS => 0}, | |
| 234 | + $td->NORMALIZE_NEWLINES); | |
| 229 | 235 | |
| 230 | 236 | show_ntests(); |
| 231 | 237 | # ---------- |
| ... | ... | @@ -346,7 +352,7 @@ for (my $n = 16; $n <= 19; ++$n) |
| 346 | 352 | show_ntests(); |
| 347 | 353 | # ---------- |
| 348 | 354 | $td->notify("--- Specific File Tests ---"); |
| 349 | -$n_tests += 3; | |
| 355 | +$n_tests += 4; | |
| 350 | 356 | $n_compare_pdfs += 1; |
| 351 | 357 | |
| 352 | 358 | # Special PDF files that caused problems at some point |
| ... | ... | @@ -356,11 +362,13 @@ $n_compare_pdfs += 1; |
| 356 | 362 | # happen to test boundary conditions in the LZW decoder. |
| 357 | 363 | $td->runtest("old and complex", |
| 358 | 364 | {$td->COMMAND => "qpdf --check old-and-complex.pdf"}, |
| 359 | - {$td->STRING => +("checking old-and-complex.pdf\n" . | |
| 360 | - "File is not encrypted\n" . | |
| 361 | - "File is not linearized\n" . | |
| 362 | - "No errors found\n"), | |
| 363 | - $td->EXIT_STATUS => 0}, | |
| 365 | + {$td->FILE => "old-and-complex-check.out", | |
| 366 | + $td->EXIT_STATUS => 0}, | |
| 367 | + $td->NORMALIZE_NEWLINES); | |
| 368 | +$td->runtest("old and complex (C API)", | |
| 369 | + {$td->COMMAND => "qpdf-ctest 1 old-and-complex.pdf '' ''"}, | |
| 370 | + {$td->FILE => "old-and-complex-c-check.out", | |
| 371 | + $td->EXIT_STATUS => 0}, | |
| 364 | 372 | $td->NORMALIZE_NEWLINES); |
| 365 | 373 | |
| 366 | 374 | $td->runtest("convert to qdf", |
| ... | ... | @@ -534,19 +542,13 @@ check_pdf("linearized and modified", |
| 534 | 542 | |
| 535 | 543 | $td->runtest("check linearized and modified", |
| 536 | 544 | {$td->COMMAND => "qpdf --check lin-delete-and-reuse.pdf"}, |
| 537 | - {$td->STRING => +("checking lin-delete-and-reuse.pdf\n" . | |
| 538 | - "File is not encrypted\n" . | |
| 539 | - "File is not linearized\n" . | |
| 540 | - "No errors found\n"), | |
| 541 | - $td->EXIT_STATUS => 0}, | |
| 545 | + {$td->FILE => "lin-delete-and-reuse-check.out", | |
| 546 | + $td->EXIT_STATUS => 0}, | |
| 542 | 547 | $td->NORMALIZE_NEWLINES); |
| 543 | 548 | $td->runtest("check multiple modifications", |
| 544 | 549 | {$td->COMMAND => "qpdf --check multiple-mods.pdf"}, |
| 545 | - {$td->STRING => +("checking multiple-mods.pdf\n" . | |
| 546 | - "File is not encrypted\n" . | |
| 547 | - "File is not linearized\n" . | |
| 548 | - "No errors found\n"), | |
| 549 | - $td->EXIT_STATUS => 0}, | |
| 550 | + {$td->FILE => "multiple-mods-check.out", | |
| 551 | + $td->EXIT_STATUS => 0}, | |
| 550 | 552 | $td->NORMALIZE_NEWLINES); |
| 551 | 553 | |
| 552 | 554 | foreach my $base (@to_linearize) |
| ... | ... | @@ -812,7 +814,7 @@ my @flags = (["-qdf", # 1 |
| 812 | 814 | "no arguments"], |
| 813 | 815 | ); |
| 814 | 816 | |
| 815 | -$n_tests += (@files * @flags * 2 * 2); | |
| 817 | +$n_tests += (@files * @flags * 2 * 3); | |
| 816 | 818 | $n_compare_pdfs += (@files * @flags * 2); |
| 817 | 819 | $n_acroread += (@files * @flags * 2); |
| 818 | 820 | |
| ... | ... | @@ -825,6 +827,7 @@ foreach my $file (@files) |
| 825 | 827 | my $n = 0; |
| 826 | 828 | my $oflags = "--object-streams=$o"; |
| 827 | 829 | my $odescrip = "os:" . substr($o, 0, 1); |
| 830 | + my $osuf = ($o eq 'generate' ? "-ogen" : ""); | |
| 828 | 831 | foreach my $d (@flags) |
| 829 | 832 | { |
| 830 | 833 | my ($flags, $fdescrip) = @$d; |
| ... | ... | @@ -838,7 +841,13 @@ foreach my $file (@files) |
| 838 | 841 | |
| 839 | 842 | $td->runtest("check status", |
| 840 | 843 | {$td->COMMAND => "qpdf --check a.pdf"}, |
| 841 | - {$td->FILE => "$base.$n.check", | |
| 844 | + {$td->FILE => "$base.$n$osuf.check", | |
| 845 | + $td->EXIT_STATUS => 0}, | |
| 846 | + $td->NORMALIZE_NEWLINES); | |
| 847 | + | |
| 848 | + $td->runtest("check with C API", | |
| 849 | + {$td->COMMAND => [qw(qpdf-ctest 1 a.pdf), "", ""]}, | |
| 850 | + {$td->FILE => "$base.$n$osuf.c-check", | |
| 842 | 851 | $td->EXIT_STATUS => 0}, |
| 843 | 852 | $td->NORMALIZE_NEWLINES); |
| 844 | 853 | ... | ... |
qpdf/qtest/qpdf/U25A0.1-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.1-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.1.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.1.check
qpdf/qtest/qpdf/U25A0.10-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.10-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.10.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.10.check
qpdf/qtest/qpdf/U25A0.11-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.11-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.11.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.11.check
qpdf/qtest/qpdf/U25A0.12-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.12-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.12.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.12.check
qpdf/qtest/qpdf/U25A0.2-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.2-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.2.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.2.check
qpdf/qtest/qpdf/U25A0.3-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.3-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.3.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.3.check
qpdf/qtest/qpdf/U25A0.4-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.4-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.4.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.4.check
qpdf/qtest/qpdf/U25A0.5-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.5-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.5.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.5.check
qpdf/qtest/qpdf/U25A0.6-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.6-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.6.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.6.check
qpdf/qtest/qpdf/U25A0.7-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.7-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.7.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.7.check
qpdf/qtest/qpdf/U25A0.8-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.8-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.8.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.8.check
qpdf/qtest/qpdf/U25A0.9-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.9-ogen.check
0 → 100644
qpdf/qtest/qpdf/U25A0.9.c-check
0 → 100644
qpdf/qtest/qpdf/U25A0.9.check
qpdf/qtest/qpdf/append-page-content-damaged-c-check.out
0 → 100644
| 1 | +WARNING: append-page-content-damaged.pdf: offset 0: file is damaged | |
| 2 | +WARNING: append-page-content-damaged.pdf: can't find startxref | |
| 3 | +WARNING: Attempting to reconstruct cross-reference table | |
| 4 | +version: 1.3 | |
| 5 | +linearized: 0 | |
| 6 | +encrypted: 0 | |
| 7 | +warning: append-page-content-damaged.pdf: offset 0: file is damaged | |
| 8 | +warning: append-page-content-damaged.pdf: can't find startxref | |
| 9 | +warning: Attempting to reconstruct cross-reference table | ... | ... |
qpdf/qtest/qpdf/append-page-content-damaged-check.out
| ... | ... | @@ -2,5 +2,6 @@ WARNING: append-page-content-damaged.pdf: offset 0: file is damaged |
| 2 | 2 | WARNING: append-page-content-damaged.pdf: can't find startxref |
| 3 | 3 | WARNING: Attempting to reconstruct cross-reference table |
| 4 | 4 | checking append-page-content-damaged.pdf |
| 5 | +PDF Version: 1.3 | |
| 5 | 6 | File is not encrypted |
| 6 | 7 | File is not linearized | ... | ... |
qpdf/qtest/qpdf/damaged-stream.out
qpdf/qtest/qpdf/fax-decode-parms.out
qpdf/qtest/qpdf/hybrid-xref.1-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.1-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.1.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.1.check
qpdf/qtest/qpdf/hybrid-xref.10-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.10-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.10.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.10.check
qpdf/qtest/qpdf/hybrid-xref.11-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.11-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.11.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.11.check
qpdf/qtest/qpdf/hybrid-xref.12-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.12-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.12.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.12.check
qpdf/qtest/qpdf/hybrid-xref.2-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.2-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.2.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.2.check
qpdf/qtest/qpdf/hybrid-xref.3-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.3-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.3.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.3.check
qpdf/qtest/qpdf/hybrid-xref.4-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.4-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.4.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.4.check
qpdf/qtest/qpdf/hybrid-xref.5-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.5-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.5.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.5.check
qpdf/qtest/qpdf/hybrid-xref.6-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.6-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.6.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.6.check
qpdf/qtest/qpdf/hybrid-xref.7-ogen.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.7-ogen.check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.7.c-check
0 → 100644
qpdf/qtest/qpdf/hybrid-xref.7.check
qpdf/qtest/qpdf/hybrid-xref.8-ogen.c-check
0 → 100644