forked from AugurProject/augur-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_load_contracts.py
executable file
·143 lines (122 loc) · 3.89 KB
/
test_load_contracts.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python
import time
import os
import json
import sha3
import signal
import test_node
import subprocess
from pyrpctools import RPC_Client, MAXGAS
from colorama import Style, Fore, init; init()
test_code = {'foobar':{'sqrt.se':'''\
def sqrt(x):
with guess = ONE:
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
return(avg(guess, fdiv(x, guess)))
inset('math_macros.sm')
''',
'foo.se':'''\
import sqrt as SQRT
def bar(x):
s = SQRT.sqrt(x)
return(fdiv(2*s, s - ONE))
inset('math_macros.sm')
''',
'math_macros.sm':'''\
macro ONE: 0x10000000000000000
macro fdiv($a, $b):
$a*ONE/$b
macro avg($a, $b):
($a + $b)/2
'''}}
ONE = 0x10000000000000000
def fdiv(a, b):
return a*ONE/b
def avg(a, b):
return (a + b)/2
def sqrt(x):
guess = ONE
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
guess = avg(guess, fdiv(x, guess))
return(avg(guess, fdiv(x, guess)))
def bar(x):
s = sqrt(x)
return(fdiv(2*s, s - ONE))
def make_tree(file_tree):
top_dir = os.getcwd() # get the current working directory
for name, data in file_tree.items():
if type(data) == dict: # make a folder, and write its contents to disk
os.mkdir(name)
os.chdir(name)
make_tree(data)
os.chdir(top_dir)
elif type(data) in (str, unicode): #write the text to a file
with open(name, 'w') as datafile:
datafile.write(data)
def rm_tree(file_tree):
top_dir = os.getcwd()
for name, data in file_tree.items():
if type(data) == dict:
os.chdir(name)
rm_tree(data)
os.chdir(top_dir)
os.rmdir(name)
elif type(data) in (str, unicode):
os.remove(name)
def start_test_node():
test_node.LOG = open("test_load_contracts_node.log", 'w')
test_node.setup_environment()
test_node.make_address()
return test_node.start_node()
def test_compile_imports():
make_tree(test_code)
node = start_test_node()
rpc = RPC_Client((test_node.HOST, test_node.PORT), 0)
coinbase = rpc.eth_coinbase()['result']
gas_price = int(rpc.eth_gasPrice()['result'], 16)
balance = 0
while balance/gas_price < int(MAXGAS, 16):
balance = int(rpc.eth_getBalance(coinbase)['result'], 16)
time.sleep(1)
subprocess.check_call(['python',
'load_contracts.py',
'-p', '9696',
'-b', '2',
'-d', 'test_load_contracts.json',
'-s', 'foobar'])
db = json.load(open("test_load_contracts.json"))
func1 = db['foo']['fullsig'][0]['name']
prefix = sha3.sha3_256(func1.encode('ascii')).hexdigest()[:8]
arg = hex(1 << 65)[2:].strip('L').rjust(64, '0')
r1 = rpc.eth_call(sender=coinbase,
to=db['foo']['address'],
data=('0x' + prefix + arg),
gas=hex(3*10**6))['result']
r1 = int(r1, 16)
if r1 > 2**255:
r1 -= 2**256
r2 = bar(1 << 65)
if r1 == r2:
print 'TEST PASSED'
else:
print 'TEST FAILED: <r1 {}> <r2 {}>'.format(r1, r2)
rm_tree(test_code)
node.send_signal(signal.SIGINT)
node.wait()
if __name__ == '__main__':
test_compile_imports()