113 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from gradelib import *
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								r = Runner(save("jos.out"),
							 | 
						||
| 
								 | 
							
								           stop_breakpoint("readline"))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def matchtest(parent, name, *args, **kw):
							 | 
						||
| 
								 | 
							
								    def do_test():
							 | 
						||
| 
								 | 
							
								        r.match(*args, **kw)
							 | 
						||
| 
								 | 
							
								    test(5, name, parent=parent)(do_test)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(5, "internal FS tests [fs/test.c]")
							 | 
						||
| 
								 | 
							
								def test_fs():
							 | 
						||
| 
								 | 
							
								    r.user_test("hello")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "fs i/o",
							 | 
						||
| 
								 | 
							
								          "FS can do I/O")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "check_bc",
							 | 
						||
| 
								 | 
							
								          "block cache is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "check_super",
							 | 
						||
| 
								 | 
							
								          "superblock is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "check_bitmap",
							 | 
						||
| 
								 | 
							
								          "bitmap is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "alloc_block",
							 | 
						||
| 
								 | 
							
								          "alloc_block is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "file_open",
							 | 
						||
| 
								 | 
							
								          "file_open is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "file_get_block",
							 | 
						||
| 
								 | 
							
								          "file_get_block is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_fs, "file_flush/file_truncate/file rewrite",
							 | 
						||
| 
								 | 
							
								          "file_flush is good",
							 | 
						||
| 
								 | 
							
								          "file_truncate is good",
							 | 
						||
| 
								 | 
							
								          "file rewrite is good")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(10, "testfile")
							 | 
						||
| 
								 | 
							
								def test_testfile():
							 | 
						||
| 
								 | 
							
								    r.user_test("testfile")
							 | 
						||
| 
								 | 
							
								matchtest(test_testfile, "serve_open/file_stat/file_close",
							 | 
						||
| 
								 | 
							
								          "serve_open is good",
							 | 
						||
| 
								 | 
							
								          "file_stat is good",
							 | 
						||
| 
								 | 
							
								          "file_close is good",
							 | 
						||
| 
								 | 
							
								          "stale fileid is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_testfile, "file_read",
							 | 
						||
| 
								 | 
							
								          "file_read is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_testfile, "file_write",
							 | 
						||
| 
								 | 
							
								          "file_write is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_testfile, "file_read after file_write",
							 | 
						||
| 
								 | 
							
								          "file_read after file_write is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_testfile, "open",
							 | 
						||
| 
								 | 
							
								          "open is good")
							 | 
						||
| 
								 | 
							
								matchtest(test_testfile, "large file",
							 | 
						||
| 
								 | 
							
								          "large file is good")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(10, "spawn via spawnhello")
							 | 
						||
| 
								 | 
							
								def test_spawn():
							 | 
						||
| 
								 | 
							
								    r.user_test("spawnhello")
							 | 
						||
| 
								 | 
							
								    r.match('i am parent environment 00001001',
							 | 
						||
| 
								 | 
							
								            'hello, world',
							 | 
						||
| 
								 | 
							
								            'i am environment 00001002',
							 | 
						||
| 
								 | 
							
								            'No runnable environments in the system!')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(5, "Protection I/O space")
							 | 
						||
| 
								 | 
							
								def test_faultio():
							 | 
						||
| 
								 | 
							
								    r.user_test("spawnfaultio")
							 | 
						||
| 
								 | 
							
								    r.match('TRAP')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(10, "PTE_SHARE [testpteshare]")
							 | 
						||
| 
								 | 
							
								def test_pte_share():
							 | 
						||
| 
								 | 
							
								    r.user_test("testpteshare")
							 | 
						||
| 
								 | 
							
								    r.match('fork handles PTE_SHARE right',
							 | 
						||
| 
								 | 
							
								            'spawn handles PTE_SHARE right')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(5, "PTE_SHARE [testfdsharing]")
							 | 
						||
| 
								 | 
							
								def test_fd_share():
							 | 
						||
| 
								 | 
							
								    r.user_test("testfdsharing")
							 | 
						||
| 
								 | 
							
								    r.match('read in child succeeded',
							 | 
						||
| 
								 | 
							
								            'read in parent succeeded')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(10, "start the shell [icode]")
							 | 
						||
| 
								 | 
							
								def test_icode():
							 | 
						||
| 
								 | 
							
								    r.user_test("icode")
							 | 
						||
| 
								 | 
							
								    r.match('icode: read /motd',
							 | 
						||
| 
								 | 
							
								            'This is /motd, the message of the day.',
							 | 
						||
| 
								 | 
							
								            'icode: spawn /init',
							 | 
						||
| 
								 | 
							
								            'init: running',
							 | 
						||
| 
								 | 
							
								            'init: data seems okay',
							 | 
						||
| 
								 | 
							
								            'icode: exiting',
							 | 
						||
| 
								 | 
							
								            'init: bss seems okay',
							 | 
						||
| 
								 | 
							
								            "init: args: 'init' 'initarg1' 'initarg2'",
							 | 
						||
| 
								 | 
							
								            'init: running sh',
							 | 
						||
| 
								 | 
							
								            '\$ ')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(15)
							 | 
						||
| 
								 | 
							
								def test_testshell():
							 | 
						||
| 
								 | 
							
								    r.user_test("testshell", timeout=60)
							 | 
						||
| 
								 | 
							
								    r.match("shell ran correctly")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def gen_primes(n):
							 | 
						||
| 
								 | 
							
								    rest = range(2, n)
							 | 
						||
| 
								 | 
							
								    while rest:
							 | 
						||
| 
								 | 
							
								        yield rest[0]
							 | 
						||
| 
								 | 
							
								        rest = [n for n in rest if n % rest[0]]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@test(10)
							 | 
						||
| 
								 | 
							
								def test_primespipe():
							 | 
						||
| 
								 | 
							
								    r.user_test("primespipe", stop_on_line("[0-9]{4}$"), timeout=120)
							 | 
						||
| 
								 | 
							
								    primes = set(gen_primes(1000))
							 | 
						||
| 
								 | 
							
								    nonprimes = set(range(1000)) - primes
							 | 
						||
| 
								 | 
							
								    r.match(no=["%d$" % np for np in nonprimes],
							 | 
						||
| 
								 | 
							
								            *["%d$" % p for p in primes])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								run_tests()
							 |