From 266d21209478bdb8c89e1ffb95d7f0de34635968 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 15 Oct 2014 00:41:00 +0200 Subject: Working on test suite --- tests/helper/common.go | 11 +++++++++ tests/helper/http.go | 24 ++++++++++++++++++ tests/helper/init.go | 15 ++++++++++++ tests/helper/trie.go | 31 ++++++++++++++++++++++++ tests/helper/vm.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 tests/helper/common.go create mode 100644 tests/helper/http.go create mode 100644 tests/helper/init.go create mode 100644 tests/helper/trie.go create mode 100644 tests/helper/vm.go (limited to 'tests/helper') diff --git a/tests/helper/common.go b/tests/helper/common.go new file mode 100644 index 000000000..3d539ebb0 --- /dev/null +++ b/tests/helper/common.go @@ -0,0 +1,11 @@ +package helper + +import "github.com/ethereum/eth-go/ethutil" + +func FromHex(h string) []byte { + if ethutil.IsHex(h) { + h = h[2:] + } + + return ethutil.Hex2Bytes(h) +} diff --git a/tests/helper/http.go b/tests/helper/http.go new file mode 100644 index 000000000..b379695d0 --- /dev/null +++ b/tests/helper/http.go @@ -0,0 +1,24 @@ +package helper + +import ( + "encoding/json" + "io/ioutil" + "net/http" +) + +func CreateTests(uri string, value interface{}) error { + resp, err := http.Get(uri) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + data, err := ioutil.ReadAll(resp.Body) + + err = json.Unmarshal(data, &value) + if err != nil { + return err + } + + return nil +} diff --git a/tests/helper/init.go b/tests/helper/init.go new file mode 100644 index 000000000..1f2ee208a --- /dev/null +++ b/tests/helper/init.go @@ -0,0 +1,15 @@ +package helper + +import ( + "log" + "os" + + "github.com/ethereum/eth-go/ethlog" + "github.com/ethereum/eth-go/ethutil" +) + +func init() { + ethlog.AddLogSystem(ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(4))) + + ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") +} diff --git a/tests/helper/trie.go b/tests/helper/trie.go new file mode 100644 index 000000000..af828685c --- /dev/null +++ b/tests/helper/trie.go @@ -0,0 +1,31 @@ +package helper + +import "github.com/ethereum/eth-go/ethtrie" + +type MemDatabase struct { + db map[string][]byte +} + +func NewMemDatabase() (*MemDatabase, error) { + db := &MemDatabase{db: make(map[string][]byte)} + return db, nil +} +func (db *MemDatabase) Put(key []byte, value []byte) { + db.db[string(key)] = value +} +func (db *MemDatabase) Get(key []byte) ([]byte, error) { + return db.db[string(key)], nil +} +func (db *MemDatabase) Delete(key []byte) error { + delete(db.db, string(key)) + return nil +} +func (db *MemDatabase) Print() {} +func (db *MemDatabase) Close() {} +func (db *MemDatabase) LastKnownTD() []byte { return nil } + +func NewTrie() *ethtrie.Trie { + db, _ := NewMemDatabase() + + return ethtrie.New(db, "") +} diff --git a/tests/helper/vm.go b/tests/helper/vm.go new file mode 100644 index 000000000..49a0bfeae --- /dev/null +++ b/tests/helper/vm.go @@ -0,0 +1,66 @@ +package helper + +import ( + "fmt" + "math/big" + + "github.com/ethereum/eth-go/ethstate" + "github.com/ethereum/eth-go/ethtrie" + "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/eth-go/ethvm" +) + +type Env struct { + state *ethstate.State + + origin []byte + parent []byte + coinbase []byte + + number *big.Int + time int64 + difficulty *big.Int +} + +func NewEnv(state *ethstate.State) *Env { + return &Env{ + state: state, + } +} + +func NewEnvFromMap(state *ethstate.State, envValues map[string]string, exeValues map[string]string) *Env { + env := NewEnv(state) + + env.origin = ethutil.Hex2Bytes(exeValues["caller"]) + env.parent = ethutil.Hex2Bytes(envValues["previousHash"]) + env.coinbase = ethutil.Hex2Bytes(envValues["currentCoinbase"]) + env.number = ethutil.Big(envValues["currentNumber"]) + env.time = ethutil.Big(envValues["currentTime"]).Int64() + + return env +} + +func (self *Env) Origin() []byte { return self.origin } +func (self *Env) BlockNumber() *big.Int { return self.number } +func (self *Env) PrevHash() []byte { return self.parent } +func (self *Env) Coinbase() []byte { return self.coinbase } +func (self *Env) Time() int64 { return self.time } +func (self *Env) Difficulty() *big.Int { return self.difficulty } +func (self *Env) BlockHash() []byte { return nil } + +// This is likely to fail if anything ever gets looked up in the state trie :-) +func (self *Env) State() *ethstate.State { return ethstate.New(ethtrie.New(nil, "")) } + +func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int) { + caller := state.NewStateObject(ethutil.Hex2Bytes(exec["caller"])) + callee := state.GetStateObject(ethutil.Hex2Bytes(exec["address"])) + closure := ethvm.NewClosure(nil, caller, callee, callee.Code, ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"])) + + vm := ethvm.New(NewEnvFromMap(state, env, exec), ethvm.DebugVmTy) + ret, _, e := closure.Call(vm, nil) + if e != nil { + fmt.Println(e) + } + + return ret, closure.Gas +} -- cgit v1.2.3 From 311c6f8a3fed5ac03ee4b442fd0f420072bc41b4 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 15 Oct 2014 17:12:26 +0200 Subject: Fixed remote Arithmetic tests --- tests/helper/http.go | 11 ++++++----- tests/helper/init.go | 5 ++++- tests/helper/vm.go | 8 ++------ 3 files changed, 12 insertions(+), 12 deletions(-) (limited to 'tests/helper') diff --git a/tests/helper/http.go b/tests/helper/http.go index b379695d0..3c570d106 100644 --- a/tests/helper/http.go +++ b/tests/helper/http.go @@ -4,12 +4,15 @@ import ( "encoding/json" "io/ioutil" "net/http" + "testing" ) -func CreateTests(uri string, value interface{}) error { +func CreateTests(t *testing.T, uri string, value interface{}) { resp, err := http.Get(uri) if err != nil { - panic(err) + t.Error(err) + + return } defer resp.Body.Close() @@ -17,8 +20,6 @@ func CreateTests(uri string, value interface{}) error { err = json.Unmarshal(data, &value) if err != nil { - return err + t.Error(err) } - - return nil } diff --git a/tests/helper/init.go b/tests/helper/init.go index 1f2ee208a..5f95dfc2f 100644 --- a/tests/helper/init.go +++ b/tests/helper/init.go @@ -8,8 +8,11 @@ import ( "github.com/ethereum/eth-go/ethutil" ) +var Logger ethlog.LogSystem + func init() { - ethlog.AddLogSystem(ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(4))) + Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(4)) + ethlog.AddLogSystem(Logger) ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") } diff --git a/tests/helper/vm.go b/tests/helper/vm.go index 49a0bfeae..44eb8fda1 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -1,7 +1,6 @@ package helper import ( - "fmt" "math/big" "github.com/ethereum/eth-go/ethstate" @@ -51,16 +50,13 @@ func (self *Env) BlockHash() []byte { return nil } // This is likely to fail if anything ever gets looked up in the state trie :-) func (self *Env) State() *ethstate.State { return ethstate.New(ethtrie.New(nil, "")) } -func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int) { +func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int, error) { caller := state.NewStateObject(ethutil.Hex2Bytes(exec["caller"])) callee := state.GetStateObject(ethutil.Hex2Bytes(exec["address"])) closure := ethvm.NewClosure(nil, caller, callee, callee.Code, ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"])) vm := ethvm.New(NewEnvFromMap(state, env, exec), ethvm.DebugVmTy) ret, _, e := closure.Call(vm, nil) - if e != nil { - fmt.Println(e) - } - return ret, closure.Gas + return ret, closure.Gas, e } -- cgit v1.2.3 From 65cdb3436e599cfff0fd91045d4c81c26a5f61c1 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 16 Oct 2014 13:40:46 +0200 Subject: Updated tests --- tests/helper/vm.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index 44eb8fda1..4a0d2f8b1 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -4,7 +4,6 @@ import ( "math/big" "github.com/ethereum/eth-go/ethstate" - "github.com/ethereum/eth-go/ethtrie" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethvm" ) @@ -39,19 +38,17 @@ func NewEnvFromMap(state *ethstate.State, envValues map[string]string, exeValues return env } -func (self *Env) Origin() []byte { return self.origin } -func (self *Env) BlockNumber() *big.Int { return self.number } -func (self *Env) PrevHash() []byte { return self.parent } -func (self *Env) Coinbase() []byte { return self.coinbase } -func (self *Env) Time() int64 { return self.time } -func (self *Env) Difficulty() *big.Int { return self.difficulty } -func (self *Env) BlockHash() []byte { return nil } - -// This is likely to fail if anything ever gets looked up in the state trie :-) -func (self *Env) State() *ethstate.State { return ethstate.New(ethtrie.New(nil, "")) } +func (self *Env) Origin() []byte { return self.origin } +func (self *Env) BlockNumber() *big.Int { return self.number } +func (self *Env) PrevHash() []byte { return self.parent } +func (self *Env) Coinbase() []byte { return self.coinbase } +func (self *Env) Time() int64 { return self.time } +func (self *Env) Difficulty() *big.Int { return self.difficulty } +func (self *Env) BlockHash() []byte { return nil } +func (self *Env) State() *ethstate.State { return self.state } func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int, error) { - caller := state.NewStateObject(ethutil.Hex2Bytes(exec["caller"])) + caller := state.GetOrNewStateObject(ethutil.Hex2Bytes(exec["caller"])) callee := state.GetStateObject(ethutil.Hex2Bytes(exec["address"])) closure := ethvm.NewClosure(nil, caller, callee, callee.Code, ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"])) -- cgit v1.2.3 From 93fcabd25189b447cc5c52523134cca2fa1d794e Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 16 Oct 2014 18:27:05 +0200 Subject: Fixed most of the tests --- tests/helper/init.go | 3 ++- tests/helper/vm.go | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'tests/helper') diff --git a/tests/helper/init.go b/tests/helper/init.go index 5f95dfc2f..7c34913fc 100644 --- a/tests/helper/init.go +++ b/tests/helper/init.go @@ -9,9 +9,10 @@ import ( ) var Logger ethlog.LogSystem +var Log = ethlog.NewLogger("TEST") func init() { - Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(4)) + Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(0)) ethlog.AddLogSystem(Logger) ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") diff --git a/tests/helper/vm.go b/tests/helper/vm.go index 4a0d2f8b1..da06b2cc2 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -18,6 +18,7 @@ type Env struct { number *big.Int time int64 difficulty *big.Int + gasLimit *big.Int } func NewEnv(state *ethstate.State) *Env { @@ -33,7 +34,9 @@ func NewEnvFromMap(state *ethstate.State, envValues map[string]string, exeValues env.parent = ethutil.Hex2Bytes(envValues["previousHash"]) env.coinbase = ethutil.Hex2Bytes(envValues["currentCoinbase"]) env.number = ethutil.Big(envValues["currentNumber"]) - env.time = ethutil.Big(envValues["currentTime"]).Int64() + env.time = ethutil.Big(envValues["currentTimestamp"]).Int64() + env.difficulty = ethutil.Big(envValues["currentDifficulty"]) + env.gasLimit = ethutil.Big(envValues["currentGasLimit"]) return env } @@ -46,14 +49,17 @@ func (self *Env) Time() int64 { return self.time } func (self *Env) Difficulty() *big.Int { return self.difficulty } func (self *Env) BlockHash() []byte { return nil } func (self *Env) State() *ethstate.State { return self.state } +func (self *Env) GasLimit() *big.Int { return self.gasLimit } func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int, error) { - caller := state.GetOrNewStateObject(ethutil.Hex2Bytes(exec["caller"])) - callee := state.GetStateObject(ethutil.Hex2Bytes(exec["address"])) - closure := ethvm.NewClosure(nil, caller, callee, callee.Code, ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"])) + address := FromHex(exec["address"]) + caller := state.GetOrNewStateObject(FromHex(exec["caller"])) + caller.Balance = ethutil.Big(exec["value"]) vm := ethvm.New(NewEnvFromMap(state, env, exec), ethvm.DebugVmTy) - ret, _, e := closure.Call(vm, nil) - return ret, closure.Gas, e + execution := ethvm.NewExecution(vm, address, FromHex(exec["data"]), ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"]), ethutil.Big(exec["value"])) + ret, err := execution.Exec(address, caller) + + return ret, execution.Gas, err } -- cgit v1.2.3 From d7736a7bbbf3d832dd108253fa5dea1de2cb9363 Mon Sep 17 00:00:00 2001 From: obscuren Date: Fri, 17 Oct 2014 17:11:34 +0200 Subject: Quick dirty peer update --- tests/helper/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/helper') diff --git a/tests/helper/init.go b/tests/helper/init.go index 7c34913fc..a84a7749f 100644 --- a/tests/helper/init.go +++ b/tests/helper/init.go @@ -12,7 +12,7 @@ var Logger ethlog.LogSystem var Log = ethlog.NewLogger("TEST") func init() { - Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(0)) + Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(3)) ethlog.AddLogSystem(Logger) ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") -- cgit v1.2.3 From cbd785cfe8801c240bbaaa6f21ebf3ab7045e4a3 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 16 Oct 2014 10:47:12 +0200 Subject: ethvm, tests/*: use log level constants --- tests/helper/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/helper') diff --git a/tests/helper/init.go b/tests/helper/init.go index a84a7749f..3de5c50eb 100644 --- a/tests/helper/init.go +++ b/tests/helper/init.go @@ -12,7 +12,7 @@ var Logger ethlog.LogSystem var Log = ethlog.NewLogger("TEST") func init() { - Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.LogLevel(3)) + Logger = ethlog.NewStdLogSystem(os.Stdout, log.LstdFlags, ethlog.InfoLevel) ethlog.AddLogSystem(Logger) ethutil.ReadConfig(".ethtest", "/tmp/ethtest", "") -- cgit v1.2.3 From 3ea0e904ad4e6473685c319dcf4bcb81b35213db Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 18 Oct 2014 13:33:02 +0200 Subject: Reflect changed to eth/vm --- tests/helper/vm.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index da06b2cc2..a3d54de23 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -5,7 +5,7 @@ import ( "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" - "github.com/ethereum/eth-go/ethvm" + "github.com/ethereum/eth-go/vm" ) type Env struct { @@ -56,9 +56,9 @@ func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int caller := state.GetOrNewStateObject(FromHex(exec["caller"])) caller.Balance = ethutil.Big(exec["value"]) - vm := ethvm.New(NewEnvFromMap(state, env, exec), ethvm.DebugVmTy) + evm := vm.New(NewEnvFromMap(state, env, exec), vm.DebugVmTy) - execution := ethvm.NewExecution(vm, address, FromHex(exec["data"]), ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"]), ethutil.Big(exec["value"])) + execution := vm.NewExecution(evm, address, FromHex(exec["data"]), ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"]), ethutil.Big(exec["value"])) ret, err := execution.Exec(address, caller) return ret, execution.Gas, err -- cgit v1.2.3 From 3bc64b6b6edf380aaa145e612988a4aa640e0d23 Mon Sep 17 00:00:00 2001 From: obscuren Date: Sat, 18 Oct 2014 23:20:25 +0200 Subject: Readers --- tests/helper/http.go | 25 ------------------------- tests/helper/readers.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 25 deletions(-) delete mode 100644 tests/helper/http.go create mode 100644 tests/helper/readers.go (limited to 'tests/helper') diff --git a/tests/helper/http.go b/tests/helper/http.go deleted file mode 100644 index 3c570d106..000000000 --- a/tests/helper/http.go +++ /dev/null @@ -1,25 +0,0 @@ -package helper - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "testing" -) - -func CreateTests(t *testing.T, uri string, value interface{}) { - resp, err := http.Get(uri) - if err != nil { - t.Error(err) - - return - } - defer resp.Body.Close() - - data, err := ioutil.ReadAll(resp.Body) - - err = json.Unmarshal(data, &value) - if err != nil { - t.Error(err) - } -} diff --git a/tests/helper/readers.go b/tests/helper/readers.go new file mode 100644 index 000000000..03313aeda --- /dev/null +++ b/tests/helper/readers.go @@ -0,0 +1,42 @@ +package helper + +import ( + "encoding/json" + "io" + "io/ioutil" + "net/http" + "os" + "testing" +) + +func readJSON(t *testing.T, reader io.Reader, value interface{}) { + data, err := ioutil.ReadAll(reader) + err = json.Unmarshal(data, &value) + if err != nil { + t.Error(err) + } +} + +func CreateHttpTests(t *testing.T, uri string, value interface{}) { + resp, err := http.Get(uri) + if err != nil { + t.Error(err) + + return + } + defer resp.Body.Close() + + readJSON(t, resp.Body, value) +} + +func CreateFileTests(t *testing.T, fn string, value interface{}) { + file, err := os.Open(fn) + if err != nil { + t.Error(err) + + return + } + defer file.Close() + + readJSON(t, file, value) +} -- cgit v1.2.3 From b5beb1aac11af92bfe0f3ed7560b9eb08495ed09 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 22 Oct 2014 15:22:21 +0200 Subject: added a transfer method to vm env --- tests/helper/vm.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index a3d54de23..06c3d4eca 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -50,11 +50,14 @@ func (self *Env) Difficulty() *big.Int { return self.difficulty } func (self *Env) BlockHash() []byte { return nil } func (self *Env) State() *ethstate.State { return self.state } func (self *Env) GasLimit() *big.Int { return self.gasLimit } +func (self *Env) Transfer(from, to vm.Account, amount *big.Int) error { + return nil +} func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int, error) { address := FromHex(exec["address"]) caller := state.GetOrNewStateObject(FromHex(exec["caller"])) - caller.Balance = ethutil.Big(exec["value"]) + caller.SetBalance(ethutil.Big(exec["value"])) evm := vm.New(NewEnvFromMap(state, env, exec), vm.DebugVmTy) -- cgit v1.2.3 From 29b8a0bc5ffa7a674a06a211e1c8bdd1b6ed07b1 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 23 Oct 2014 01:01:26 +0200 Subject: Updated the VM & VM tests * Stack Error shouldn't revert to previous state * Updated VM Test tool * Added Transfer method to VM Env --- tests/helper/vm.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'tests/helper') diff --git a/tests/helper/vm.go b/tests/helper/vm.go index 06c3d4eca..f70ce48a6 100644 --- a/tests/helper/vm.go +++ b/tests/helper/vm.go @@ -51,17 +51,16 @@ func (self *Env) BlockHash() []byte { return nil } func (self *Env) State() *ethstate.State { return self.state } func (self *Env) GasLimit() *big.Int { return self.gasLimit } func (self *Env) Transfer(from, to vm.Account, amount *big.Int) error { - return nil + return vm.Transfer(from, to, amount) } func RunVm(state *ethstate.State, env, exec map[string]string) ([]byte, *big.Int, error) { address := FromHex(exec["address"]) caller := state.GetOrNewStateObject(FromHex(exec["caller"])) - caller.SetBalance(ethutil.Big(exec["value"])) evm := vm.New(NewEnvFromMap(state, env, exec), vm.DebugVmTy) - execution := vm.NewExecution(evm, address, FromHex(exec["data"]), ethutil.Big(exec["gas"]), ethutil.Big(exec["gasPrice"]), ethutil.Big(exec["value"])) + execution.SkipTransfer = true ret, err := execution.Exec(address, caller) return ret, execution.Gas, err -- cgit v1.2.3