Working on test suite
This commit is contained in:
		
							parent
							
								
									3d177be73e
								
							
						
					
					
						commit
						266d212094
					
				
							
								
								
									
										11
									
								
								tests/helper/common.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tests/helper/common.go
									
									
									
									
									
										Normal file
									
								
							| @ -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) | ||||
| } | ||||
							
								
								
									
										24
									
								
								tests/helper/http.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								tests/helper/http.go
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| } | ||||
							
								
								
									
										15
									
								
								tests/helper/init.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								tests/helper/init.go
									
									
									
									
									
										Normal file
									
								
							| @ -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", "") | ||||
| } | ||||
							
								
								
									
										31
									
								
								tests/helper/trie.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								tests/helper/trie.go
									
									
									
									
									
										Normal file
									
								
							| @ -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, "") | ||||
| } | ||||
							
								
								
									
										66
									
								
								tests/helper/vm.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								tests/helper/vm.go
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
| } | ||||
							
								
								
									
										0
									
								
								tests/vm/.ethtest
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								tests/vm/.ethtest
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										81
									
								
								tests/vm/gh_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								tests/vm/gh_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | ||||
| package ethvm | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"log" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/ethereum/eth-go/ethstate" | ||||
| 	"github.com/ethereum/eth-go/ethutil" | ||||
| 	"github.com/ethereum/eth-go/tests/helper" | ||||
| ) | ||||
| 
 | ||||
| type Account struct { | ||||
| 	Balance string | ||||
| 	Code    string | ||||
| 	Nonce   string | ||||
| 	Storage map[string]string | ||||
| } | ||||
| 
 | ||||
| func StateObjectFromAccount(addr string, account Account) *ethstate.StateObject { | ||||
| 	obj := ethstate.NewStateObject(ethutil.Hex2Bytes(addr)) | ||||
| 	obj.Balance = ethutil.Big(account.Balance) | ||||
| 
 | ||||
| 	if ethutil.IsHex(account.Code) { | ||||
| 		account.Code = account.Code[2:] | ||||
| 	} | ||||
| 	obj.Code = ethutil.Hex2Bytes(account.Code) | ||||
| 	obj.Nonce = ethutil.Big(account.Nonce).Uint64() | ||||
| 
 | ||||
| 	return obj | ||||
| } | ||||
| 
 | ||||
| type VmTest struct { | ||||
| 	Callcreates interface{} | ||||
| 	Env         map[string]string | ||||
| 	Exec        map[string]string | ||||
| 	Gas         string | ||||
| 	Out         string | ||||
| 	Post        map[string]Account | ||||
| 	Pre         map[string]Account | ||||
| } | ||||
| 
 | ||||
| func TestRemote(t *testing.T) { | ||||
| 	tests := make(map[string]VmTest) | ||||
| 	err := helper.CreateTests("https://raw.githubusercontent.com/ethereum/tests/master/vmtests/vmSha3Test.json", &tests) | ||||
| 	if err != nil { | ||||
| 		log.Fatal(err) | ||||
| 	} | ||||
| 
 | ||||
| 	for name, test := range tests { | ||||
| 		state := ethstate.New(helper.NewTrie()) | ||||
| 		for addr, account := range test.Pre { | ||||
| 			obj := StateObjectFromAccount(addr, account) | ||||
| 			state.SetStateObject(obj) | ||||
| 		} | ||||
| 
 | ||||
| 		ret, gas := helper.RunVm(state, test.Env, test.Exec) | ||||
| 
 | ||||
| 		rexp := helper.FromHex(test.Out) | ||||
| 		if bytes.Compare(rexp, ret) != 0 { | ||||
| 			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) | ||||
| 		} | ||||
| 
 | ||||
| 		for addr, account := range test.Post { | ||||
| 			obj := state.GetStateObject(helper.FromHex(addr)) | ||||
| 			for addr, value := range account.Storage { | ||||
| 				v := obj.GetStorage(ethutil.BigD(helper.FromHex(addr))).Bytes() | ||||
| 				vexp := helper.FromHex(value) | ||||
| 
 | ||||
| 				if bytes.Compare(v, vexp) != 0 { | ||||
| 					t.Errorf("%s's : %s storage failed. Expected %x, get %x\n", name, addr, vexp, v) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user