Added state tests

This commit is contained in:
obscuren
2014-12-02 00:03:53 +01:00
parent a052357872
commit 2df8ad6307
4 changed files with 86 additions and 7 deletions

View File

@ -2,6 +2,8 @@ package vm
import (
"bytes"
"math/big"
"strconv"
"testing"
"github.com/ethereum/go-ethereum/ethutil"
@ -29,10 +31,21 @@ func StateObjectFromAccount(addr string, account Account) *state.StateObject {
return obj
}
type Env struct {
CurrentCoinbase string
CurrentDifficulty string
CurrentGasLimit string
CurrentNumber string
CurrentTimestamp interface{}
PreviousHash string
}
type VmTest struct {
Callcreates interface{}
Env map[string]string
//Env map[string]string
Env Env
Exec map[string]string
Transaction map[string]string
Gas string
Out string
Post map[string]Account
@ -50,7 +63,31 @@ func RunVmTest(p string, t *testing.T) {
state.SetStateObject(obj)
}
ret, gas, err := helper.RunVm(state, test.Env, test.Exec)
// XXX Yeah, yeah...
env := make(map[string]string)
env["currentCoinbase"] = test.Env.CurrentCoinbase
env["currentDifficulty"] = test.Env.CurrentDifficulty
env["currentGasLimit"] = test.Env.CurrentGasLimit
env["currentNumber"] = test.Env.CurrentNumber
env["previousHash"] = test.Env.PreviousHash
if n, ok := test.Env.CurrentTimestamp.(float64); ok {
env["currentTimestamp"] = strconv.Itoa(int(n))
} else {
env["currentTimestamp"] = test.Env.CurrentTimestamp.(string)
}
var (
ret []byte
gas *big.Int
err error
)
if len(test.Exec) > 0 {
ret, gas, err = helper.RunVm(state, env, test.Exec)
} else {
ret, gas, err = helper.RunState(state, env, test.Transaction)
}
// When an error is returned it doesn't always mean the tests fails.
// Have to come up with some conditional failing mechanism.
if err != nil {
@ -62,9 +99,11 @@ func RunVmTest(p string, t *testing.T) {
t.Errorf("%s's return failed. Expected %x, got %x\n", name, rexp, ret)
}
gexp := ethutil.Big(test.Gas)
if gexp.Cmp(gas) != 0 {
t.Errorf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas)
if len(test.Gas) > 0 {
gexp := ethutil.Big(test.Gas)
if gexp.Cmp(gas) != 0 {
t.Errorf("%s's gas failed. Expected %v, got %v\n", name, gexp, gas)
}
}
for addr, account := range test.Post {
@ -123,3 +162,23 @@ func TestVm(t *testing.T) {
const fn = "../files/vmtests/vmtests.json"
RunVmTest(fn, t)
}
func TestStateSystemOperations(t *testing.T) {
const fn = "../files/StateTests/stSystemOperationsTest.json"
RunVmTest(fn, t)
}
func TestStatePreCompiledContracts(t *testing.T) {
const fn = "../files/StateTests/stPreCompiledContracts.json"
RunVmTest(fn, t)
}
func TestStateRecursiveCreate(t *testing.T) {
const fn = "../files/StateTests/stRecursiveCreate.json"
RunVmTest(fn, t)
}
func TestStateSpecialTest(t *testing.T) {
const fn = "../files/StateTests/stSpecialTest.json"
RunVmTest(fn, t)
}