svn commit: r1936490 - spamassassin/trunk/t

[email protected] Wed, 22 Jul 2026 15:22:21 -0000
Newsgroups gmane.mail.spam.spamassassin.cvs
Message-ID <178473374120.678283.13243777946241345882@svn03-he-fi>
Author: fkento
Date: Wed Jul 22 15:22:20 2026
New Revision: 1936490

Log:
PDF: Skip tests when required modules are missing

Modified:
   spamassassin/trunk/t/pdf_info.t

Modified: spamassassin/trunk/t/pdf_info.t
==============================================================================
--- spamassassin/trunk/t/pdf_info.t	Wed Jul 22 15:04:58 2026	(r1936489)
+++ spamassassin/trunk/t/pdf_info.t	Wed Jul 22 15:22:20 2026	(r1936490)
@@ -45,6 +45,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/rc4_40.pdf',
+        requires => ['Crypt::RC4'],
         expected => {
             'ClickArea' => 852, 'ClickRatio' => '0.18',
             'CreationDate' => 'D:20260624044120Z00\'00\'', 'Creator' => 'Pages',
@@ -59,6 +60,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/rc4_128.pdf',
+        requires => ['Crypt::RC4'],
         expected => {
             'ClickArea' => 852, 'ClickRatio' => '0.18',
             'CreationDate' => 'D:20260624044120Z00\'00\'', 'Creator' => 'Pages',
@@ -73,6 +75,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/aesv2.pdf',
+        requires => ['Crypt::RC4', 'Crypt::Mode::CBC', 'Digest::SHA'],
         expected => {
             'ClickArea' => 852, 'ClickRatio' => '0.18',
             'CreationDate' => 'D:20260624044120Z00\'00\'', 'Creator' => 'Pages',
@@ -87,6 +90,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/aesv3.pdf',
+        requires => ['Crypt::RC4', 'Crypt::Mode::CBC', 'Digest::SHA'],
         expected => {
             'ClickArea' => 852, 'ClickRatio' => '0.18',
             'CreationDate' => 'D:20260624044120Z00\'00\'', 'Creator' => 'Pages',
@@ -101,6 +105,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/aesv2_cleartext_meta.pdf',
+        requires => ['Crypt::RC4', 'Crypt::Mode::CBC', 'Digest::SHA'],
         expected => {
             'ClickArea' => 852, 'ClickRatio' => '0.18',
             'CreationDate' => 'D:20260624044120Z00\'00\'', 'Creator' => 'Pages',
@@ -115,6 +120,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/protected.pdf',
+        requires => ['Crypt::RC4', 'Crypt::Mode::CBC', 'Digest::SHA'],
         expected => {
             'ClickArea' => 0, 'Encrypted' => 1,
             'ImageArea' => 0, 'ImageCount' => 0, 'JavaScript' => 0,
@@ -136,6 +142,7 @@ my @tests = (
     },
     {
         filename => 'data/pdf/ascii85.pdf',
+        requires => ['Convert::Ascii85'],
         expected => {
             'ClickArea' => 0, 'ClickRatio' => '0.00',
             'Encrypted' => 0, 'ImageArea' => 20000, 'ImageCount' => 1,
@@ -210,17 +217,47 @@ my @tests = (
 plan tests => scalar(@tests);
 
 for my $test (@tests) {
+
+    # Some fixtures need optional CPAN modules to parse (encryption / ASCII85).
+    # Skip such fixtures on a minimal install rather than emitting confusing diffs.
+    if (my $missing = missing_modules($test->{requires})) {
+      SKIP: {
+            skip "$test->{filename}: requires $missing", 1;
+        }
+        next;
+    }
+
     my $context = Mail::SpamAssassin::PDF::Context::Info->new();
     my $pdf = Mail::SpamAssassin::PDF::Parser->new( context => $context );
 
     my $data = get_file_contents($test->{filename});
-    eval { $pdf->parse(\$data); 1 };
+    my $ok = eval { $pdf->parse(\$data); 1 };
+
+    if (!$ok) {
+        my $err = $@;
+        $err =~ s/\s+\z// if defined $err;
+        fail($test->{filename});
+        diag("parse() died: $err");
+        next;
+    }
 
     my $info = $context->get_info();
 
     is_deeply $info, $test->{expected}, $test->{filename};
 }
 
+# Return a comma-joined list of the modules in $required that cannot be loaded,
+# or undef if all are available (or none are required).
+sub missing_modules {
+    my $required = shift;
+    return undef unless $required && @$required;
+    my @missing = grep {
+        my $mod = $_;
+        !eval { (my $file = "$mod.pm") =~ s{::}{/}g; require $file; 1 };
+    } @$required;
+    return @missing ? join(', ', @missing) : undef;
+}
+
 sub get_file_contents {
     my $file = shift;
     open my $fh, '<', $file or die "Can't open $file: $!";