153 lines · python
1#!/usr/bin/env python2 3from __future__ import print_function4 5import ctypes6import random7import gmpapi8import wrappers9import glob10import sys11import os12from optparse import OptionParser13from gmpapi import void14from gmpapi import ilong15from gmpapi import ulong16from gmpapi import mpz_t17from gmpapi import voidp18from gmpapi import size_t19from gmpapi import size_tp20from gmpapi import iint21from gmpapi import charp22from gmpapi import mpq_t23 24 25def print_failure(line, test):26 print("FAIL: {}@{}".format(line, test))27 28 29def run_tests(test_file, options):30 passes = 031 failures = 032 fail_lines = []33 for (line, test) in enumerate(open(test_file), start=1):34 if test.startswith("#"):35 continue36 if options.skip > 0 and line < options.skip:37 continue38 name, args = test.split("|")39 if options.verbose or (options.progress > 0 and line % options.progress == 0):40 print("TEST: {}@{}".format(line, test), end="")41 api = gmpapi.get_api(name)42 wrapper = wrappers.get_wrapper(name)43 input_args = args.split(",")44 if len(api.params) != len(input_args):45 raise RuntimeError(46 "Mismatch in args length: {} != {}".format(47 len(api.params), len(input_args)48 )49 )50 51 call_args = []52 for i in range(len(api.params)):53 param = api.params[i]54 if param == mpz_t:55 call_args.append(bytes(input_args[i]).encode("utf-8"))56 elif param == mpq_t:57 call_args.append(bytes(input_args[i]).encode("utf-8"))58 elif param == ulong:59 call_args.append(ctypes.c_ulong(int(input_args[i])))60 elif param == ilong:61 call_args.append(ctypes.c_long(int(input_args[i])))62 elif param == voidp or param == size_tp:63 call_args.append(ctypes.c_void_p(None))64 elif param == size_t:65 call_args.append(ctypes.c_size_t(int(input_args[i])))66 elif param == iint:67 call_args.append(ctypes.c_int(int(input_args[i])))68 # pass null for charp69 elif param == charp:70 if input_args[i] == "NULL":71 call_args.append(ctypes.c_void_p(None))72 else:73 call_args.append(bytes(input_args[i]).encode("utf-8"))74 else:75 raise RuntimeError("Unknown param type: {}".format(param))76 77 res = wrappers.run_test(78 wrapper, line, name, gmp_test_so, imath_test_so, *call_args79 )80 if not res:81 failures += 182 print_failure(line, test)83 fail_lines.append((line, test))84 else:85 passes += 186 return (passes, failures, fail_lines)87 88 89def parse_args():90 parser = OptionParser()91 parser.add_option(92 "-f",93 "--fork",94 help="fork() before each operation",95 action="store_true",96 default=False,97 )98 parser.add_option(99 "-v",100 "--verbose",101 help="print PASS and FAIL tests",102 action="store_true",103 default=False,104 )105 parser.add_option(106 "-p",107 "--progress",108 help="print progress every N tests ",109 metavar="N",110 type="int",111 default=0,112 )113 parser.add_option(114 "-s", "--skip", help="skip to test N", metavar="N", type="int", default=0115 )116 return parser.parse_args()117 118 119if __name__ == "__main__":120 (options, tests) = parse_args()121 gmp_test_so = ctypes.cdll.LoadLibrary("gmp_test.so")122 imath_test_so = ctypes.cdll.LoadLibrary("imath_test.so")123 124 wrappers.verbose = options.verbose125 wrappers.fork = options.fork126 127 total_pass = 0128 total_fail = 0129 all_fail_lines = []130 for test_file in tests:131 print("Running tests in {}".format(test_file))132 (passes, failures, fail_lines) = run_tests(test_file, options)133 print(134 " Tests: {}. Passes: {}. Failures: {}.".format(135 passes + failures, passes, failures136 )137 )138 total_pass += passes139 total_fail += failures140 all_fail_lines += fail_lines141 142 print("=" * 70)143 print("Total")144 print(145 " Tests: {}. Passes: {}. Failures: {}.".format(146 total_pass + total_fail, total_pass, total_fail147 )148 )149 if len(all_fail_lines) > 0:150 print("Failing Tests:")151 for (line, test) in all_fail_lines:152 print(test.rstrip())153