summaryrefslogtreecommitdiffstats
path: root/qpdf/qtest/attachments.test
diff options
context:
space:
mode:
Diffstat (limited to 'qpdf/qtest/attachments.test')
-rw-r--r--qpdf/qtest/attachments.test222
1 files changed, 222 insertions, 0 deletions
diff --git a/qpdf/qtest/attachments.test b/qpdf/qtest/attachments.test
new file mode 100644
index 00000000..dbd47161
--- /dev/null
+++ b/qpdf/qtest/attachments.test
@@ -0,0 +1,222 @@
+#!/usr/bin/env perl
+require 5.008;
+use warnings;
+use strict;
+
+unshift(@INC, '.');
+require qpdf_test_helpers;
+
+chdir("qpdf") or die "chdir testdir failed: $!\n";
+
+require TestDriver;
+
+cleanup();
+
+my $td = new TestDriver('attachments');
+
+my $n_tests = 37;
+
+open(F, ">auto-txt") or die;
+print F "from file";
+close(F);
+$td->runtest("attachments",
+ {$td->COMMAND => "test_driver 76 minimal.pdf auto-txt"},
+ {$td->FILE => "test76.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("show attachment",
+ {$td->COMMAND => "qpdf --show-attachment=att1 a.pdf"},
+ {$td->STRING => "from file", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "test76.pdf"});
+$td->runtest("list attachments",
+ {$td->COMMAND => "qpdf --list-attachments a.pdf"},
+ {$td->FILE => "test76-list.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("list attachments verbose",
+ {$td->COMMAND => "qpdf --list-attachments --verbose a.pdf"},
+ {$td->FILE => "test76-list-verbose.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("attachments json",
+ {$td->COMMAND => "qpdf --json=1 --json-key=attachments a.pdf"},
+ {$td->FILE => "test76-json.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("remove attachment (test_driver)",
+ {$td->COMMAND => "test_driver 77 test76.pdf"},
+ {$td->STRING => "test 77 done\n", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "test77.pdf"});
+$td->runtest("remove attachment (cli)",
+ {$td->COMMAND => "qpdf --remove-attachment=att2 test76.pdf" .
+ " --static-id --qdf --verbose b.pdf"},
+ {$td->FILE => "remove-attachment.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "b.pdf"},
+ {$td->FILE => "test77.pdf"});
+$td->runtest("show missing attachment",
+ {$td->COMMAND => "qpdf --show-attachment=att2 b.pdf"},
+ {$td->STRING => "qpdf: attachment att2 not found\n",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("remove missing attachment",
+ {$td->COMMAND => "qpdf --remove-attachment=att2 b.pdf c.pdf"},
+ {$td->STRING => "qpdf: attachment att2 not found\n",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+
+$td->runtest("add attachment: bad creation date",
+ {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
+ " --add-attachment auto-txt --creationdate=potato --"},
+ {$td->REGEXP => ".*potato is not a valid PDF timestamp.*",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("add attachment: bad mod date",
+ {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
+ " --add-attachment auto-txt --moddate=potato --"},
+ {$td->REGEXP => ".*potato is not a valid PDF timestamp.*",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("add attachment: bad mod date",
+ {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
+ " --add-attachment auto-txt --mimetype=potato --"},
+ {$td->REGEXP =>
+ ".*mime type should be specified as type/subtype.*",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("add attachment: trailing slash",
+ {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
+ " --add-attachment --"},
+ {$td->REGEXP => ".*add attachment: no file specified.*",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+
+foreach my $i (qw(1 2 3))
+{
+ open(F, ">auto-$i") or die;
+ print F "attachment $i";
+ close(F);
+}
+my @dates = ("--creationdate=D:20210210091359-05'00'",
+ "--moddate=D:20210210141359Z");
+$td->runtest("add attachments",
+ {$td->COMMAND =>
+ [qw(qpdf minimal.pdf a.pdf --no-original-object-ids),
+ qw(--verbose --static-id --qdf),
+ qw(--add-attachment ./auto-1), @dates,
+ qw(--mimetype=text/plain --),
+ qw(--add-attachment ./auto-2 --key=auto-Two), @dates, '--',
+ qw(--add-attachment ./auto-3 --filename=auto-Three.txt),
+ @dates, '--description=two words', '--']},
+ {$td->FILE => "add-attachments-1.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("list attachments",
+ {$td->COMMAND => "qpdf --list-attachments a.pdf --verbose"},
+ {$td->FILE => "list-attachments-1.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "add-attachments-1.pdf"},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("add attachments: duplicate",
+ {$td->COMMAND =>
+ "qpdf a.pdf b.pdf --verbose --add-attachment ./auto-1 --"},
+ {$td->FILE => "add-attachments-duplicate.out",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("add attachments: replace",
+ {$td->COMMAND =>
+ [qw(qpdf a.pdf b.pdf --no-original-object-ids),
+ qw(--verbose --static-id --qdf),
+ qw(--add-attachment ./auto-2 --key=auto-1 --replace),
+ @dates, '--']},
+ {$td->FILE => "add-attachments-2.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("list attachments",
+ {$td->COMMAND => "qpdf --list-attachments b.pdf --verbose"},
+ {$td->FILE => "list-attachments-3.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "b.pdf"},
+ {$td->FILE => "add-attachments-2.pdf"},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("copy attachments",
+ {$td->COMMAND =>
+ "qpdf --verbose --no-original-object-ids" .
+ " --static-id --qdf minimal.pdf b.pdf" .
+ " --copy-attachments-from a.pdf --"},
+ {$td->FILE => "copy-attachments-1.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("list attachments",
+ {$td->COMMAND => "qpdf --list-attachments b.pdf --verbose"},
+ {$td->FILE => "list-attachments-1.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "b.pdf"},
+ {$td->FILE => "add-attachments-1.pdf"},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("copy attachments: duplicate",
+ {$td->COMMAND =>
+ "qpdf --verbose --no-original-object-ids" .
+ " --static-id --qdf a.pdf c.pdf" .
+ " --copy-attachments-from b.pdf --"},
+ {$td->FILE => "copy-attachments-duplicate.out",
+ $td->EXIT_STATUS => 2},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("copy attachments: prefix",
+ {$td->COMMAND =>
+ "qpdf --verbose --no-original-object-ids" .
+ " --static-id --qdf a.pdf c.pdf" .
+ " --copy-attachments-from b.pdf --prefix=1- --"},
+ {$td->FILE => "copy-attachments-2.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("list attachments",
+ {$td->COMMAND => "qpdf --list-attachments c.pdf --verbose"},
+ {$td->FILE => "list-attachments-2.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "c.pdf"},
+ {$td->FILE => "copy-attachments-2.pdf"},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("add attachments: current date",
+ {$td->COMMAND =>
+ [qw(qpdf minimal.pdf a.pdf --encrypt u o 256 --),
+ qw(--verbose --add-attachment ./auto-1 --)]},
+ {$td->FILE => "add-attachments-3.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("list attachments",
+ {$td->COMMAND =>
+ "qpdf --password=u --list-attachments a.pdf --verbose"},
+ {$td->FILE => "list-attachments-4.out", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+# The object to show here is the one in list-attachments-4.out
+$td->runtest("check dates",
+ {$td->COMMAND => "qpdf --show-object=6 a.pdf --password=u"},
+ {$td->REGEXP => ".*CreationDate \\(D:\\d+.*ModDate \\(D:\\d+.*",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("remove multiple attachments",
+ {$td->COMMAND =>
+ "qpdf --verbose --static-id add-attachments-1.pdf a.pdf" .
+ " --remove-attachment=auto-1 --remove-attachment=auto-Two"},
+ {$td->FILE => "remove-multiple-attachments.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "a.pdf"},
+ {$td->FILE => "remove-multiple-attachments.pdf"});
+$td->runtest("remove multiple attachments (json)",
+ {$td->COMMAND =>
+ "qpdf --job-json-file=remove-multiple-attachments.json"},
+ {$td->FILE => "remove-multiple-attachments-json.out",
+ $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
+$td->runtest("check output",
+ {$td->FILE => "b.pdf"},
+ {$td->FILE => "remove-multiple-attachments.pdf"});
+
+cleanup();
+$td->report($n_tests);