Fix runaway bochs, pintos processes on time-outs.
[pintos-anon] / grading / filesys / run-tests
index 7e7b0e9a28a4d69b1b59c9e0c821b2fb40787c14..1b768abf84beb073ab3d15a5e4c1bf9fb7f1a0ad 100755 (executable)
@@ -1,7 +1,7 @@
 #! /usr/bin/perl
 
 # Find the directory that contains the grading files.
-use vars qw($GRADES_DIR);
+our ($GRADES_DIR);
 
 # Add our Perl library directory to the include path. 
 BEGIN {
@@ -15,51 +15,78 @@ use strict;
 use Pintos::Grading;
 
 our ($hw) = "filesys";
-our ($verbose) = 0;    # Verbosity of output
 our (@TESTS);          # Tests to run.
-our ($clean) = 0;
-our ($grade) = 0;
+our ($test);
+our ($action);
 
-parse_cmd_line ();
+parse_cmd_line qw (sm-create sm-full sm-seq-block sm-seq-random sm-random
 
-# Default set of tests.
-@TESTS = qw (sm-create sm-full sm-seq-block sm-seq-random sm-random
+                  lg-create lg-full lg-seq-block lg-seq-random lg-random
 
-            lg-create lg-full lg-seq-block lg-seq-random lg-random
+                  grow-create grow-seq-sm grow-seq-lg grow-file-size grow-tell
+                  grow-sparse grow-too-big grow-root-sm grow-root-lg
+                  grow-dir-lg grow-two-files
 
-            grow-create grow-seq-sm grow-seq-lg grow-file-size grow-tell
-            grow-sparse grow-too-big grow-root-sm grow-root-lg grow-dir-lg 
-            grow-two-files
+                  dir-mkdir dir-rmdir dir-mk-vine dir-rm-vine dir-mk-tree
+                  dir-rm-tree dir-lsdir dir-rm-cwd dir-rm-cwd-cd
+                  dir-rm-parent dir-rm-root dir-over-file dir-under-file
+                  dir-empty-name dir-open
 
-            dir-mkdir dir-rmdir dir-mk-vine dir-rm-vine dir-mk-tree
-            dir-rm-tree dir-lsdir dir-rm-cwd dir-rm-cwd-cd
-            dir-rm-parent dir-rm-root dir-over-file dir-under-file
-            dir-empty-name dir-open
+                  syn-remove syn-read syn-write syn-rw);
 
-            syn-remove syn-read syn-write syn-rw
-            ) unless @TESTS > 0;
+clean_dir (), exit if $action eq 'clean';
 
-compose_final_grade (), exit 0 if $grade;
-clean_dir (), exit 0 if $clean;
+extract_sources (); 
+exit if $action eq 'extract';
 
-# Create output directory, if it doesn't already exist.
--d ("output") || mkdir ("output") or die "output: mkdir: $!\n";
+build (); 
+exit success () if $action eq 'build';
 
-# Extract submission.
-obtain_sources ();
-
-# Compile submission.
-compile ();
-
-# Verify that the proper directory was submitted.
--d "pintos/src/threads" or die "pintos/src/threads: stat: $!\n";
-
-# Run and grade the tests.
-run_and_grade_tests ();
-
-# Write output.
-write_grades ();
+run_and_grade_tests (); 
+write_grades (); 
 write_details ();
+exit success () if $action eq 'test';
+
+assemble_final_grade ();
+exit if $action eq 'assemble';
+
+die "Don't know how to '$action'";
+
+# Runs $test in directory output/$test.
+# Returns 'ok' if it went ok, otherwise an explanation.
+sub run_test {
+    my ($result);
+
+    my ($fs_size) = $test ne 'grow-too-big' ? 2 : .25;
+    xsystem ("pintos make-disk output/$test/fs.dsk $fs_size >/dev/null 2>&1",
+            DIE => "failed to create file system disk");
+    xsystem ("pintos make-disk output/$test/swap.dsk 2 >/dev/null 2>&1",
+            DIE => "failed to create swap disk");
+
+    # Format disk, install test.
+    my (@base_opts) = ("--os-disk=pintos/src/$hw/build/os.dsk",
+                      "--fs-disk=output/$test/fs.dsk",
+                      "--swap-disk=output/$test/swap.dsk",
+                      "-v");
+    $result = run_pintos ([@base_opts,
+                          "put", "-f", "$GRADES_DIR/$test", $test],
+                         LOG => "$test/put", TIMEOUT => 60);
+    return $result if $result ne 'ok';
+
+    my (@extra_files);
+    push (@extra_files, "child-syn-read") if $test eq 'syn-read';
+    push (@extra_files, "child-syn-wrt") if $test eq 'syn-write';
+    push (@extra_files, "child-syn-rw") if $test eq 'syn-rw';
+    for my $fn (@extra_files) {
+       $result = run_pintos ([@base_opts, "put", "$GRADES_DIR/$fn", $fn],
+                             LOG => "$test/put-$fn", TIMEOUT => 60);
+       return "Error running `put $fn': $result" if $result ne 'ok';
+    }
+    
+    # Run.
+    return run_pintos ([@base_opts, "run", "-q", "-ex", $test],
+                      LOG => "$test/run", TIMEOUT => 120);
+}
 
 sub grade_dir_lsdir {
     my (@output) = @_;