Make tests public. Rewrite most tests. Add tests.
[pintos-anon] / src / tests / userprog / no-vm / multi-oom.ck
diff --git a/src/tests/userprog/no-vm/multi-oom.ck b/src/tests/userprog/no-vm/multi-oom.ck
new file mode 100644 (file)
index 0000000..52434a2
--- /dev/null
@@ -0,0 +1,43 @@
+# -*- perl -*-
+use strict;
+use warnings;
+use tests::tests;
+
+our ($test);
+my (@output) = read_text_file ("$test.output");
+common_checks (@output);
+
+@output = get_core_output (@output);
+my ($n) = 0;
+while (my ($m) = $output[0] =~ /^\(multi-oom\) begin (\d+)$/) {
+    fail "Child process $m started out of order.\n" if $m != $n;
+    $n = $m + 1;
+    shift @output;
+}
+fail "Only $n child process(es) started.\n" if $n < 15;
+
+# There could be a death notice for a process that didn't get
+# fully loaded, and/or notices from the loader.
+while (@output > 0
+       && ($output[0] =~ /^multi-oom: exit\(-1\)$/
+          || $output[0] =~ /^load: /)) {
+    shift @output;
+}
+
+while (--$n >= 0) {
+    fail "Output ended unexpectedly before process $n finished.\n"
+      if @output < 2;
+
+    local ($_);
+    chomp ($_ = shift @output);
+    fail "Found '$_' expecting 'end' message.\n" if !/^\(multi-oom\) end/;
+    fail "Child process $n ended out of order.\n"
+      if !/^\(multi-oom\) end $n$/;
+
+    chomp ($_ = shift @output);
+    fail "Kernel didn't print proper exit message for process $n.\n"
+      if !/^multi-oom: exit\($n\)$/;
+}
+fail "Spurious output at end: '$output[0]'.\n" if @output;
+
+pass;