3 # Find the directory that contains the grading files.
6 # Add our Perl library directory to the include path.
8 ($GRADES_DIR = $0) =~ s#/[^/]+$##;
9 -d $GRADES_DIR or die "$GRADES_DIR: stat: $!\n";
10 unshift @INC, "$GRADES_DIR/../lib";
17 our ($hw) = "filesys";
18 our (@TESTS); # Tests to run.
24 # Default set of tests.
25 @TESTS = qw (sm-create sm-full sm-seq-block sm-seq-random sm-random
27 lg-create lg-full lg-seq-block lg-seq-random lg-random
29 grow-create grow-seq-sm grow-seq-lg grow-file-size grow-tell
30 grow-sparse grow-too-big grow-root-sm grow-root-lg grow-dir-lg
33 dir-mkdir dir-rmdir dir-mk-vine dir-rm-vine dir-mk-tree
34 dir-rm-tree dir-lsdir dir-rm-cwd dir-rm-cwd-cd
35 dir-rm-parent dir-rm-root dir-over-file dir-under-file
36 dir-empty-name dir-open
38 syn-remove syn-read syn-write syn-rw
41 clean_dir (), exit if $action eq 'clean';
44 exit if $action eq 'extract';
47 exit if $action eq 'build';
49 run_and_grade_tests ();
52 exit if $action eq 'test';
54 assemble_final_grade ();
55 exit if $action eq 'assemble';
57 die "Don't know how to '$action'";
59 # Runs $test in directory output/$test.
60 # Returns 'ok' if it went ok, otherwise an explanation.
64 my ($fs_size) = $test ne 'grow-too-big' ? 2 : .25;
65 xsystem ("pintos make-disk output/$test/fs.dsk $fs_size >/dev/null 2>&1",
66 DIE => "failed to create file system disk");
67 xsystem ("pintos make-disk output/$test/swap.dsk 2 >/dev/null 2>&1",
68 DIE => "failed to create swap disk");
70 # Format disk, install test.
71 my ($pintos_base_cmd) =
73 . "--os-disk=pintos/src/$hw/build/os.dsk "
74 . "--fs-disk=output/$test/fs.dsk "
75 . "--swap-disk=output/$test/swap.dsk "
77 $result = run_pintos ("$pintos_base_cmd put -f $GRADES_DIR/$test $test",
78 LOG => "$test/put", TIMEOUT => 60);
79 return $result if $result ne 'ok';
82 push (@extra_files, "child-syn-read") if $test eq 'syn-read';
83 push (@extra_files, "child-syn-wrt") if $test eq 'syn-write';
84 push (@extra_files, "child-syn-rw") if $test eq 'syn-rw';
85 for my $fn (@extra_files) {
86 $result = run_pintos ("$pintos_base_cmd put $GRADES_DIR/$fn $fn",
87 LOG => "$test/put-$fn", TIMEOUT => 60);
88 return "Error running `put $fn': $result" if $result ne 'ok';
92 return run_pintos ("$pintos_base_cmd run -q -ex \"$test\"",
93 LOG => "$test/run", TIMEOUT => 120);
98 verify_common (@output);
99 @output = get_core_output (@output);
102 for my $i (0...$#output) {
103 $begin = $i, last if $output[$i] eq '(dir-lsdir) begin';
105 die "\"(dir-lsdir) begin\" does not appear in output\n" if !defined $begin;
108 for my $i (0...$#output) {
109 $end = $i, last if $output[$i] eq '(dir-lsdir) end';
111 die "\"(dir-lsdir) end\" does not appear in output\n" if !defined $end;
112 die "\"begin\" follows \"end\" in output\n" if $begin > $end;
115 for my $fn (@output[$begin + 1...$end - 1]) {
117 die "Unexpected file \"$fn\" in lsdir output\n"
118 unless grep ($_ eq $fn, qw (. .. dir-lsdir));
119 die "File \"$fn\" listed twice in lsdir output\n"
123 die "No files in lsdir output\n" if scalar (keys (%count)) == 0;
124 die "File \"dir-lsdir\" missing from lsdir output\n"
125 if !$count{"dir-lsdir"};
128 # This should be improved, but none of the fall 2004 submissions
130 # I suppose it could be a bug in the test but a lot of the submissions
131 # had kernel panics, etc.