| #!/usr/bin/env python |
| |
| import gmpapi |
| import sys |
| |
| |
| def print_header(outf): |
| outf.write(""" |
| #AUTOGENERATED FILE |
| import ctypes |
| import os |
| import sys |
| import binascii |
| |
| verbose = False |
| fork = False |
| """) |
| |
| |
| def print_cmp(outf): |
| outf.write(""" |
| def passt(line, name, a_s, b_s): |
| if verbose: |
| print("PASS: {}@{} {} == {}".format(line, name, a_s, b_s)) |
| return True |
| |
| def fail(line, name, a_s, b_s): |
| print("FAIL: {}@{} {} != {}".format(line, name, a_s,b_s)) |
| return False |
| |
| def cstr_eq(line, name, a, b): |
| a_s = a.value.decode("utf-8") |
| b_s = b.value.decode("utf-8") |
| |
| if a_s == b_s: |
| return passt(line, name, a_s, b_s) |
| else: |
| return fail(line, name, a_s, b_s) |
| |
| def bytes_eq(line, name, a, b): |
| if a == b: |
| return passt(line, name, a, b) |
| else: |
| return fail(line, name, a, b) |
| |
| def run_test(test, line, name, gmp_test_so, imath_test_so, *args): |
| if fork: |
| childpid = os.fork() |
| else: |
| childpid = 0 |
| if childpid == 0: |
| eq = test(line, name, gmp_test_so, imath_test_so, *args) |
| if fork: |
| sys.exit(eq != True) |
| else: |
| return eq |
| else: |
| (pid, status) = os.waitpid(childpid, 0) |
| return status == 0 |
| |
| # custom tests |
| def test_mpz_export(line, name, gmp_test_so, imath_test_so, *args): |
| # do not use first two args from the test. need to create our own pointers |
| used_args = args[2:] |
| gbuf = ctypes.create_string_buffer(b'0xdeadbeef'*1024); |
| gsize = ctypes.c_size_t() |
| gout = ctypes.c_void_p() |
| ibuf = ctypes.create_string_buffer(b'0xdeadbeef'*1024); |
| isize = ctypes.c_size_t() |
| iout = ctypes.c_void_p() |
| word_size = args[3].value |
| |
| #Test with a NULL pointer |
| gmp_test_so.test_mpz_export(ctypes.byref(gout), None, ctypes.byref(gsize), *used_args) |
| imath_test_so.test_mpz_export(ctypes.byref(iout), None, ctypes.byref(isize), *used_args) |
| gb = ctypes.string_at(gout.value, gsize.value * word_size) |
| ib = ctypes.string_at(iout.value, isize.value * word_size) |
| if not bytes_eq(line, name, gb, ib): |
| return False |
| |
| #Test with a provided buffer |
| gmp_test_so.test_mpz_export(ctypes.byref(gout), gbuf, ctypes.byref(gsize), *used_args) |
| imath_test_so.test_mpz_export(ctypes.byref(iout), ibuf, ctypes.byref(isize), *used_args) |
| #print("G:gbuf", gbuf.raw[:gsize.value * word_size]) |
| #print("I:ibuf", ibuf.raw[:isize.value * word_size]) |
| gb = ctypes.string_at(gout.value, gsize.value * word_size) |
| ib = ctypes.string_at(iout.value, isize.value * word_size) |
| if not bytes_eq(line, name, gb, ib): |
| return False |
| |
| return True |
| |
| def test_mpz_import(line, name, gmp_test_so, imath_test_so, *args): |
| # do not use first two args from the test. need to create our own pointers |
| gout = ctypes.create_string_buffer(b'0xdeadbeef'*1024); |
| iout = ctypes.create_string_buffer(b'0xdeadbeef'*1024); |
| |
| gmp_test_so.test_mpz_import(gout, *args) |
| imath_test_so.test_mpz_import(iout, *args) |
| #print(gout.raw[:70]) |
| #print(iout.raw[:70]) |
| return cstr_eq(line, name, gout, iout) |
| |
| """) |
| |
| |
| def print_api(name, outf): |
| outf.write(""" |
| def test_{0}(line, name, gmp_test_so, imath_test_so, *args): |
| gout = ctypes.create_string_buffer(1024*4); |
| iout = ctypes.create_string_buffer(1024*4); |
| gmp_test_so.test_{0}(gout, *args) |
| imath_test_so.test_{0}(iout, *args) |
| eq = cstr_eq(line, name, gout, iout) |
| return eq |
| """.format(name)) |
| |
| |
| def print_api_map(outf): |
| outf.write(""" |
| def get_wrapper(name): |
| test_wrappers = { |
| """) |
| for api in gmpapi.apis: |
| outf.write(' "{}" : {},\n'.format(api.name, "test_" + api.name)) |
| outf.write(" }\n") |
| outf.write(" return test_wrappers[name]\n") |
| |
| |
| if __name__ == "__main__": |
| outf = sys.stdout |
| print_header(outf) |
| print_cmp(outf) |
| for api in gmpapi.apis: |
| if not api.custom_test: |
| print_api(api.name, outf) |
| print_api_map(outf) |