11
11
use File::Copy qw( cp) ;
12
12
use FileHandle;
13
13
use FindBin;
14
+ use IO::Handle;
14
15
15
16
my $VERSION = " 0.2" ;
16
17
81
82
" IGNORE_UNUSED" => 0,
82
83
);
83
84
85
+ my $test_log_start = 0;
86
+
84
87
my $ktest_config = " ktest.conf" ;
85
88
my $version ;
86
89
my $have_version = 0;
98
101
my $pre_ktest ;
99
102
my $post_ktest ;
100
103
my $pre_test ;
104
+ my $pre_test_die ;
101
105
my $post_test ;
102
106
my $pre_build ;
103
107
my $post_build ;
223
227
my $mailto ;
224
228
my $mailer ;
225
229
my $mail_path ;
230
+ my $mail_max_size ;
226
231
my $mail_command ;
227
232
my $email_on_error ;
228
233
my $email_when_finished ;
259
264
" MAILTO" => \$mailto ,
260
265
" MAILER" => \$mailer ,
261
266
" MAIL_PATH" => \$mail_path ,
267
+ " MAIL_MAX_SIZE" => \$mail_max_size ,
262
268
" MAIL_COMMAND" => \$mail_command ,
263
269
" EMAIL_ON_ERROR" => \$email_on_error ,
264
270
" EMAIL_WHEN_FINISHED" => \$email_when_finished ,
273
279
" PRE_KTEST" => \$pre_ktest ,
274
280
" POST_KTEST" => \$post_ktest ,
275
281
" PRE_TEST" => \$pre_test ,
282
+ " PRE_TEST_DIE" => \$pre_test_die ,
276
283
" POST_TEST" => \$post_test ,
277
284
" BUILD_TYPE" => \$build_type ,
278
285
" BUILD_OPTIONS" => \$build_options ,
507
514
508
515
sub _logit {
509
516
if (defined ($opt {" LOG_FILE" })) {
510
- open (OUT, " >> $opt {LOG_FILE}" ) or die " Can't write to $opt {LOG_FILE}" ;
511
- print OUT @_ ;
512
- close (OUT);
517
+ print LOG @_ ;
513
518
}
514
519
}
515
520
@@ -909,6 +914,12 @@ sub process_expression {
909
914
}
910
915
}
911
916
917
+ if ($val =~ s / ^\s *NOT\s +(.*)// ) {
918
+ my $express = $1 ;
919
+ my $ret = process_expression($name , $express );
920
+ return !$ret ;
921
+ }
922
+
912
923
if ($val =~ / ^\s *0\s *$ / ) {
913
924
return 0;
914
925
} elsif ($val =~ / ^\s *\d +\s *$ / ) {
@@ -1485,8 +1496,32 @@ sub dodie {
1485
1496
1486
1497
if ($email_on_error ) {
1487
1498
my $name = get_test_name;
1499
+ my $log_file ;
1500
+
1501
+ if (defined ($opt {" LOG_FILE" })) {
1502
+ my $whence = 0; # beginning of file
1503
+ my $pos = $test_log_start ;
1504
+
1505
+ if (defined ($mail_max_size )) {
1506
+ my $log_size = tell LOG;
1507
+ $log_size -= $test_log_start ;
1508
+ if ($log_size > $mail_max_size ) {
1509
+ $whence = 2; # end of file
1510
+ $pos = - $mail_max_size ;
1511
+ }
1512
+ }
1513
+ $log_file = " $tmpdir /log" ;
1514
+ open (L, " $opt {LOG_FILE}" ) or die " Can't open $opt {LOG_FILE} to read)" ;
1515
+ open (O, " > $tmpdir /log" ) or die " Can't open $tmpdir /log\n " ;
1516
+ seek (L, $pos , $whence );
1517
+ while (<L>) {
1518
+ print O;
1519
+ }
1520
+ close O;
1521
+ close L;
1522
+ }
1488
1523
send_email(" KTEST: critical failure for test $i [$name ]" ,
1489
- " Your test started at $script_start_time has failed with:\n @_ \n " );
1524
+ " Your test started at $script_start_time has failed with:\n @_ \n " , $log_file );
1490
1525
}
1491
1526
1492
1527
if ($monitor_cnt ) {
@@ -1508,7 +1543,7 @@ sub create_pty {
1508
1543
my $TIOCGPTN = 0x80045430;
1509
1544
1510
1545
sysopen ($ptm , " /dev/ptmx" , O_RDWR | O_NONBLOCK) or
1511
- dodie " Cant open /dev/ptmx" ;
1546
+ dodie " Can't open /dev/ptmx" ;
1512
1547
1513
1548
# unlockpt()
1514
1549
$tmp = pack (" i" , 0);
@@ -1772,8 +1807,6 @@ sub run_command {
1772
1807
(fail " unable to exec $command " and return 0);
1773
1808
1774
1809
if (defined ($opt {" LOG_FILE" })) {
1775
- open (LOG, " >>$opt {LOG_FILE}" ) or
1776
- dodie " failed to write to log" ;
1777
1810
$dolog = 1;
1778
1811
}
1779
1812
@@ -1821,7 +1854,6 @@ sub run_command {
1821
1854
}
1822
1855
1823
1856
close (CMD);
1824
- close (LOG) if ($dolog );
1825
1857
close (RD) if ($dord );
1826
1858
1827
1859
$end_time = time ;
@@ -3188,6 +3220,8 @@ sub config_bisect_end {
3188
3220
doprint " ***************************************\n\n " ;
3189
3221
}
3190
3222
3223
+ my $pass = 1;
3224
+
3191
3225
sub run_config_bisect {
3192
3226
my ($good , $bad , $last_result ) = @_ ;
3193
3227
my $reset = " " ;
@@ -3210,11 +3244,15 @@ sub run_config_bisect {
3210
3244
3211
3245
$ret = run_config_bisect_test $config_bisect_type ;
3212
3246
if ($ret ) {
3213
- doprint " NEW GOOD CONFIG\n " ;
3247
+ doprint " NEW GOOD CONFIG ($pass )\n " ;
3248
+ system (" cp $output_config $tmpdir /good_config.tmp.$pass " );
3249
+ $pass ++;
3214
3250
# Return 3 for good config
3215
3251
return 3;
3216
3252
} else {
3217
- doprint " NEW BAD CONFIG\n " ;
3253
+ doprint " NEW BAD CONFIG ($pass )\n " ;
3254
+ system (" cp $output_config $tmpdir /bad_config.tmp.$pass " );
3255
+ $pass ++;
3218
3256
# Return 4 for bad config
3219
3257
return 4;
3220
3258
}
@@ -4077,8 +4115,12 @@ sub make_warnings_file {
4077
4115
}
4078
4116
}
4079
4117
4080
- if ($opt {" CLEAR_LOG" } && defined ($opt {" LOG_FILE" })) {
4081
- unlink $opt {" LOG_FILE" };
4118
+ if (defined ($opt {" LOG_FILE" })) {
4119
+ if ($opt {" CLEAR_LOG" }) {
4120
+ unlink $opt {" LOG_FILE" };
4121
+ }
4122
+ open (LOG, " >> $opt {LOG_FILE}" ) or die " Can't write to $opt {LOG_FILE}" ;
4123
+ LOG-> autoflush(1);
4082
4124
}
4083
4125
4084
4126
doprint " \n\n STARTING AUTOMATED TESTS\n\n " ;
@@ -4171,7 +4213,7 @@ sub find_mailer {
4171
4213
}
4172
4214
4173
4215
sub do_send_mail {
4174
- my ($subject , $message ) = @_ ;
4216
+ my ($subject , $message , $file ) = @_ ;
4175
4217
4176
4218
if (!defined ($mail_path )) {
4177
4219
# find the mailer
@@ -4181,16 +4223,30 @@ sub do_send_mail {
4181
4223
}
4182
4224
}
4183
4225
4226
+ my $header_file = " $tmpdir /header" ;
4227
+ open (HEAD, " >$header_file " ) or die " Can not create $header_file \n " ;
4228
+ print HEAD " To: $mailto \n " ;
4229
+ print HEAD " Subject: $subject \n\n " ;
4230
+ print HEAD " $message \n " ;
4231
+ close HEAD;
4232
+
4184
4233
if (!defined ($mail_command )) {
4185
4234
if ($mailer eq " mail" || $mailer eq " mailx" ) {
4186
- $mail_command = " \$ MAIL_PATH/\$ MAILER -s \'\$ SUBJECT\' \$ MAILTO <<< \'\$ MESSAGE \' " ;
4235
+ $mail_command = " cat \$ HEADER_FILE \$ BODY_FILE | \$ MAIL_PATH/\$ MAILER -s \'\$ SUBJECT\' \$ MAILTO" ;
4187
4236
} elsif ($mailer eq " sendmail" ) {
4188
- $mail_command = " echo \' Subject: \$ SUBJECT \n\n\$ MESSAGE \' | \$ MAIL_PATH/\$ MAILER -t \$ MAILTO" ;
4237
+ $mail_command = " cat \$ HEADER_FILE \$ BODY_FILE | \$ MAIL_PATH/\$ MAILER -t \$ MAILTO" ;
4189
4238
} else {
4190
4239
die " \n Your mailer: $mailer is not supported.\n " ;
4191
4240
}
4192
4241
}
4193
4242
4243
+ if (defined ($file )) {
4244
+ $mail_command =~ s /\$ BODY_FILE/ $file / g ;
4245
+ } else {
4246
+ $mail_command =~ s /\$ BODY_FILE// g ;
4247
+ }
4248
+
4249
+ $mail_command =~ s /\$ HEADER_FILE/ $header_file / g ;
4194
4250
$mail_command =~ s /\$ MAILER/ $mailer / g ;
4195
4251
$mail_command =~ s /\$ MAIL_PATH/ $mail_path / g ;
4196
4252
$mail_command =~ s /\$ MAILTO/ $mailto / g ;
@@ -4338,10 +4394,19 @@ sub cancel_test {
4338
4394
}
4339
4395
4340
4396
doprint " \n\n " ;
4397
+
4398
+ if (defined ($opt {" LOG_FILE" })) {
4399
+ $test_log_start = tell (LOG);
4400
+ }
4401
+
4341
4402
doprint " RUNNING TEST $i of $opt {NUM_TESTS}$name with option $test_type $run_type$installme \n\n " ;
4342
4403
4343
4404
if (defined ($pre_test )) {
4344
- run_command $pre_test ;
4405
+ my $ret = run_command $pre_test ;
4406
+ if (!$ret && defined ($pre_test_die ) &&
4407
+ $pre_test_die ) {
4408
+ dodie " failed to pre_test\n " ;
4409
+ }
4345
4410
}
4346
4411
4347
4412
unlink $dmesg ;
@@ -4441,4 +4506,10 @@ sub cancel_test {
4441
4506
send_email(" KTEST: Your test has finished!" ,
4442
4507
" $successes of $opt {NUM_TESTS} tests started at $script_start_time were successful!" );
4443
4508
}
4509
+
4510
+ if (defined ($opt {" LOG_FILE" })) {
4511
+ print " \n See $opt {LOG_FILE} for the record of results.\n\n " ;
4512
+ close LOG;
4513
+ }
4514
+
4444
4515
exit 0;
0 commit comments