tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

runtests.pl (7834B)


      1 #!/usr/bin/perl
      2 #
      3 # This Source Code Form is subject to the terms of the Mozilla Public
      4 # License, v. 2.0. If a copy of the MPL was not distributed with this
      5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      6 
      7 use POSIX qw(:sys_wait_h);
      8 use POSIX qw(setsid);
      9 use FileHandle;
     10 
     11 # Constants
     12 $WINOS = "MSWin32";
     13 
     14 $osname = $^O;
     15 
     16 use Cwd;
     17 if ($osname =~ $WINOS) {
     18    # Windows
     19    require Win32::Process;
     20    require Win32;
     21 }
     22 
     23 # Get environment variables.
     24 $output_file = $ENV{NSPR_TEST_LOGFILE};
     25 $timeout = $ENV{TEST_TIMEOUT};
     26 
     27 $timeout = 0 if (!defined($timeout));
     28 
     29 sub getTime {
     30    ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
     31 
     32    $year = 1900 + $yearOffset;
     33 
     34    $theTime = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year,$month,$dayOfMonth,$hour,$minute,$second);
     35    return $theTime;
     36 }
     37 
     38 sub open_log {
     39 
     40    if (!defined($output_file)) {
     41        print "No output file.\n";
     42        # null device
     43        if ($osname =~ $WINOS) {
     44            $output_file = "nul";
     45        } else {
     46            $output_file = "/dev/null";
     47        }
     48    }
     49    
     50    # use STDOUT for OF (to print summary of test results)
     51    open(OF, ">&STDOUT") or die "Can't reuse STDOUT for OF\n";
     52    OF->autoflush;
     53    # reassign STDOUT to $output_file (to print details of test results)
     54    open(STDOUT, ">$output_file") or die "Can't open file $output_file for STDOUT\n";
     55    STDOUT->autoflush;
     56    # redirect STDERR to STDOUT
     57    open(STDERR, ">&STDOUT") or die "Can't redirect STDERR to STDOUT\n";
     58    STDERR->autoflush;
     59    
     60    # Print header test in summary
     61    $now = getTime;
     62    print OF "\nNSPR Test Results - tests\n";
     63    print OF "\nBEGIN\t\t\t$now\n";
     64    print OF "NSPR_TEST_LOGFILE\t$output_file\n";
     65    print OF "TEST_TIMEOUT\t$timeout\n\n";
     66    print OF "\nTest\t\t\tResult\n\n";
     67 }
     68 
     69 sub close_log {
     70    # end of test marker in summary
     71    $now = getTime;
     72    print OF "END\t\t\t$now\n";
     73 
     74    close(OF) or die "Can't close file OF\n";
     75    close(STDERR) or die "Can't close STDERR\n";
     76    close(STDOUT) or die "Can't close STDOUT\n";
     77 }
     78 
     79 sub print_begin {
     80 $lprog = shift;
     81 
     82    # Summary output
     83    print OF "$prog";
     84    # Full output
     85    $now = getTime;
     86    print "BEGIN TEST: $lprog ($now)\n\n";
     87 }
     88 
     89 sub print_end {
     90 ($lprog, $exit_status, $exit_signal, $exit_core) = @_;
     91 
     92    if (($exit_status == 0) && ($exit_signal == 0) && ($exit_core == 0)) {
     93        $str_status = "Passed";
     94    } else {
     95        $str_status = "FAILED";
     96    }
     97    if ($exit_signal != 0) {
     98    	$str_signal = " - signal $exit_signal";
     99    } else {
    100    	$str_signal = "";
    101    }
    102    if ($exit_core != 0) {
    103    	$str_core = " - core dumped";
    104    } else {
    105    	$str_core = "";
    106    }
    107    $now = getTime;
    108    # Full output
    109    print "\nEND TEST: $lprog ($now)\n";
    110    print "TEST STATUS: $lprog = $str_status (exit status " . $exit_status . $str_signal . $str_core . ")\n";
    111    print "--------------------------------------------------\n\n";
    112    # Summary output
    113    print OF "\t\t\t$str_status\n";
    114 }
    115 
    116 sub ux_start_prog {
    117 # parameters:
    118 $lprog = shift; # command to run
    119 
    120    # Create a process group for the child
    121    # so we can kill all of it if needed
    122    setsid or die "setsid failed: $!";
    123    # Start test program    
    124    exec("./$lprog");
    125    # We should not be here unless exec failed.
    126    print "Faild to exec $lprog";
    127    exit 1 << 8;
    128 }   
    129 
    130 sub ux_wait_timeout {
    131 # parameters:
    132 $lpid = shift;     # child process id
    133 $ltimeout = shift; # timeout
    134 
    135    if ($ltimeout == 0) {
    136        # No timeout: use blocking wait
    137        $ret = waitpid($lpid,0);
    138        # Exit and don't kill
    139        $lstatus = $?;
    140        $ltimeout = -1;
    141    } else {
    142        while ($ltimeout > 0) {
    143            # Check status of child using non blocking wait
    144            $ret = waitpid($lpid, WNOHANG);
    145            if ($ret == 0) {
    146                # Child still running
    147    #           print "Time left=$ltimeout\n";
    148                sleep 1;
    149                $ltimeout--;
    150            } else {
    151                # Child has ended
    152                $lstatus = $?;
    153                # Exit the wait loop and don't kill
    154                $ltimeout = -1;
    155            }
    156        }
    157    }
    158    
    159    if ($ltimeout == 0) {
    160        # we ran all the timeout: it's time to kill the child
    161        print "Timeout ! Kill child process $lpid\n";
    162        # Kill the child process and group
    163        kill(-9,$lpid);
    164        $lstatus = 9;
    165    }
    166    
    167    return $lstatus;
    168 }
    169 
    170 sub ux_test_prog {
    171 # parameters:
    172 $prog = shift;  # Program to test
    173 
    174    $child_pid = fork;
    175    if ($child_pid == 0) {
    176        # we are in the child process
    177        print_begin($prog);
    178        ux_start_prog($prog);
    179    } else {
    180        # we are in the parent process
    181        $status = ux_wait_timeout($child_pid,$timeout);
    182        # See Perlvar for documentation of $?
    183        # exit status = $status >> 8
    184        # exit signal = $status & 127 (no signal = 0)
    185        # core dump = $status & 128 (no core = 0)
    186        print_end($prog, $status >> 8, $status & 127, $status & 128);
    187    }
    188 
    189    return $status;
    190 }
    191 
    192 sub win_path {
    193 $lpath = shift;
    194 
    195    # MSYS drive letter = /c/ -> c:/
    196    $lpath =~ s/^\/(\w)\//$1:\//;
    197    # Cygwin drive letter = /cygdrive/c/ -> c:/
    198    $lpath =~ s/^\/cygdrive\/(\w)\//$1:\//;
    199    # replace / with \\
    200    $lpath =~ s/\//\\\\/g;
    201    
    202    return $lpath;
    203 }
    204 
    205 sub win_ErrorReport{
    206    print Win32::FormatMessage( Win32::GetLastError() );
    207 }
    208 
    209 sub win_test_prog {
    210 # parameters:
    211 $prog = shift;  # Program to test
    212 
    213    $status = 1;
    214    $curdir = getcwd;
    215    $curdir = win_path($curdir);
    216    $prog_path = "$curdir\\$prog.exe";
    217    
    218    print_begin($prog);
    219    
    220    Win32::Process::Create($ProcessObj,
    221                           "$prog_path",
    222                           "$prog",
    223                           0,
    224                           NORMAL_PRIORITY_CLASS,
    225                           ".")|| die win_ErrorReport();
    226    $retwait = $ProcessObj->Wait($timeout * 1000);
    227        
    228    if ( $retwait == 0) {
    229        # the prog didn't finish after the timeout: kill
    230        $ProcessObj->Kill($status);
    231        print "Timeout ! Process killed with exit status $status\n";
    232    } else {
    233        # the prog finished before the timeout: get exit status
    234        $ProcessObj->GetExitCode($status);
    235    }
    236    # There is no signal, no core on Windows
    237    print_end($prog, $status, 0, 0);
    238 
    239    return $status
    240 }
    241 
    242 # MAIN ---------------
    243 @progs = (
    244 "abstract",
    245 "accept",
    246 "acceptread",
    247 "acceptreademu",
    248 "affinity",
    249 "alarm",
    250 "anonfm",
    251 "atomic",
    252 "attach",
    253 "bigfile",
    254 "cleanup",
    255 "cltsrv",
    256 "concur",
    257 "cvar",
    258 "cvar2",
    259 "dlltest",
    260 "dtoa",
    261 "errcodes",
    262 "exit",
    263 "fdcach",
    264 "fileio",
    265 "foreign",
    266 "formattm",
    267 "fsync",
    268 "gethost",
    269 "getproto",
    270 "i2l",
    271 "initclk",
    272 "inrval",
    273 "instrumt",
    274 "intrio",
    275 "intrupt",
    276 "io_timeout",
    277 "ioconthr",
    278 "join",
    279 "joinkk",
    280 "joinku",
    281 "joinuk",
    282 "joinuu",
    283 "layer",
    284 "lazyinit",
    285 "libfilename",
    286 "lltest",
    287 "lock",
    288 "lockfile",
    289 "logfile",
    290 "logger",
    291 "many_cv",
    292 "nameshm1",
    293 "nblayer",
    294 "nonblock",
    295 "ntioto",
    296 "ntoh",
    297 "op_2long",
    298 "op_excl",
    299 "op_filnf",
    300 "op_filok",
    301 "op_nofil",
    302 "parent",
    303 "parsetm",
    304 "peek",
    305 "perf",
    306 "pipeping",
    307 "pipeping2",
    308 "pipeself",
    309 "poll_nm",
    310 "poll_to",
    311 "pollable",
    312 "prftest",
    313 "prfz",
    314 "primblok",
    315 "provider",
    316 "prpollml",
    317 "pushtop",
    318 "ranfile",
    319 "randseed",
    320 "reinit",
    321 "rwlocktest",
    322 "sel_spd",
    323 "selct_er",
    324 "selct_nm",
    325 "selct_to",
    326 "selintr",
    327 "sema",
    328 "semaerr",
    329 "semaping",
    330 "sendzlf",
    331 "server_test",
    332 "servr_kk",
    333 "servr_uk",
    334 "servr_ku",
    335 "servr_uu",
    336 "short_thread",
    337 "sigpipe",
    338 "socket",
    339 "sockopt",
    340 "sockping",
    341 "sprintf",
    342 "stack",
    343 "stdio",
    344 "str2addr",
    345 "strod",
    346 "switch",
    347 "system",
    348 "testbit",
    349 "testfile",
    350 "threads",
    351 "timemac",
    352 "timetest",
    353 "tpd",
    354 "udpsrv",
    355 "vercheck",
    356 "version",
    357 "writev",
    358 "xnotify",
    359 "zerolen");
    360 
    361 open_log;
    362 
    363 foreach $current_prog (@progs) {
    364    if ($osname =~ $WINOS) {
    365        win_test_prog($current_prog);
    366    } else {
    367        ux_test_prog($current_prog);
    368    }
    369 }
    370 
    371 close_log;