Lab 4
This commit is contained in:
190
grade-lab4
Executable file
190
grade-lab4
Executable file
@@ -0,0 +1,190 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import re
|
||||
from gradelib import *
|
||||
|
||||
r = Runner(save("jos.out"),
|
||||
stop_breakpoint("readline"))
|
||||
|
||||
def E(s, trim=False):
|
||||
"""Expand $En in s to the environment ID of the n'th user
|
||||
environment."""
|
||||
|
||||
tmpl = "%x" if trim else "%08x"
|
||||
return re.sub(r"\$E([0-9]+)",
|
||||
lambda m: tmpl % (0x1000 + int(m.group(1))-1), s)
|
||||
|
||||
@test(5)
|
||||
def test_dumbfork():
|
||||
r.user_test("dumbfork")
|
||||
r.match(E(".00000000. new env $E1"),
|
||||
E(".$E1. new env $E2"),
|
||||
"0: I am the parent.",
|
||||
"9: I am the parent.",
|
||||
"0: I am the child.",
|
||||
"9: I am the child.",
|
||||
"19: I am the child.",
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E1. free env $E1"),
|
||||
E(".$E2. exiting gracefully"),
|
||||
E(".$E2. free env $E2"))
|
||||
|
||||
end_part("A")
|
||||
|
||||
@test(5)
|
||||
def test_faultread():
|
||||
r.user_test("faultread")
|
||||
r.match(E(".$E1. user fault va 00000000 ip 008....."),
|
||||
"TRAP frame at 0xf....... from CPU .",
|
||||
" trap 0x0000000e Page Fault",
|
||||
" err 0x00000004.*",
|
||||
E(".$E1. free env $E1"),
|
||||
no=["I read ........ from location 0."])
|
||||
|
||||
@test(5)
|
||||
def test_faultwrite():
|
||||
r.user_test("faultwrite")
|
||||
r.match(E(".$E1. user fault va 00000000 ip 008....."),
|
||||
"TRAP frame at 0xf....... from CPU .",
|
||||
" trap 0x0000000e Page Fault",
|
||||
" err 0x00000006.*",
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_faultdie():
|
||||
r.user_test("faultdie")
|
||||
r.match("i faulted at va deadbeef, err 6",
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_faultregs():
|
||||
r.user_test("faultregs")
|
||||
r.match("Registers in UTrapframe OK",
|
||||
"Registers after page-fault OK",
|
||||
no=["Registers in UTrapframe MISMATCH",
|
||||
"Registers after page-fault MISMATCH"])
|
||||
|
||||
@test(5)
|
||||
def test_faultalloc():
|
||||
r.user_test("faultalloc")
|
||||
r.match("fault deadbeef",
|
||||
"this string was faulted in at deadbeef",
|
||||
"fault cafebffe",
|
||||
"fault cafec000",
|
||||
"this string was faulted in at cafebffe",
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_faultallocbad():
|
||||
r.user_test("faultallocbad")
|
||||
r.match(E(".$E1. user_mem_check assertion failure for va deadbeef"),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_faultnostack():
|
||||
r.user_test("faultnostack")
|
||||
r.match(E(".$E1. user_mem_check assertion failure for va eebfff.."),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_faultbadhandler():
|
||||
r.user_test("faultbadhandler")
|
||||
r.match(E(".$E1. user_mem_check assertion failure for va (deadb|eebfe)..."),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_faultevilhandler():
|
||||
r.user_test("faultevilhandler")
|
||||
r.match(E(".$E1. user_mem_check assertion failure for va (f0100|eebfe)..."),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_forktree():
|
||||
r.user_test("forktree")
|
||||
r.match("....: I am .0.",
|
||||
"....: I am .1.",
|
||||
"....: I am .000.",
|
||||
"....: I am .100.",
|
||||
"....: I am .110.",
|
||||
"....: I am .111.",
|
||||
"....: I am .011.",
|
||||
"....: I am .001.",
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E2. exiting gracefully"),
|
||||
".0000200.. exiting gracefully",
|
||||
".0000200.. free env 0000200.")
|
||||
|
||||
end_part("B")
|
||||
|
||||
@test(5)
|
||||
def test_spin():
|
||||
r.user_test("spin")
|
||||
r.match(E(".00000000. new env $E1"),
|
||||
"I am the parent. Forking the child...",
|
||||
E(".$E1. new env $E2"),
|
||||
"I am the parent. Running the child...",
|
||||
"I am the child. Spinning...",
|
||||
"I am the parent. Killing the child...",
|
||||
E(".$E1. destroying $E2"),
|
||||
E(".$E1. free env $E2"),
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E1. free env $E1"))
|
||||
|
||||
@test(5)
|
||||
def test_stresssched():
|
||||
r.user_test("stresssched", make_args=["CPUS=4"])
|
||||
r.match(".000010... stresssched on CPU 0",
|
||||
".000010... stresssched on CPU 1",
|
||||
".000010... stresssched on CPU 2",
|
||||
".000010... stresssched on CPU 3",
|
||||
no=[".*ran on two CPUs at once"])
|
||||
|
||||
@test(5)
|
||||
def test_sendpage():
|
||||
r.user_test("sendpage", make_args=["CPUS=2"])
|
||||
r.match(".00000000. new env 00001000",
|
||||
E(".00000000. new env $E1"),
|
||||
E(".$E1. new env $E2"),
|
||||
E("$E1 got message: hello child environment! how are you?", trim=True),
|
||||
E("child received correct message", trim=True),
|
||||
E("$E2 got message: hello parent environment! I'm good", trim=True),
|
||||
E("parent received correct message", trim=True),
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E1. free env $E1"),
|
||||
E(".$E2. exiting gracefully"),
|
||||
E(".$E2. free env $E2"))
|
||||
|
||||
@test(5)
|
||||
def test_pingpong():
|
||||
r.user_test("pingpong", make_args=["CPUS=4"])
|
||||
r.match(E(".00000000. new env $E1"),
|
||||
E(".$E1. new env $E2"),
|
||||
E("send 0 from $E1 to $E2", trim=True),
|
||||
E("$E2 got 0 from $E1", trim=True),
|
||||
E("$E1 got 1 from $E2", trim=True),
|
||||
E("$E2 got 8 from $E1", trim=True),
|
||||
E("$E1 got 9 from $E2", trim=True),
|
||||
E("$E2 got 10 from $E1", trim=True),
|
||||
E(".$E1. exiting gracefully"),
|
||||
E(".$E1. free env $E1"),
|
||||
E(".$E2. exiting gracefully"),
|
||||
E(".$E2. free env $E2"))
|
||||
|
||||
@test(5)
|
||||
def test_primes():
|
||||
r.user_test("primes", stop_on_line("CPU .: 1877"), stop_on_line(".*panic"),
|
||||
make_args=["CPUS=4"], timeout=60)
|
||||
r.match(E(".00000000. new env $E1"),
|
||||
E(".$E1. new env $E2"),
|
||||
E("CPU .: 2 .$E2. new env $E3"),
|
||||
E("CPU .: 3 .$E3. new env $E4"),
|
||||
E("CPU .: 5 .$E4. new env $E5"),
|
||||
E("CPU .: 7 .$E5. new env $E6"),
|
||||
E("CPU .: 11 .$E6. new env $E7"),
|
||||
E("CPU .: 1877 .$E289. new env $E290"))
|
||||
|
||||
end_part("C")
|
||||
|
||||
run_tests()
|
||||
Reference in New Issue
Block a user