68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
import os,sys,inspect
|
|
sys.path.insert(1, os.path.join(sys.path[0], '..'))
|
|
import infernal
|
|
|
|
################################################################################
|
|
|
|
tests = []
|
|
|
|
def add_test(name, result, register, code):
|
|
tests.append((name, result, register, code))
|
|
|
|
def execute_test (register, code):
|
|
emu = infernal.Emulator(code)
|
|
emu.setStack("junk...", "calling eip")
|
|
emu.setRegs( rip = 0, rbp = 'old bp')
|
|
|
|
for line_nr in emu:
|
|
pass
|
|
|
|
return emu.getVal(register)
|
|
|
|
def printf (str, *args):
|
|
print(str.format(*args))
|
|
|
|
def execute_tests():
|
|
print("Executing tests!")
|
|
total_tests = 0
|
|
failed_tests = 0
|
|
error_tests = 0
|
|
for name, result, register, code in tests:
|
|
total_tests += 1
|
|
try:
|
|
output = execute_test(register, code)
|
|
if output != result:
|
|
failed_tests += 1
|
|
printf("Failed in {}. {} was {}, should be {}",
|
|
name, register, result, output)
|
|
except BaseException as e:
|
|
error_tests += 1
|
|
printf("Encountered error in {}: {}",name,e)
|
|
printf("Tests done! {}/{}.",
|
|
total_tests - failed_tests - error_tests, total_tests)
|
|
printf("{} failed, and {} encountered a python error",
|
|
failed_tests, error_tests)
|
|
|
|
################################################################################
|
|
|
|
add_test("constant $255", 255, "%rsi", """
|
|
movq $255, %rsi
|
|
""")
|
|
|
|
add_test("static addition 10+$20", 30, "%rsi", """
|
|
movq $10, %rsi
|
|
addq $20, %rsi
|
|
""")
|
|
|
|
add_test("register addition 10+20", 30, "%rsi", """
|
|
movq $10, %rsi
|
|
movq $20, %rax
|
|
addq %rax, %rsi
|
|
""")
|
|
|
|
|
|
################################################################################
|
|
|
|
if __name__ == "__main__":
|
|
execute_tests()
|