148 lines · python
1#!/usr/bin/env python2 3import gmpapi4import sys5 6 7def print_header(outf):8 outf.write(9 """10#AUTOGENERATED FILE11import ctypes12import os13import sys14import binascii15 16verbose = False17fork = False18 """19 )20 21 22def print_cmp(outf):23 outf.write(24 """25def passt(line, name, a_s, b_s):26 if verbose:27 print("PASS: {}@{} {} == {}".format(line, name, a_s, b_s))28 return True29 30def fail(line, name, a_s, b_s):31 print("FAIL: {}@{} {} != {}".format(line, name, a_s,b_s))32 return False33 34def cstr_eq(line, name, a, b):35 a_s = a.value.decode("utf-8")36 b_s = b.value.decode("utf-8")37 38 if a_s == b_s:39 return passt(line, name, a_s, b_s)40 else:41 return fail(line, name, a_s, b_s)42 43def bytes_eq(line, name, a, b):44 if a == b:45 return passt(line, name, a, b)46 else:47 return fail(line, name, a, b)48 49def run_test(test, line, name, gmp_test_so, imath_test_so, *args):50 if fork:51 childpid = os.fork()52 else:53 childpid = 054 if childpid == 0:55 eq = test(line, name, gmp_test_so, imath_test_so, *args)56 if fork:57 sys.exit(eq != True)58 else:59 return eq60 else:61 (pid, status) = os.waitpid(childpid, 0)62 return status == 063 64# custom tests65def test_mpz_export(line, name, gmp_test_so, imath_test_so, *args):66 # do not use first two args from the test. need to create our own pointers67 used_args = args[2:]68 gbuf = ctypes.create_string_buffer(b'0xdeadbeef'*1024);69 gsize = ctypes.c_size_t()70 gout = ctypes.c_void_p()71 ibuf = ctypes.create_string_buffer(b'0xdeadbeef'*1024);72 isize = ctypes.c_size_t()73 iout = ctypes.c_void_p()74 word_size = args[3].value75 76 #Test with a NULL pointer77 gmp_test_so.test_mpz_export(ctypes.byref(gout), None, ctypes.byref(gsize), *used_args)78 imath_test_so.test_mpz_export(ctypes.byref(iout), None, ctypes.byref(isize), *used_args)79 gb = ctypes.string_at(gout.value, gsize.value * word_size)80 ib = ctypes.string_at(iout.value, isize.value * word_size)81 if not bytes_eq(line, name, gb, ib):82 return False83 84 #Test with a provided buffer85 gmp_test_so.test_mpz_export(ctypes.byref(gout), gbuf, ctypes.byref(gsize), *used_args)86 imath_test_so.test_mpz_export(ctypes.byref(iout), ibuf, ctypes.byref(isize), *used_args)87 #print("G:gbuf", gbuf.raw[:gsize.value * word_size])88 #print("I:ibuf", ibuf.raw[:isize.value * word_size])89 gb = ctypes.string_at(gout.value, gsize.value * word_size)90 ib = ctypes.string_at(iout.value, isize.value * word_size)91 if not bytes_eq(line, name, gb, ib):92 return False93 94 return True95 96def test_mpz_import(line, name, gmp_test_so, imath_test_so, *args):97 # do not use first two args from the test. need to create our own pointers98 gout = ctypes.create_string_buffer(b'0xdeadbeef'*1024);99 iout = ctypes.create_string_buffer(b'0xdeadbeef'*1024);100 101 gmp_test_so.test_mpz_import(gout, *args)102 imath_test_so.test_mpz_import(iout, *args)103 #print(gout.raw[:70])104 #print(iout.raw[:70])105 return cstr_eq(line, name, gout, iout)106 107"""108 )109 110 111def print_api(name, outf):112 outf.write(113 """114def test_{0}(line, name, gmp_test_so, imath_test_so, *args):115 gout = ctypes.create_string_buffer(1024*4);116 iout = ctypes.create_string_buffer(1024*4);117 gmp_test_so.test_{0}(gout, *args)118 imath_test_so.test_{0}(iout, *args)119 eq = cstr_eq(line, name, gout, iout)120 return eq121""".format(122 name123 )124 )125 126 127def print_api_map(outf):128 outf.write(129 """130def get_wrapper(name):131 test_wrappers = {132"""133 )134 for api in gmpapi.apis:135 outf.write(' "{}" : {},\n'.format(api.name, "test_" + api.name))136 outf.write(" }\n")137 outf.write(" return test_wrappers[name]\n")138 139 140if __name__ == "__main__":141 outf = sys.stdout142 print_header(outf)143 print_cmp(outf)144 for api in gmpapi.apis:145 if not api.custom_test:146 print_api(api.name, outf)147 print_api_map(outf)148