#!/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)