This commit is contained in:
parent
032fac541d
commit
b503933115
|
@ -1,73 +1,20 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
import logging
|
||||||
|
import pytest
|
||||||
|
|
||||||
sys.path.insert(1, os.path.join(sys.path[0], '..'))
|
from infernal_interpreter.Junk import JunkComparisonException
|
||||||
|
from infernal_interpreter.Emulator import Emulator, CodeParseException
|
||||||
|
|
||||||
import infernal
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
tests = []
|
code_tests = []
|
||||||
|
|
||||||
|
|
||||||
def add_test(name, result, register, code):
|
def add_test(name, result, register, code):
|
||||||
tests.append((name, result, register, code))
|
code_tests.append((name, result, register, code))
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
line_nr = None
|
|
||||||
try:
|
|
||||||
emu = infernal.Emulator(code)
|
|
||||||
emu.setStack('junk...', 'calling eip')
|
|
||||||
emu.setRegs(rip=0, rbp='old bp')
|
|
||||||
except infernal.CodeParseException as e:
|
|
||||||
error_tests += 1
|
|
||||||
printf(
|
|
||||||
'Encountered error when parsing {}, at line {}: {}',
|
|
||||||
name,
|
|
||||||
e.line_nr,
|
|
||||||
e.str,
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
for line_nr in emu:
|
|
||||||
pass
|
|
||||||
if isinstance(result, BaseException):
|
|
||||||
printf('Error should have happened in {}, but did not', name)
|
|
||||||
failed_tests += 1
|
|
||||||
output = emu.getVal(register)
|
|
||||||
if output != result:
|
|
||||||
failed_tests += 1
|
|
||||||
printf(
|
|
||||||
'Failed in {}. {} was {}, should be {}',
|
|
||||||
name,
|
|
||||||
register,
|
|
||||||
output,
|
|
||||||
result,
|
|
||||||
)
|
|
||||||
except BaseException as e:
|
|
||||||
print(e)
|
|
||||||
if not isinstance(result, BaseException) or not isinstance(e, result):
|
|
||||||
error_tests += 1
|
|
||||||
printf(
|
|
||||||
'Encountered error in {}, at operation {}: {}',
|
|
||||||
name,
|
|
||||||
emu.getVal('%rip'),
|
|
||||||
e,
|
|
||||||
)
|
|
||||||
traceback.print_exc()
|
|
||||||
printf('Tests done! {}/{}.', total_tests - failed_tests - error_tests, total_tests)
|
|
||||||
printf('{} failed, and {} encountered a python error', failed_tests, error_tests)
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -158,7 +105,7 @@ for jump_instruct, a, comp, b, result in branch_tests:
|
||||||
|
|
||||||
add_test(
|
add_test(
|
||||||
'invalid comparison 1',
|
'invalid comparison 1',
|
||||||
infernal.JunkComparisonException,
|
JunkComparisonException,
|
||||||
'None',
|
'None',
|
||||||
"""
|
"""
|
||||||
start: movq $100, %rsp # Set stack pointer to a random position.
|
start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
@ -172,7 +119,7 @@ start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
|
||||||
add_test(
|
add_test(
|
||||||
'invalid addition 1',
|
'invalid addition 1',
|
||||||
infernal.JunkComparisonException,
|
JunkComparisonException,
|
||||||
'None',
|
'None',
|
||||||
"""
|
"""
|
||||||
start: movq $100, %rsp # Set stack pointer to a random position.
|
start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
@ -187,7 +134,7 @@ start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
|
||||||
add_test(
|
add_test(
|
||||||
'invalid addition 2',
|
'invalid addition 2',
|
||||||
infernal.JunkComparisonException,
|
JunkComparisonException,
|
||||||
'None',
|
'None',
|
||||||
"""
|
"""
|
||||||
start: movq $100, %rsp # Set stack pointer to a random position.
|
start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
@ -202,7 +149,7 @@ start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
|
||||||
add_test(
|
add_test(
|
||||||
'invalid subtraction 1',
|
'invalid subtraction 1',
|
||||||
infernal.JunkComparisonException,
|
JunkComparisonException,
|
||||||
'None',
|
'None',
|
||||||
"""
|
"""
|
||||||
start: movq $100, %rsp # Set stack pointer to a random position.
|
start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
@ -217,7 +164,7 @@ start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
|
||||||
add_test(
|
add_test(
|
||||||
'invalid subtraction 2',
|
'invalid subtraction 2',
|
||||||
infernal.JunkComparisonException,
|
JunkComparisonException,
|
||||||
'None',
|
'None',
|
||||||
"""
|
"""
|
||||||
start: movq $100, %rsp # Set stack pointer to a random position.
|
start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
@ -232,5 +179,44 @@ start: movq $100, %rsp # Set stack pointer to a random position.
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
if __name__ == '__main__':
|
@pytest.mark.parametrize("name,result,register,code", code_tests)
|
||||||
execute_tests()
|
def test_execution(name, result, register, code):
|
||||||
|
line_nr = None
|
||||||
|
try:
|
||||||
|
emu = Emulator(code)
|
||||||
|
emu.setStack('junk...', 'calling eip')
|
||||||
|
emu.setRegs(rip=0, rbp='old bp')
|
||||||
|
except CodeParseException as e:
|
||||||
|
logger.exception(
|
||||||
|
'Encountered error when parsing %s, at line %s: %s',
|
||||||
|
name,
|
||||||
|
e.line_nr,
|
||||||
|
e.str,
|
||||||
|
)
|
||||||
|
raise
|
||||||
|
emu = emu
|
||||||
|
|
||||||
|
try:
|
||||||
|
for line_nr in emu:
|
||||||
|
pass
|
||||||
|
if isinstance(result, BaseException):
|
||||||
|
logger.error('Error should have happened in %s, but did not', name)
|
||||||
|
output = emu.getVal(register)
|
||||||
|
if output != result:
|
||||||
|
logger.error(
|
||||||
|
'Failed in %s. %s was %s, should be %s',
|
||||||
|
name,
|
||||||
|
register,
|
||||||
|
output,
|
||||||
|
result,
|
||||||
|
)
|
||||||
|
except BaseException as e:
|
||||||
|
logger.exception('Failed')
|
||||||
|
if not isinstance(result, BaseException) or not isinstance(e, result):
|
||||||
|
logger.exception(
|
||||||
|
'Encountered error in %s, at operation %s',
|
||||||
|
name,
|
||||||
|
emu.getVal('%rip'),
|
||||||
|
)
|
||||||
|
traceback.print_exc()
|
||||||
|
raise
|
Loading…
Reference in New Issue
Block a user