File: regression_encoder.py

package info (click to toggle)
zydis 4.1.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,920 kB
  • sloc: ansic: 20,258; python: 2,769; makefile: 57; sh: 13
file content (52 lines) | stat: -rwxr-xr-x 1,831 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3
from crash_tool import *
from subprocess import Popen, PIPE


def run_test(binary, payload=None):
    proc = Popen(binary, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    proc.communicate(input=payload)
    return proc.returncode == 0


def run_test_collection(test_db_file, binary, converter):
    with open(test_db_file, 'r') as f:
        cases = json.loads(f.read())
    tests_passed = True
    for i, case in enumerate(cases):
        test_result = run_test(binary, converter(case, True))
        tests_passed &= test_result
        description = 'Case #%d: ' % i
        if 'description' in case:
            description += case['description']
        else:
            description += case['mnemonic'][case['mnemonic'].rfind('_') + 1:].lower()
        print('[%s] %s' % ('PASSED' if test_result else 'FAILED', description))
    return tests_passed


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Runs regression tests for encoder')
    parser.add_argument('zydis_fuzz_re_enc_path')
    parser.add_argument('zydis_fuzz_enc_path')
    parser.add_argument('zydis_test_tool_path')
    args = parser.parse_args()

    print('Running re-encoding tests:')
    all_passed = run_test_collection('re_enc_test_cases.json', args.zydis_fuzz_re_enc_path, convert_re_enc_json_to_crash)
    print()
    print('Running encoding tests:')
    all_passed &= run_test_collection('enc_test_cases.json', args.zydis_fuzz_enc_path, convert_enc_json_to_crash)
    print()
    print('Running encoding tests (absolute address mode):')
    result = run_test(args.zydis_test_tool_path)
    all_passed &= result
    print('Success' if result else 'FAILED')
    print()

    if all_passed:
        print('ALL TESTS PASSED')
        sys.exit(0)
    else:
        print('SOME TESTS FAILED')
        sys.exit(1)