diff options
| author | Mole Shang <135e2@135e2.dev> | 2024-02-13 19:39:56 +0800 | 
|---|---|---|
| committer | Mole Shang <135e2@135e2.dev> | 2024-02-13 19:39:56 +0800 | 
| commit | 89ef6f717ed4b3e702e5f6f906f58fe1ea27d366 (patch) | |
| tree | 760cce316675479a6cca77551438e8d2cc5fe9ae /grade-lab-traps | |
| parent | cfae93475dfb4cb5cfe264f4c029136e1447c262 (diff) | |
| parent | 4a6593f1a6f666c618d303a4858c4c6d31b41c63 (diff) | |
| download | xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.tar.gz xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.tar.bz2 xv6-labs-89ef6f717ed4b3e702e5f6f906f58fe1ea27d366.zip | |
Merge branch 'cow' into net
Conflicts:
	.gitignore
	Makefile
	conf/lab.mk
	kernel/defs.h
	kernel/syscall.c
	kernel/vm.c
	user/pingpong.c
	user/user.h
	user/usys.pl
Diffstat (limited to 'grade-lab-traps')
| -rwxr-xr-x | grade-lab-traps | 74 | 
1 files changed, 74 insertions, 0 deletions
| diff --git a/grade-lab-traps b/grade-lab-traps new file mode 100755 index 0000000..10613d3 --- /dev/null +++ b/grade-lab-traps @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 + +import os +import re +import subprocess +from gradelib import * + +r = Runner(save("xv6.out")) + +@test(5, "answers-traps.txt") +def test_answers(): +    # just a simple sanity check, will be graded manually +    check_answers("answers-traps.txt") + +BACKTRACE_RE = r"^(0x000000008[0-9a-f]+)" + +def addr2line(): +    for f in ['riscv64-unknown-elf-addr2line', 'riscv64-linux-gnu-addr2line', 'addr2line', ]: +        try: +            devnull = open(os.devnull) +            subprocess.Popen([f], stdout=devnull, stderr=devnull).communicate() +            return f +        except OSError: +            continue +    raise AssertionError('Cannot find the addr2line program') + +@test(10, "backtrace test") +def test_backtracetest(): +    r.run_qemu(shell_script([ +        'bttest' +    ])) +    a2l = addr2line() +    matches = re.findall(BACKTRACE_RE, r.qemu.output, re.MULTILINE) +    assert_equal(len(matches), 3) +    files = ['sysproc.c', 'syscall.c', 'trap.c'] +    for f, m in zip(files, matches): +        result = subprocess.run([a2l, '-e', 'kernel/kernel', m], stdout=subprocess.PIPE) +        if not f in result.stdout.decode("utf-8"): +            raise AssertionError('Trace is incorrect; no %s' % f) + +@test(0, "running alarmtest") +def test_alarmtest(): +    r.run_qemu(shell_script([ +        'alarmtest' +    ])) + +@test(20, "alarmtest: test0", parent=test_alarmtest) +def test_alarmtest_test0(): +    r.match('^test0 passed$') + +@test(20, "alarmtest: test1", parent=test_alarmtest) +def test_alarmtest_test1(): +    r.match('^\\.?test1 passed$') + +@test(10, "alarmtest: test2", parent=test_alarmtest) +def test_alarmtest_test2(): +    r.match('^\\.?test2 passed$') + +@test(10, "alarmtest: test3", parent=test_alarmtest) +def test_alarmtest_test3(): +    r.match('^test3 passed$') + +@test(19, "usertests") +def test_usertests(): +    r.run_qemu(shell_script([ +        'usertests -q' +    ]), timeout=300) +    r.match('^ALL TESTS PASSED$') + +@test(1, "time") +def test_time(): +    check_time() + +run_tests() | 
