29
|
1 import pydc
|
|
2 import sys
|
|
3 import platform
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8 def theader(title):
|
34
|
9 print("\n"+title)
|
|
10 print('%8s %20s %16s %-20s %11s %-16s -> %16s %-16s %12s %-16s # %s' % ('DC_SIG', 'C_RET_T', 'C_FSYM', 'C_PARAMLIST', 'PY_ARG_T', 'IN_ARGS', 'RET_VAL', 'PY_RET_T', 'OUT_ARGS', 'OUT_ARGS_T', 'NOTES'))
|
29
|
11
|
|
12
|
|
13 def t(lib, dcsig, c_rtype, c_fsym, c_paramlist, extra_msg, *args):
|
34
|
14 # before call
|
|
15 inarg_types = '('+','.join(map(lambda x: type(x).__name__, args))+')'
|
|
16 inargs = ','.join(map(str, args))
|
|
17 # call
|
29
|
18 try:
|
|
19 fp = pydc.find(lib, c_fsym)
|
|
20 r = pydc.call(fp, dcsig, *args)
|
|
21 rt = type(r).__name__
|
|
22 except:
|
|
23 r = '[EXCEPTION]'
|
|
24 rt = '!'
|
34
|
25 e = str(sys.exc_info()[1])
|
|
26 extra_msg += ' "'+(e if len(e)<32 else e[0:32]+'...')+'"'
|
|
27 # after call
|
|
28 outarg_types = '('+','.join(map(lambda x: type(x).__name__, args))+')'
|
|
29 outargs = ','.join(map(str, args))
|
|
30 print('%8s %20s %16s %-20s %11s \033[33m%-16s\033[0m -> \033[32m%16.16s\033[0m %-16s %12s \033[32m%-16s\033[0m # %s' % (dcsig, c_rtype, c_fsym, c_paramlist, inarg_types, inargs, str(r), '('+rt+')', outarg_types, outargs, extra_msg))
|
29
|
31
|
|
32
|
|
33
|
|
34 # some libc tests ------------------
|
|
35
|
|
36 try:
|
|
37 if sys.platform == "win32":
|
|
38 libc = pydc.load("msvcrt")
|
|
39 elif sys.platform == "darwin":
|
|
40 libc = pydc.load("/usr/lib/libc.dylib")
|
|
41 elif "bsd" in sys.platform:
|
|
42 libc = pydc.load("/usr/lib/libc.so")
|
|
43 #libc = pydc.load("/lib/libc.so.7")
|
|
44 elif platform.architecture()[0] == "64bit":
|
|
45 libc = pydc.load("/lib64/libc.so.6")
|
|
46 else:
|
|
47 libc = pydc.load("/lib/libc.so.6")
|
|
48
|
|
49 theader('CLIB TESTS:')
|
|
50
|
|
51 # void()
|
|
52 t(libc, ")v", "void", "sranddev", "(void)", '')
|
|
53
|
|
54 # int()
|
|
55 t(libc, ")i", "int", "rand", "(void)", '')
|
|
56
|
|
57 # void(unsigned int)
|
|
58 t(libc, "I)v", "void", "srand", "(int)", '', 123)
|
|
59
|
|
60 # int() (and one different helper call for test)
|
|
61 t(libc, ")i", "int", "rand", "(void)", 'with seed <------,')
|
|
62 t(libc, "I)v", "void", "srand", "(int)", 'set same seed |', 123)
|
|
63 t(libc, ")i", "int", "rand", "(void)", 'should be same result...')
|
|
64 t(libc, ")i", "int", "rand", "(void)", '...and now different result')
|
|
65
|
|
66 # int(int)
|
|
67 t(libc, "i)i", "int", "abs", "(int)", ' 10 => 10', 10)
|
|
68 t(libc, "i)i", "int", "abs", "(int)", ' 0 => 0', 0)
|
|
69 t(libc, "i)i", "int", "abs", "(int)", ' -9209 => 9209', -9209)
|
|
70
|
|
71 # long(long)
|
|
72 t(libc, "j)j", "long", "labs", "(long)", ' 48 => 48', 48)
|
|
73 t(libc, "j)j", "long", "labs", "(long)", ' 0 => 0', 0)
|
|
74 t(libc, "j)j", "long", "labs", "(long)", '-4271477497 => 4271477497', -4271477497)
|
|
75
|
|
76 # long long(long long)
|
|
77 t(libc, "l)l", "long long", "labs", "(long long)", ' 6334810198 => 6334810198', 6334810198)
|
|
78 t(libc, "l)l", "long long", "labs", "(long long)", ' 1 => 1', 1)
|
|
79 t(libc, "l)l", "long long", "labs", "(long long)", ' 0 => 0', 0)
|
|
80 t(libc, "l)l", "long long", "labs", "(long long)", ' -1 => 1', -1)
|
|
81 t(libc, "l)l", "long long", "labs", "(long long)", '-7358758407 => 7358758407', -7358758407)
|
|
82
|
|
83 pydc.free(libc)
|
|
84 except:
|
|
85 print("skipping clib tests because: "+str(sys.exc_info()[1]))
|
|
86
|
|
87
|
|
88 # tests with own .so for testing all conversions ------------------
|
|
89
|
|
90 l = pydc.load(sys.path[0]+"/test.so")
|
|
91
|
34
|
92 # "long" typed test value use for Python 2
|
|
93 long_i = 11234
|
|
94 long_h = 0xdeadc0de
|
|
95 if sys.version_info < (3, 0):
|
|
96 long_i = long(11234)
|
|
97 long_h = long(0xdeadc0de)
|
|
98
|
29
|
99 # test all possible arg types and their conversions to and from python, with
|
|
100 # specific focus/tests in areas where python 2 and 3 differ
|
|
101 theader('ARG & RET TYPE CONVERSION TESTS:')
|
|
102 t(l, "B)B", "int", "i_plus_one", "(int)", ' False => True (using int func in C)', False)
|
34
|
103
|
29
|
104 t(l, "c)c", "char", "c_plus_one", "(char)", ' "a" (97) => 98', 'a')
|
|
105 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' "a" (97) => 98', 'a')
|
|
106 t(l, "c)c", "char", "c_plus_one", "(char)", ' -2 => -1', -2)
|
|
107 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' 10 => 11', 10)
|
34
|
108
|
29
|
109 t(l, "s)s", "short", "s_plus_one", "(short)", ' 10 => 11', 10)
|
|
110 t(l, "S)S", "unsigned short", "us_plus_one", "(unsigned short)", ' 10 => 11', 10)
|
34
|
111
|
29
|
112 t(l, "i)i", "int", "i_plus_one", "(int)", ' 10 => 11', 10)
|
|
113 t(l, "I)I", "unsigned int", "ui_plus_one", "(unsigned int)", ' 10 => 11', 10)
|
34
|
114
|
29
|
115 t(l, "j)j", "long", "l_plus_one", "(long)", ' 10 => 11', 10)
|
|
116 t(l, "J)J", "unsigned long", "ul_plus_one", "(unsigned long)", ' 10 => 11', 10)
|
34
|
117
|
29
|
118 t(l, "l)l", "long long", "ll_plus_one", "(long long)", ' 10 => 11', 10)
|
|
119 t(l, "L)L", "unsigned long long", "ull_plus_one", "(unsigned long long)", ' 10 => 11', 10)
|
34
|
120 t(l, "l)l", "long long", "ll_plus_one", "(long long)", ' 11234 => 11235', long_i)
|
|
121 t(l, "L)L", "unsigned long long", "ull_plus_one", "(unsigned long long)", ' 11234 => 11235', long_i)
|
|
122
|
29
|
123 t(l, "f)f", "float", "f_plus_one", "(float)", ' -1.23 => -0.23', -1.23)
|
|
124 t(l, "d)d", "double", "d_plus_one", "(double)", ' 5.67 => 6.67', 5.67)
|
34
|
125
|
|
126 t(l, "Z)Z", "const char*", "ccp_plus_one", "(const char*)", '"lose char" => "ose char"', 'lose char') # string object
|
|
127 t(l, "Z)Z", "const char*", "ccp_plus_one", "(const char*)", '"X_unicode" => "_unicode"', u'X_unicode') # string object (unicode in Python 2)
|
|
128 t(l, "Z)Z", "const char*", "ccp_plus_one", "(const char*)", '"1lessbyte" => "lessbyte"', b'1lessbyte') # bytes object
|
|
129 t(l, "Z)Z", "const char*", "ccp_plus_one", "(const char*)", ' "xY" => "Y"', bytearray(b'xY')) # bytearray object
|
|
130
|
|
131 t(l, "p)Z", "const char*", "ccp_plus_one", "(const char*)", ' "xY" => "Y"', bytearray(b'xY')) # bytearray object
|
|
132 t(l, "p)p", "const char*", "ccp_plus_one", "(const char*)", ' "xY" => p+1 (~ odd addr)', bytearray(b'xY')) # bytearray object
|
|
133 t(l, "p)p", "const char*", "ccp_plus_one", "(const char*)", ' 0xdeadc0de => 0xdeadc0de+1=3735929055', long_h) # handle (integer interpreted as ptr)
|
|
134 t(l, "p)p", "const char*", "ccp_plus_one", "(const char*)", ' 0xdeadc0de => 0xdeadc0de+1=3735929055', long_h) # handle (integer interpreted as ptr, long in Python 2)
|
|
135
|
|
136 # functions that change buffers
|
|
137 theader('TESTS OF IMMUTABLE AND MUTABLE PYTHON BUFFERS:')
|
|
138 t(l, "Z)v", "const char*", "cp_head_incr", "(const char*)", ' "string" => None / arg => "string" (not modified)"', 'string') # string object
|
|
139 t(l, "Z)v", "const char*", "cp_head_incr", "(const char*)", ' "UnIcOdE" => None / arg => "UnIcOdE" (not modified)"', u'UnIcOdE') # string object (unicode in Python 2)
|
|
140 t(l, "Z)v", "const char*", "cp_head_incr", "(const char*)", ' "BCssk#" => None / arg => "BCssk#" (not modified)"', b'BCssk#') # bytes object
|
|
141 t(l, "Z)v", "const char*", "cp_head_incr", "(const char*)", ' "xY" => None / arg => "xY" (not modified)"', bytearray(b'xY')) # bytearray object
|
|
142 t(l, "p)v", "const char*", "cp_head_incr", "(const char*)", ' "xY" => None / arg => "yY" (!MODIFIED!)"', bytearray(b'xY')) # bytearray object
|
29
|
143
|
|
144 # tested checked value conversions
|
|
145 theader('ARG & RET TYPE CONVERSION TESTS FOR RANGE CHECKED TYPES:')
|
|
146 t(l, "c)c", "char", "c_plus_one", "(char)", ' "~" => 127', '~')
|
|
147 t(l, "c)c", "char", "c_plus_one", "(char)", ' "~" => 127', '~')
|
|
148 t(l, "c)c", "char", "c_plus_one", "(char)", ' "" => input exc:', '')
|
|
149 t(l, "c)c", "char", "c_plus_one", "(char)", ' "" => input exc:', '')
|
|
150 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' "ab" => input exc:', 'ab')
|
|
151 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' "ab" => input exc:', 'ab')
|
|
152
|
|
153 t(l, "c)c", "char", "c_plus_one", "(char)", ' -128 => -127', -128)
|
|
154 t(l, "c)c", "char", "c_plus_one", "(char)", ' 127 => -128 (wrapped)', 127)
|
|
155 t(l, "c)c", "char", "c_plus_one", "(char)", ' -129 => input exc:', -129)
|
|
156 t(l, "c)c", "char", "c_plus_one", "(char)", ' 128 => input exc:', 128)
|
|
157
|
|
158 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' 0 => 1', 0)
|
|
159 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' 255 => 0 (wrapped)', 255)
|
|
160 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' -1 => input exc:', -1)
|
|
161 t(l, "C)C", "unsigned char", "uc_plus_one", "(unsigned char)", ' 256 => input exc:', 256)
|
|
162
|
|
163 t(l, "s)s", "short", "s_plus_one", "(short)", ' -32768 => -32767', -32768)
|
|
164 t(l, "s)s", "short", "s_plus_one", "(short)", ' 32767 => -32768 (wrapped)', 32767)
|
|
165 t(l, "s)s", "short", "s_plus_one", "(short)", ' -32769 => input exc:', -32769)
|
|
166 t(l, "s)s", "short", "s_plus_one", "(short)", ' 32768 => input exc:', 32768)
|
|
167
|
|
168 t(l, "S)S", "unsigned short", "us_plus_one", "(unsigned short)", ' 0 => 1', 0)
|
|
169 t(l, "S)S", "unsigned short", "us_plus_one", "(unsigned short)", ' 65535 => 0 (wrapped)', 65535)
|
|
170 t(l, "S)S", "unsigned short", "us_plus_one", "(unsigned short)", ' -1 => input exc:', -1)
|
|
171 t(l, "S)S", "unsigned short", "us_plus_one", "(unsigned short)", ' 65536 => input exc:', 65536)
|
|
172
|
34
|
173 t(l, "p)Z", "const char*", "ccp_plus_one", "(const char*)", '"w/pointer" => input exc:', 'w/pointer') # string object, not passable as 'p'ointer
|
|
174 t(l, "p)Z", "const char*", "ccp_plus_one", "(const char*)", '"X_unicode" => input exc:',u'X_unicode') # string object (unicode in Python 2), not passable as 'p'ointer
|
|
175 t(l, "p)Z", "const char*", "ccp_plus_one", "(const char*)", '"1less/ptr" => input exc:',b'1less/ptr') # bytes object, not passable as 'p'ointer
|
|
176 t(l, "p)p", "const char*", "ccp_plus_one", "(const char*)", ' "x" => input exc:', 'x') # string object, not passable as 'p'ointer
|
29
|
177
|