1#!./perl 2use strict; 3 4# test that perlbug generates somewhat sane reports, but don't 5# actually send them 6 7BEGIN { 8 chdir 't' if -d 't'; 9 @INC = '../lib'; 10} 11 12require './test.pl'; 13 14# lifted from perl5db.t 15my $extracted_program = '../utils/perlbug'; # unix, nt, ... 16if ($^O eq 'VMS') { $extracted_program = '[-.utils]perlbug.com'; } 17if (!(-e $extracted_program)) { 18 print "1..0 # Skip: $extracted_program was not built\n"; 19 exit 0; 20} 21 22my $result; 23my $testreport = 'test.rep'; 24unlink $testreport; 25 26sub _slurp { 27 my $file = shift; 28 ok(-f $file, "saved report $file exists"); 29 open(F, '<', $file) or return undef; 30 local $/; 31 my $ret = <F>; 32 close F; 33 $ret; 34} 35 36sub _dump { 37 my $file = shift; 38 my $contents = shift; 39 open(F, '>', $file) or return; 40 print F $contents; 41 close F; 42 return 1; 43} 44 45plan(25); 46 47 48# check -d 49$result = runperl( progfile => $extracted_program, 50 args => ['-d'] ); 51like($result, qr/Site configuration information/, 52 'config information dumped with -d'); 53 54 55# check -v 56$result = runperl( progfile => $extracted_program, 57 args => ['-d', '-v'] ); 58like($result, qr/Complete configuration data/, 59 'full config information dumped with -d -v'); 60 61# check that we need -t 62$result = runperl( progfile => $extracted_program, 63 stderr => 1, # perlbug dies with "\n"; 64 stdin => undef); 65like($result, qr/Please use perlbug interactively./, 66 'checks for terminal in non-test mode'); 67 68 69# test -okay (mostly noninteractive) 70$result = runperl( progfile => $extracted_program, 71 args => ['-okay', '-F', $testreport] ); 72like($result, qr/Report saved/, 'build report saved'); 73like(_slurp($testreport), qr/Perl reported to build OK on this system/, 74 'build report looks sane'); 75unlink $testreport; 76 77 78# test -nokay (a bit more interactive) 79$result = runperl( progfile => $extracted_program, 80 stdin => 'f', # save to File 81 args => ['-t', 82 '-nokay', 83 '-e', 'file', 84 '-F', $testreport] ); 85like($result, qr/Report saved/, 'build failure report saved'); 86like(_slurp($testreport), qr/This is a build failure report for perl/, 87 'build failure report looks sane'); 88unlink $testreport; 89 90 91# test a regular report 92$result = runperl( progfile => $extracted_program, 93 # no CLI options for these 94 stdin => "\n" # Module 95 . "\n" # Category 96 . "\n" # Severity 97 . "\n" # Editor 98 . "f", # save to File 99 args => ['-t', 100 # runperl has trouble with whitespace 101 '-s', "testingperlbug", 102 '-r', 'username@example.com', 103 '-c', 'none', 104 '-b', 'testreportbody', 105 '-e', 'file', 106 '-F', $testreport] ); 107like($result, qr/Report saved/, 'fake bug report saved'); 108my $contents = _slurp($testreport); 109like($contents, qr/Subject: testingperlbug/, 110 'Subject included in fake bug report'); 111like($contents, qr/testreportbody/, 'body included in fake bug report'); 112unlink $testreport; 113 114 115# test wrapping of long lines 116my $body = 'body.txt'; 117unlink $body; 118my $A = 'A'x9; 119ok(_dump($body, ("$A "x120)), 'wrote 1200-char body to file'); 120 121my $attachment = 'attached.txt'; 122unlink $attachment; 123my $B = 'B'x9; 124ok(_dump($attachment, ("$B "x120)), 'wrote 1200-char attachment to file'); 125 126$result = runperl( progfile => $extracted_program, 127 stdin => "testing perlbug\n" # Subject 128 . "\n" # Module 129 . "\n" # Category 130 . "\n" # Severity 131 . "f", # save to File 132 args => ['-t', 133 '-r', 'username@example.com', 134 '-c', 'none', 135 '-f', $body, 136 '-p', $attachment, 137 '-e', 'file', 138 '-F', $testreport] ); 139like($result, qr/Report saved/, 'fake bug report saved'); 140my $contents = _slurp($testreport); 141unlink $testreport, $body, $attachment; 142like($contents, qr/Subject: testing perlbug/, 143 'Subject included in fake bug report'); 144like($contents, qr/$A/, 'body included in fake bug report'); 145like($contents, qr/$B/, 'attachment included in fake bug report'); 146 147my $maxlen1 = 0; # body 148my $maxlen2 = 0; # attachment 149for (split(/\n/, $contents)) { 150 my $len = length; 151 # content lines setting path-like environment variables like PATH, PERLBREW_PATH, MANPATH,... 152 # will start "\s*xxxxPATH=" where "xxx" is zero or more non white space characters. These lines can 153 # easily get over 1000 characters (see ok-test below) with no internal spaces, so they 154 # will not get wrapped at white space. 155 # See also https://github.com/perl/perl5/issues/15544 for more information 156 $maxlen1 = $len if $len > $maxlen1 and !/(?:$B|^\s*\S*PATH=)/; 157 $maxlen2 = $len if $len > $maxlen2 and /$B/; 158} 159ok($maxlen1 < 1000, "[perl #128020] long body lines are wrapped: maxlen $maxlen1"); 160ok($maxlen2 > 1000, "long attachment lines are not wrapped: maxlen $maxlen2"); 161 162$result = runperl( progfile => $extracted_program, stderr => 1, args => ['-o'] ); # Invalid option 163like($result, qr/^\s*This program is designed/, "No leading error messages with help from invalid arg."); 164 165$result = runperl( progfile => $extracted_program, stderr => 1, args => ['--help'] ); # Invalid option 166like($result, qr/^\s*perlbug version \d+\.\d+\n+This program is designed/, "No leading error messages with help from --help and version is displayed."); 167 168$result = runperl( progfile => $extracted_program, stderr => 1, args => ['--version'] ); # Invalid option 169like($result, qr/^perlbug version \d+\.\d+\n$/, "No leading error messages with --version"); 170#print $result; 171