X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=grading%2Ffilesys%2Frun-tests;h=7251cef06c412b4f2052ef63cf4feb2c92ea6e46;hb=415941c1e0a6fc5ce263d8355fde980239c0f844;hp=7e7b0e9a28a4d69b1b59c9e0c821b2fb40787c14;hpb=d5b6f0eba392ee44f68cda2a821eac8fffa683e2;p=pintos-anon diff --git a/grading/filesys/run-tests b/grading/filesys/run-tests index 7e7b0e9..7251cef 100755 --- a/grading/filesys/run-tests +++ b/grading/filesys/run-tests @@ -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,79 @@ 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 ($pintos_base_cmd) = + "pintos " + . "--os-disk=pintos/src/$hw/build/os.dsk " + . "--fs-disk=output/$test/fs.dsk " + . "--swap-disk=output/$test/swap.dsk " + . "-v"; + $result = run_pintos ("$pintos_base_cmd 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 ("$pintos_base_cmd 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 ("$pintos_base_cmd run -q -ex \"$test\"", + LOG => "$test/run", TIMEOUT => 120); +} sub grade_dir_lsdir { my (@output) = @_;