|
1 | 1 | package vm
|
2 | 2 |
|
3 |
| -import ( |
4 |
| - "fmt" |
5 |
| - "io/ioutil" |
6 |
| - "log" |
7 |
| - "math/big" |
8 |
| - "os" |
9 |
| - |
10 |
| - "github.com/ethereum/go-ethereum/crypto" |
11 |
| - "github.com/ethereum/go-ethereum/ethutil" |
12 |
| - "github.com/ethereum/go-ethereum/logger" |
13 |
| - "github.com/ethereum/go-ethereum/state" |
14 |
| - "github.com/ethereum/go-ethereum/trie" |
15 |
| - checker "gopkg.in/check.v1" |
16 |
| -) |
17 |
| - |
18 |
| -type VmSuite struct{} |
19 |
| - |
20 |
| -var _ = checker.Suite(&VmSuite{}) |
21 |
| -var big9 = ethutil.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000009") |
22 |
| - |
23 |
| -const mutcode = ` |
24 |
| -var x = 0; |
25 |
| -for i := 0; i < 10; i++ { |
26 |
| - x = i |
27 |
| -} |
28 |
| -
|
29 |
| -return x` |
30 |
| - |
31 |
| -type TestEnv struct{} |
32 |
| - |
33 |
| -func (TestEnv) Origin() []byte { return nil } |
34 |
| -func (TestEnv) BlockNumber() *big.Int { return nil } |
35 |
| -func (TestEnv) BlockHash() []byte { return nil } |
36 |
| -func (TestEnv) PrevHash() []byte { return nil } |
37 |
| -func (TestEnv) Coinbase() []byte { return nil } |
38 |
| -func (TestEnv) Time() int64 { return 0 } |
39 |
| -func (TestEnv) GasLimit() *big.Int { return nil } |
40 |
| -func (TestEnv) Difficulty() *big.Int { return nil } |
41 |
| -func (TestEnv) Value() *big.Int { return nil } |
42 |
| -func (TestEnv) AddLog(*state.Log) {} |
43 |
| -func (TestEnv) Transfer(from, to Account, amount *big.Int) error { |
44 |
| - return nil |
45 |
| -} |
46 |
| - |
47 |
| -// This is likely to fail if anything ever gets looked up in the state trie :-) |
48 |
| -func (TestEnv) State() *state.State { |
49 |
| - return state.New(trie.New(nil, "")) |
50 |
| -} |
51 |
| - |
52 |
| -func setup(level logger.LogLevel, typ Type) (*Closure, VirtualMachine) { |
53 |
| - code, err := ethutil.Compile(mutcode, true) |
54 |
| - if err != nil { |
55 |
| - log.Fatal(err) |
56 |
| - } |
57 |
| - |
58 |
| - // Pipe output to /dev/null |
59 |
| - logger.AddLogSystem(logger.NewStdLogSystem(ioutil.Discard, log.LstdFlags, level)) |
60 |
| - |
61 |
| - ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") |
62 |
| - |
63 |
| - stateObject := state.NewStateObject([]byte{'j', 'e', 'f', 'f'}) |
64 |
| - callerClosure := NewClosure(nil, stateObject, stateObject, code, big.NewInt(1000000), big.NewInt(0)) |
65 |
| - |
66 |
| - return callerClosure, New(TestEnv{}, typ) |
67 |
| -} |
68 |
| - |
69 |
| -func (s *VmSuite) TestDebugVm(c *checker.C) { |
70 |
| - closure, vm := setup(logger.DebugLevel, DebugVmTy) |
71 |
| - ret, _, e := closure.Call(vm, nil) |
72 |
| - c.Assert(e, checker.NotNil) |
73 |
| - c.Skip("Depends on mutan. Requires serpent implementation") |
74 |
| - c.Assert(ret, checker.DeepEquals, big9) |
75 |
| -} |
76 |
| - |
77 |
| -func (s *VmSuite) TestVm(c *checker.C) { |
78 |
| - closure, vm := setup(logger.DebugLevel, StandardVmTy) |
79 |
| - ret, _, e := closure.Call(vm, nil) |
80 |
| - c.Assert(e, checker.NotNil) |
81 |
| - c.Skip("Depends on mutan. Requires serpent implementation") |
82 |
| - c.Assert(ret, checker.DeepEquals, big9) |
83 |
| -} |
84 |
| - |
85 |
| -func (s *VmSuite) BenchmarkDebugVm(c *checker.C) { |
86 |
| - closure, vm := setup(logger.InfoLevel, StandardVmTy) |
87 |
| - |
88 |
| - c.ResetTimer() |
89 |
| - |
90 |
| - for i := 0; i < c.N; i++ { |
91 |
| - closure.Call(vm, nil) |
92 |
| - } |
93 |
| -} |
94 |
| - |
95 |
| -func (s *VmSuite) BenchmarkVm(c *checker.C) { |
96 |
| - closure, vm := setup(logger.InfoLevel, DebugVmTy) |
97 |
| - |
98 |
| - c.ResetTimer() |
99 |
| - |
100 |
| - for i := 0; i < c.N; i++ { |
101 |
| - closure.Call(vm, nil) |
102 |
| - } |
103 |
| -} |
104 |
| - |
105 |
| -func RunCode(mutCode string, typ Type) []byte { |
106 |
| - code, err := ethutil.Compile(mutCode, true) |
107 |
| - if err != nil { |
108 |
| - log.Fatal(err) |
109 |
| - } |
110 |
| - |
111 |
| - logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel)) |
112 |
| - |
113 |
| - ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") |
114 |
| - |
115 |
| - stateObject := state.NewStateObject([]byte{'j', 'e', 'f', 'f'}) |
116 |
| - closure := NewClosure(nil, stateObject, stateObject, code, big.NewInt(1000000), big.NewInt(0)) |
117 |
| - |
118 |
| - vm := New(TestEnv{}, typ) |
119 |
| - ret, _, e := closure.Call(vm, nil) |
120 |
| - if e != nil { |
121 |
| - fmt.Println(e) |
122 |
| - } |
123 |
| - |
124 |
| - return ret |
125 |
| -} |
126 |
| - |
127 |
| -func (s *VmSuite) TestBuildInSha256(c *checker.C) { |
128 |
| - ret := RunCode(` |
129 |
| - var in = 42 |
130 |
| - var out = 0 |
131 |
| -
|
132 |
| - call(0x2, 0, 10000, in, out) |
133 |
| -
|
134 |
| - return out |
135 |
| - `, DebugVmTy) |
136 |
| - |
137 |
| - exp := crypto.Sha256(ethutil.LeftPadBytes([]byte{42}, 32)) |
138 |
| - c.Skip("Depends on mutan. Requires serpent implementation") |
139 |
| - c.Assert(ret, checker.DeepEquals, exp) |
140 |
| -} |
141 |
| - |
142 |
| -func (s *VmSuite) TestBuildInRipemd(c *checker.C) { |
143 |
| - ret := RunCode(` |
144 |
| - var in = 42 |
145 |
| - var out = 0 |
146 |
| -
|
147 |
| - call(0x3, 0, 10000, in, out) |
148 |
| -
|
149 |
| - return out |
150 |
| - `, DebugVmTy) |
151 |
| - |
152 |
| - exp := ethutil.RightPadBytes(crypto.Ripemd160(ethutil.LeftPadBytes([]byte{42}, 32)), 32) |
153 |
| - c.Skip("Depends on mutan. Requires serpent implementation") |
154 |
| - c.Assert(ret, checker.DeepEquals, exp) |
155 |
| -} |
156 |
| - |
157 |
| -func (s *VmSuite) TestOog(c *checker.C) { |
158 |
| - // This tests takes a long time and will eventually run out of gas |
159 |
| - // t.Skip() |
160 |
| - c.Skip("This tests takes a long time and will eventually run out of gas") |
161 |
| - |
162 |
| - logger.AddLogSystem(logger.NewStdLogSystem(os.Stdout, log.LstdFlags, logger.InfoLevel)) |
163 |
| - |
164 |
| - ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") |
165 |
| - |
166 |
| - stateObject := state.NewStateObject([]byte{'j', 'e', 'f', 'f'}) |
167 |
| - closure := NewClosure(nil, stateObject, stateObject, ethutil.Hex2Bytes("60ff60ff600057"), big.NewInt(1000000), big.NewInt(0)) |
168 |
| - |
169 |
| - vm := New(TestEnv{}, DebugVmTy) |
170 |
| - _, _, e := closure.Call(vm, nil) |
171 |
| - if e != nil { |
172 |
| - fmt.Println(e) |
173 |
| - } |
174 |
| -} |
| 3 | +// Tests have been removed in favour of general tests. If anything implementation specific needs testing, put it here |
0 commit comments