brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 1b5a38c Raw
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