143ab4a0de904664a237e28d556a1abdf3b35e88
[pintos-anon] / grading / filesys / run-tests
1 #! /usr/bin/perl
2
3 # Find the directory that contains the grading files.
4 our ($GRADES_DIR);
5
6 # Add our Perl library directory to the include path. 
7 BEGIN {
8     ($GRADES_DIR = $0) =~ s#/[^/]+$##;
9     -d $GRADES_DIR or die "$GRADES_DIR: stat: $!\n";
10     unshift @INC, "$GRADES_DIR/../lib";
11 }
12
13 use warnings;
14 use strict;
15 use Pintos::Grading;
16
17 our ($hw) = "filesys";
18 our (@TESTS);           # Tests to run.
19 our ($test);
20 our ($action);
21
22 parse_cmd_line qw (sm-create sm-full sm-seq-block sm-seq-random sm-random
23
24                    lg-create lg-full lg-seq-block lg-seq-random lg-random
25
26                    grow-create grow-seq-sm grow-seq-lg grow-file-size grow-tell
27                    grow-sparse grow-too-big grow-root-sm grow-root-lg
28                    grow-dir-lg grow-two-files
29
30                    dir-mkdir dir-rmdir dir-mk-vine dir-rm-vine dir-mk-tree
31                    dir-rm-tree dir-lsdir dir-rm-cwd dir-rm-cwd-cd
32                    dir-rm-parent dir-rm-root dir-over-file dir-under-file
33                    dir-empty-name dir-open
34
35                    syn-remove syn-read syn-write syn-rw);
36
37 clean_dir (), exit if $action eq 'clean';
38
39 extract_sources (); 
40 exit if $action eq 'extract';
41
42 build (); 
43 exit if $action eq 'build';
44
45 run_and_grade_tests (); 
46 write_grades (); 
47 write_details ();
48 exit if $action eq 'test';
49
50 assemble_final_grade ();
51 exit if $action eq 'assemble';
52
53 die "Don't know how to '$action'";
54
55 # Runs $test in directory output/$test.
56 # Returns 'ok' if it went ok, otherwise an explanation.
57 sub run_test {
58     my ($result);
59
60     my ($fs_size) = $test ne 'grow-too-big' ? 2 : .25;
61     xsystem ("pintos make-disk output/$test/fs.dsk $fs_size >/dev/null 2>&1",
62              DIE => "failed to create file system disk");
63     xsystem ("pintos make-disk output/$test/swap.dsk 2 >/dev/null 2>&1",
64              DIE => "failed to create swap disk");
65
66     # Format disk, install test.
67     my ($pintos_base_cmd) =
68         "pintos "
69         . "--os-disk=pintos/src/$hw/build/os.dsk "
70         . "--fs-disk=output/$test/fs.dsk "
71         . "--swap-disk=output/$test/swap.dsk "
72         . "-v";
73     $result = run_pintos ("$pintos_base_cmd put -f $GRADES_DIR/$test $test",
74                           LOG => "$test/put", TIMEOUT => 60);
75     return $result if $result ne 'ok';
76
77     my (@extra_files);
78     push (@extra_files, "child-syn-read") if $test eq 'syn-read';
79     push (@extra_files, "child-syn-wrt") if $test eq 'syn-write';
80     push (@extra_files, "child-syn-rw") if $test eq 'syn-rw';
81     for my $fn (@extra_files) {
82         $result = run_pintos ("$pintos_base_cmd put $GRADES_DIR/$fn $fn",
83                               LOG => "$test/put-$fn", TIMEOUT => 60);
84         return "Error running `put $fn': $result" if $result ne 'ok';
85     }
86     
87     # Run.
88     return run_pintos ("$pintos_base_cmd run -q -ex \"$test\"",
89                        LOG => "$test/run", TIMEOUT => 120);
90 }
91
92 sub grade_dir_lsdir {
93     my (@output) = @_;
94     verify_common (@output);
95     @output = get_core_output (@output);
96
97     my ($begin);
98     for my $i (0...$#output) {
99         $begin = $i, last if $output[$i] eq '(dir-lsdir) begin';
100     }
101     die "\"(dir-lsdir) begin\" does not appear in output\n" if !defined $begin;
102
103     my ($end);
104     for my $i (0...$#output) {
105         $end = $i, last if $output[$i] eq '(dir-lsdir) end';
106     }
107     die "\"(dir-lsdir) end\" does not appear in output\n" if !defined $end;
108     die "\"begin\" follows \"end\" in output\n" if $begin > $end;
109
110     my (%count);
111     for my $fn (@output[$begin + 1...$end - 1]) {
112         $fn =~ s/\s+$//;
113         die "Unexpected file \"$fn\" in lsdir output\n"
114             unless grep ($_ eq $fn, qw (. .. dir-lsdir));
115         die "File \"$fn\" listed twice in lsdir output\n"
116             if $count{$fn};
117         $count{$fn}++;
118     }
119     die "No files in lsdir output\n" if scalar (keys (%count)) == 0;
120     die "File \"dir-lsdir\" missing from lsdir output\n"
121         if !$count{"dir-lsdir"};
122 }
123
124 # This should be improved, but none of the fall 2004 submissions
125 # survived the test!
126 # I suppose it could be a bug in the test but a lot of the submissions
127 # had kernel panics, etc.
128 sub grade_syn_rw {
129     verify_common (@_);
130 }